Chương 3: THIẾT KẾ CHUỖI CUNG ỨNG BẰNG GIẢI THUẬT DI TRUYỀN
3.2. Thuật giải di truyền giải bài toán thiết kế chuỗi cung ứng
3.2.3 Các toán tử di truyền
Toán tử lai ghép được thực hiện để tìm ra không gian giải pháp mới bằng cách hoán đổi của chuỗi giữa các cặp bố mẹ được lựa chọn. Trong toán tử này, mỗi phân đoạn của con cái được lựa chọn một cách ngẫu nhiên với xác suất bằng nhau giữa các phân đoạn tương ứng của bố mẹ. Như thấy trong hình 7, toán tử nối đã tận dụng từ một mặt nạ nhị phân, chiều dài của nó bằng số giai đoạn trong chuỗi cung ứng.
Trong khi “0” có nghĩa là cặp bố mẹ đầu tiên sẽ chuyển nguồn gen của nó cho con cái, “1” có nghĩa là con cái sẽ lấy nguồn gen từ cặp bố mẹ thứ hai cho phân đoạn tương ứng. Toán tử nối này có xu hướng bảo tồn các phân đoạn gen tốt của cả hai cặp bố mẹ
Hình 7: Minh họa toán tử nối
Hình 8: Minh họa toán tử đột biến b) Đột biến
Toán tử đột biết sự đột biến được sử dụng để ngăn chặn chuỗi hội tụ sớm và khám phá ra không gian giải pháp mới. tuy nhiên, không giống như crossover, sự đột biến thường được dùng bằng cách sửa đổi gen trong phạm vi một cá thể. Trong toán tử này, trước tiên, một quyết định về những phân đoạn sẽ được làm đột biến được đưa ra với xác suất 0.5 và sau đó chọn những phân đoạn được đột biến. Vì trong cá thể bao gồm hai cấu trúc mã hóa khác nhau, sự đột biến trên các cấu trúc là cũng khác nhau. Toán tử hoán đổi (swap) được sử dụng cho hai phân đoạn đầu tiên tại nơi mà sự mã hóa dựa trên độ ưu tiên được sử dụng. Toán tử này chọn lựa hai gen từ phân đoạn tương ứng và trao đổi vị trí của chúng. Toán tử đột biến quy ước được sử dụng cho phân đoạn cuối cùng của cá thể. Trong toán tử này, giá trị gen được lựa chọn ngẫu nhiên sẽ được thay thế bởi một giá trị mới nằm trong khoảng giữa 1 và số lượng trung tâm phân phối ngoại trừ giá trị hiện tại của nó.
c) Sự lựa chọn
Trong GA được đề xuất, quần thể ban đầu được sinh ra ngẫu nhiên và tập hợp tối ưu hóa Pareto được tạo ra bởi các giải pháp không trội trong quần thể ban đầu.
Tập hợp này được cập nhật bằng cách các cá thể mới đạt tới các toán tử di truyền tại mỗi thế hệ. Là một kỹ thuật có chọn lọc, chúng ta đã điều chỉnh chiến lược chọn lựa (+). Trong chiến lược này, và thể hiện số bố mẹ và con cái cấu thành nên một vùng tiến hóa trong thế hệ hiện tại và cạnh tranh với những vùng đang tồn tại. Sau khi lựa chọn ngẫu nhiên hai cá thể trong tập hợp tối ưu Pareto, phần còn lại của quần thể được lấp đầy bởi ( - 2) các cá thể khác biệt tốt nhất được lựa chọn từ vùng tiến hóa. Nếu không có sẵn các cá thể khác nhau, vùng trống của quần thể sẽ lấp đầy với các cá thể được phát sinh ngẫu nhiên. Thêm đó, chúng ta đã tận dụng một chiến lược phân hóa để gia tăng khả năng tìm kiếm các giải pháp tối ưu Pareto tốt hơn của GA
được đề xuất. Chiến lược này được dựa trên sự khởi động lại của việc tìm kiếm di truyền. Nếu tập giải pháp tối ưu Pareto không được cập nhật trong những sự di chuyển cuối cùng (số lượng của sự sinh ra/5 , như trong nghiên cứu của chúng ta) thì quần thể sẽ được thiết lập lại. Trong khi 10% của quần thể được lấp đầy bởi các giải pháp không chiếm ưu thế được chọn lựa ngẫu nhiên từ tập giải pháp tối ưu Pareto thì các giải pháp di truyền ngẫu nhiên được lập ra từ phần còn lại của quần thể. Nếu không có đủ các giải pháp không ưu thế trong tập tối ưu hóa Pareto để lấp đầy 10%
quần thể thì tất cả các giải pháp không ưu thế sẽ được sử dụng trong một quần thể mới.
KẾT LUẬN VÀ ĐỀ XUẤT Trong luận văn này, chúng tôi đã trình bày được
o Tổng quan về chuỗi cung ứng bao gồm các khái niệm cơ bản liên quan, quản trị chuỗi cung ứng và các cách tiếp cận để giải bài toán.
o Phát biểu bài toán dưới dạng chương trình nguyên phi tuyến hỗn tạp và chi tiết việc áp dụng giải thuật di truyền để giải bài toán.
Hướng phát triển trong tương lai
o Thuật giải di truyền đạt được hiệu quả tốt đối với bài toán tối ưu hóa đa mục tiêu trong việc thiết kế chuỗi cung ứng. Tuy nhiên, quá trình lai ghép và đột biến của giải thuật này gây tốn thời gian thực hiện chương trình. Vì vậy, trong tương lai, cách tiếp cận dựa trên kỹ thuật tối ưu hóa theo nhóm bầy (PSO- Particle Swarm Optimization) nên được sử dụng.
o Các kỹ thuật khác như Tabu Search cũng nên được sử dụng để có thể dành được các giải pháp tối ưu đa mục tiêu Pareto.
TÀI LIỆU THAM KHẢO
[1] Altiparmak. F, Gen & Lin (2005). “A genetic algorithm for supply chain network design,” In Proceeding of the 35th International Conference on Computers and Industrial Engineering.
[2] Thomas, D. J., & Griffin, P. M. (1996), "Coordinated supply chain management,” European Journal of Operational Research, No.94, pp.1–115.
[3] Vidal, C. J., & Goetschalckx, M. (1997), “Strategic production-distribution models: a critical review with emphasis on global supply chain model,” European Journal of Operational Research, No.98, pp.1–18.
[4] Beamon, B. M. (1998), “Supply chain design and analysis: models and method,” International Journal of Production Economics, No.55, pp.281–294.
[5] Jayaraman, V., & Pirkul, H. (2001), “Planning and coordination of production and distribution facilities for multiple commodities,” European Journal of Operational Research, No.133, pp.394–408.
[6] Chan, F. T. S., Chung, S. H., & Wadhwa, S. (2004), “A hybrid genetic algorithm for production and distribution,” Omega, No.33, pp.345–355.
[7] Chen, C., & Lee, W. (2004), “Multi-objective optimization of multi- echelon supply chain networks with uncertain product demands and prices,”
Computers and Chemical Engineering, No.28, pp.1131–1144.
[8] Erol, I., & Ferrell, W. G. Jr., (2004), “A methodology to support decision making across the supply chain of an industrial distributor,” International Journal of Production Economics, No. 89, pp.119–129.
[9] Chankong, V., & Haimes, Y. Y. (1983), “Multiobjective decision making theory and methodology”. NewYork: Elsevier.
[10] Ceollo, C. A. C., Van Veldhuizen, D. A., & Lamont, G. B. (2002),
“Evolutionary algorithms for solving multi-objective problems,” New York:
Kluwer.
[11] Deb, K. (2001), “Multi-objective optimization using evolutionary algorithms,” Chichester: Wiley.
[12] Gen, M., & Cheng, R. (2000), “Genetic algorithms and engineering optimization,” New York: Wiley.
[13] Michalewicz, Z., Vignaux, G. A., & Hobbs, M. (1991), “A non- standard genetic algorithm for the nonlinear transportation problem,” ORSA Journal on Computing, No.3, pp.307–316.
[14] Murata, T., Ishibuchi, H., & Tanaka, H. (1996), “Multi-objective genetic algorithm and its applications to flowshop scheduling,” Computers and Industrial Engineering, Vol. 4, No.30, pp.957–968.
[15] Zhou, G., & Gen, M. (1999), “Genetic algorithm approach on multi- criteria minimum spanning tree problem,” European Journal of Operational Research, No.114, pp.141–152.
PHỤ LỤC
Giả sử ma trận giá của quá trình vận tải được chứa trong tệp matran.txt, dòng đầu ghi số lượng nguồn (s) và số lượng đích (d). Các dòng tiếp theo ghi giá việc phân phối một đơn vị dữ liệu từ một nguồn i (thuộc s) tới nguồn j (thuộc d) tương ứng. Khả năng phân phối của các nguồn được ghi trong tệp nguon.txt và yêu cầu của các đích ghi trong tệp dich.txt; độ ưu tiên của một cá thể được lưu trong tệp priority.txt; Khi đó, chương trình C sau cho phép xây dựng quá trình vận tải (nút nguồn nào phục vụ đích nào với số lượng là bao nhiêu):
# include "stdio.h"
# include "conio.h"
# include "stdlib.h"
# include "string.h"
# define SOURCE 10 // Số lượng tối đa các nguồn
# define DEPOT 20 // Số lượng tối đa các đích
int cost[SOURCE][DEPOT]; // Ma trận giá int gen[SOURCE + DEPOT]; // cá thể
int trans[SOURCE][DEPOT]; // Ma trận ghi kết quả
int nguon[SOURCE], dich[DEPOT]; // khả năng của nguồn và yêu //cầu của các đích
int s, d; // số lượng nguồn và đích thực tế ; int doctep(){
FILE *f;
int i,j;
int x;
// đọc ma trận giá
f = fopen("matran.txt","r+t");
fscanf(f,"%d%d",&s,&d);
for (i=0;i<s;i++)
for (j=0;j<d; j++){
fscanf(f,"%d",&x);
}
fclose(f);
// Đọc khả năng của cá nguồn f = fopen("nguon.txt","r+t");
for (i=0;i<s;i++){
fscanf(f,"%d",&x);
nguon[i]=x;
}
fclose(f);
// đọc yêu cầu của các đích f = fopen("dich.txt","r+t");
for (i=0;i<d;i++){
fscanf(f,"%d",&x);
dich[i]=x;
}
fclose(f);
// đọc giá trị của cá thể
f = fopen("priority.txt","r+t");
for (i=0;i<s+d;i++){
fscanf(f,"%d",&x);
gen[i]=x;
}
fclose(f);
}
int intep(){
int i,j;
printf("Ma tran gia: \n");
for (i=0;i<s;i++){
for (j=0;j<d; j++)
printf("%d\t",cost[i][j]);
printf("\n");
}
printf("\nKha nang cua nguon: \n");
for (i=0;i<s;i++){
printf("%d\t",nguon[i]);
}
printf("\nYeu cau cua dich: \n");
for (i=0;i<d;i++){
printf("%d\t",dich[i]);
}
printf("\nGia tri cua gen: \n");
for (i=0;i<s+d;i++){
printf("%d\t",gen[i]);
printf("\nMa tran mo ta cay nguon va dich: \n");
for (i=0;i<s;i++){
for (j=0;j<d; j++)
printf("%d\t",trans[i][j]);
printf("\n");
} }
// Trả lại nguồn hoặc đích có độ ưu tiên cao nhất int highest_priority(){
int j, m =0;
for (j=1;j<s+d;j++)
if (gen[j] > gen[m]) m =j;
return m;
}
// Đích kết hợp với nguồn i có giá thấp nhất int min_cost_source_i(int i){
int m=0,j;
for (j=1;j<d;j++)
if (cost[i][j] < cost[i][m] && dich[j] > 0) m =j;
return m;
}
// Nguồn kết hợp với đích i có giá thấp nhất int min_cost_dest_i(int i){
int m=0,j;
for (j=1;j<s;j++)
if (cost[j][i] < cost[m][i] && nguon[j] > 0) m =j;
return m;
}
// Điều kiện dừng
int sum_source_depot(){
int t=0, i;
for (i=0;i<s;i++) t = t + nguon[i];
for (i=0;i<d;i++) t = t + dich[i];
return t;
}
// Giải mã gen int decoding (){
int i,j,tmp, node_source, node_dest, trongso;
// tìm nút nguồn và đích tmp = highest_priority();
if (tmp< 3){
node_source = tmp;
node_dest = min_cost_source_i(node_source);
} else{
node_dest = tmp-s;
node_source = min_cost_dest_i(node_dest);
}
// Tìm giá trị của cung
trongso = nguon[node_source];
if (dich[node_dest] < trongso) trongso = dich[node_dest];
if (trongso==0) return 0;
trans[node_source][node_dest] = trongso;
//cập nhật
nguon[node_source] = nguon[node_source] -trongso;
dich[node_dest] = dich[node_dest] - trongso;