- LNB )
4.1.3 Lựa chọn thông số của các thuật toán
Các phương pháp mã hóa cá thể: Phương pháp mã hóa vectơ đặc trưng, Phương pháp mã hóa số Prufer,
Phương pháp mã hóa thiên kiến cạnh (P11), Phương pháp mã hóa thiên kiến nút (P2 1), Phương pháp thiên kiến cạnh và nút (P11;P2 1), Phương pháp mã hóa NetKey,
Phương pháp mã hóa tập cạnh không heuristic. Kích thước quần thể như sau:
Bộ dữ liệu n N Số thế hệ tối đa
Palmer6 6 16 200 Palmer12 12 300 200 Palmer24 24 800 200 Berry6 6 16 200 Berry35u 35 2000 200 Berry35 35 300 200 Raidl10 10 70 200 Raidl20 20 800 200 Rothfaul1 16 300 200 Rothfaul2 15 300 200
Bảng 4.2. Kích thước quần thể sử dụng đối với các bộ dữ liệu
94 o n: số đỉnh.
o N: kích thước quần thể. Tỷ lệ lai ghép: 80%.
Tỷ lệ đột biến: 6%.
Điều kiện dừng: khi độ lệch chuẩn của quần thể hiện tại bằng 0 (các cá thể trong quần thể giống nhau) hoặc số thế hệ hiện tại đạt chỉ số thế hệ tối đa.
4.1.4 Chƣơng trình thực nghiệm
Các chức năng chính của chƣơng trình:
Chương trình được viết bằng ngôn ngữ lập trình Visual Studio C++ 2006. Chương trình thực nghiệm bao gồm các chức năng cơ bản:
Chương trình cho phép đọc dữ liệu từ file và thiết lập tham số số lần thực hiện giải thuật di truyền đối với từng phương pháp mã hóa cá thể.
Bên cạnh đó, chương trình cho phép người sử dụng lựa chọn phương pháp mã hóa cá thể, điều chỉnh kích thước của quần thể và số thế hệ tối đa.
Chương trình cho phép người sử dụng điều chỉnh các thông số di truyền như: phần trăm lai ghép, phần trăm đột biến và giá trị k trong phương pháp chọn lọc cá thể theo trận đấu.
Chương trình hiển thị kết quả tốt nhất và thời gian tương ứng sau mỗi lần thực hiện. Ngoài ra, các giá trị thông số và kết quả tương ứng trong mỗi lần thực hiện sẽ được ghi vào file ở thư mục Result để phục vụ thống kê kết quả.
Chương trình hỗ trợ chức năng tự thoát khỏi hệ điều hành khi chương trình kết thúc.
Các lớp của chƣơng trình:
Chương trình thực nghiệm được phát triển trên ngôn ngữ lập trình hướng đối tượng C++ bao gồm một số lớp cơ bản:
95
Lớp Cpoints
Lớp CPoints bao gồm các thuộc tính và phương thức trên tập đỉnh của đồ thị. Mỗi một tập đỉnh của đồ thị sẽ được xử lý bằng lớp này. Lớp gồm 2 thuộc tính là:
+ int m_iNumVertice: số đỉnh của đồ thị.
+ Point m_pptSetVertices[]: tập các đỉnh của đồ thị, là một mảng gồm Num_Vert đỉnh, mỗi đỉnh có kiếu dữ liệu là point.
Các phương thức trên lớp gồm:
+ void CPoints::GetEuclideData(CString File_name, int iSet): dữ liệu vào được đọc từ các file trong bộ test, tên file tùy chọn File_name và bộ test thứ mấy trong file _Set. Phương thức lấy số đỉnh từ file lưu vào m_iNumVertice, lưu các đỉnh vào mảng m_pptSetVertices với các phần tử có kiểu là point. Phương thức này áp dụng đối với bộ dữ liệu Rothfaul1 và Rothfaul2.
+ void CPoints::GetNonEuclideData(CString File_name, int iSet): tương tự với phương thức GetEuclideData, các giá trị của ma trận khoảng cách và ma trận nhu cầu được đọc trực tiếp từ file.
+ double CPoints::Distance(int i, int j): phương thức tính khoảng các Euclide giữa hai đỉnh bất kỳ của đồ thị. Hàm trả về một số thực chính là khoảng cách đó.
Lớp CBDSpanning Trees
Lớp CBDSpanningTree bao gồm các thuộc tính và phương thức trên cây khung của một đồ thị G. Như đã nói, đồ thị G ở đây ta chỉ xét đến đồ thị Euclide đầy đủ, đặc trưng bởi tập đỉnh có kiểu là CPoints. Các thuộc tính của lớp CBDSpanningTree:
+ CPoints ptsSetVertice: tập đỉnh của cây, là đối tượng của lớp CPoints. + int *parent: tập các cạnh của cây khung mã hóa theo danh sách cạnh. + double dbTreeWeight: trọng số của cây.
96
+ int fitness: giá trị thích nghi của cây trong quần thể.
Các phương thức của lớp để khởi tạo quần thể theo các phương pháp mã hóa cá thể gồm:
void GenerateNetKeys(double **ppdbDistance, double **g_ppdbDemand, int iNumVertice): tạo một cá thể theo phương pháp mã hóa NetKey.
void GenerateNodeBias(double **ppdbDistance, double **g_ppdbDemand, int iNumVertice): tạo một cá thể theo phương pháp mã hóa thiên kiến nút.
void GenerateLinkBias(double **ppdbDistance, double **g_ppdbDemand, int iNumVertice): tạo một cá thể theo phương pháp mã hóa thiên kiến cạnh.
void GenerateNodeLinkBias(double **ppdbDistance, double **g_ppdbDemand, int iNumVertice): tạo một cá thể theo phương pháp mã hóa thiên kiến cạnh và nút.
void GenerateEdgeSet(double **ppdbDistance, double **g_ppdbDemand, int iNumVertice): tạo một cá thể theo phương pháp mã hóa tập cạnh.
void GenerateCharacVetor(double **ppdbDistance, double **g_ppdbDemand, int iNumVertice) : tạo một cá thể theo phương pháp mã hóa vectơ đặc trưng.
void GeneratePruferNumber(double **ppdbDistance, double **g_ppdbDemand, int iNumVertice): tạo một cá thể theo phương pháp mã hóa số Prufer.
Các phương thức tái tạo và tính giá trị cây khung từ biểu diễn mã hóa tương ứng:
double ConstructingTreeNetKey(double **ppdbDistance, double **g_ppdbDemand, int iNumVertice): tái tạo và tính giá trị cây khung từ cá thể được mã hóa theo phương pháp NetKey.
97
double ConsAndEvalTreeNodeBias(double **ppdbDistance, double **g_ppdbDemand, int iNumVertice): tái tạo và tính giá trị cây khung từ cá thể được mã hóa theo phương pháp thiên kiến nút.
double ConsAndEvalTreeLinkBias(double **ppdbDistance, double **g_ppdbDemand, int iNum): tái tạo và tính giá trị cây khung từ cá thể được mã hóa theo phương pháp thiên kiến cạnh.
double ConsAndEvalTreeNodeLinkBias(double **ppdbDistance, double **g_ppdbDemand, int iNum): tái tạo và tính giá trị cây khung từ cá thể được mã hóa theo phương pháp thiên kiến cạnh và nút.
double ConsAndEvalTreeEdgeSet(double **ppdbDistance, double **g_ppdbDemand, int iNumVertice): tái tạo và tính giá trị cây khung từ cá thể được mã hóa theo phương pháp tập cạnh.
double ConsAndEvalTreeCV(double **ppdbDistance, double **g_ppdbDemand, int iNumVertice): tái tạo và tính giá trị cây khung từ cá thể được mã hóa theo phương pháp vectơ đặc trưng.
double ConsAndEvalTreePruferNumber(double **ppdbDistance, double **g_ppdbDemand, int iNumVertice): tái tạo và tính giá trị cây khung từ cá thể được mã hóa theo phương pháp số Prufer.
Lớp OCSTDlg
Các thuộc tính của lớp OCSTDlg bao gồm: + m_txtSet: thứ tự của bộ test
+ m_editDataPath: đường dẫn dữ liệu
+ m_editDiameter: đường kính tối đa cây khung + m_editPop: kích thước quần thể.
98
+ m_editTime: thời gian thực hiện chương trình + m_editBestTree: lời giải tốt nhất
+ m_CrossoverPercent: tỷ lệ lai ghép + m_MutationPercent: tỷ lệ đột biến
Đối với mỗi phương pháp mã hóa sẽ có các phương thức tương ứng:
void Solve (int m_editDiameter, int m_editPop, int m_editMaxPop, int i ter, CBDSpanningTree *bestTree): phương thức chính thực hiện giải thuật di truyền sử dụng phương pháp mã hóa cá thể tương ứng.
void BuildPop (CBDSpanningTree *P, int iDiameter, int iPop, int iNumVertice): khởi tạo quần thể theo phương pháp mã hóa cá thể tương ứng.
int Selection (CBDSpanningTree *T, int iPop): toán tử chọn lọc cá thể. void Crossover (CBDSpanningTree *T, CBDSpanningTree T1, CBDSpanningTree T2, int iNumVertice): toán tử lai ghép cá thể theo phương pháp mã hóa cá thể tương ứng.
void Mutation (CBDSpanningTree *T, int iNumVertice): toán tử đột biến cá thể theo phương pháp mã hóa cá thể tương ứng.
Hƣớng dẫn sử dụng chƣơng trình:
Để bắt đầu sử dụng chương trình, người sử dụng cần nhập đường dẫn dữ liệu trong khối 1 được minh họa ở hình 4.1. Bộ dữ liệu phải có cấu trúc như miêu tả mục 4.1.1. Chương trình thiết lập đường dẫn mặc định là \\Test\Berry6.oct.
Sau khi quá trình đọc dữ liệu, người sử dụng nhập giá trị kích thước quần thể và số thế hệ tối đa ở khối 2 được minh họa ở hình 4.1. Giá trị mặc định của kích thước quần thể là 10 và của số thế hệ tối đa là 1000.
Ở khối thứ 3, người sử dụng lựa chọn phương pháp mã hóa cá thể tương ứng. Phương pháp mã hóa mã hóa mặc định là phương pháp mã hóa véctơ đặc trưng.
99
Để bắt đầu chạy chương trình, người sử dụng cần nhập tham số cho toán tử lựa chọn cá thể, phần trăm lai ghép và phần trăm đột biến. Giá trị mặc định cùa toán tử lai ghép là 80% và toán tử đột biến là 6%.
Sau mỗi lần thực hiện, giá của cây khung tốt nhất và thời gian thực hiện tương ứng sẽ được hiển thị trong khối 5 của hình minh họa 4.1.
Nếu người sử dụng muốn chương trình thực hiện thoát khỏi hệ điều hành sau khi hoàn thành thì đánh dấu lựa chọn trong ô “Auto Shutdown”.
Hình 4.1. Giao diện chương trình thực nghiệm
4.2 Kết quả thực nghiệm 4.2.1 Bảng kết quả thực nghiệm
Mỗi phương pháp mã hóa sẽ được chạy 20 lần đối với từng bộ dữ liệu để thực hiện thống kê kết quả.
100
Kết quả tính toán được trình bày ở bảng 4.3, trong đó sử dụng các ký hiệu sau:
Cb tes : giá trị hàm mục tiêu tại phương án tốt nhất tìm được. p = (Cb tes Copt) /Copt100%
o Copt: giá trị tối ưu.
Cavg: Giá trị trung bình của các giá trị hàm mục tiêu tại phương án tốt nhất tìm được.
Gap(Cavg Copt) /Copt100%
Std: Độ lệch chuẩn của các giá trị hàm mục tiêu tại phương án tốt nhất tìm được.
Gen: Giá trị trung bình của chỉ số thế hệ tại đó đạt được kết quả tốt nhất. Time: thời gian thực hiện của thuật toán (tính theo giây).
Bộ dữ liệu
P.pháp
mã hóa Cb tes p Cavg Gap Std Gen Time
P a lm e r 6 C o pt = 693180 CV 693180 0,00 708743,60 2,25 1155,41 38,40 0,20 Prufer 723349 4,35 723333,33 4,35 40337,57 0,00 1,00 NB 693180 0,00 693180,00 0,00 0,00 1,40 0,20 LB 693180 0,00 696162,00 0,43 0,00 13,20 0,25 LNB 693180 0,00 693180,00 0,00 0,00 47,20 0,40 NetKey 693180 0,00 723654,40 4,40 1155,41 16,20 0,20 EdgeSet 693180 0,00 693180,00 0,00 0,00 23,00 0,20 P a lm e r 1 2 Co pt = 3428509 CV 3431693 0,09 3555169,40 3,69 44118,51 64,40 19,00 Prufer 3698788 7,88 3698675,51 7,88 447488,46 0,00 24,00 NB 3428509 0,00 3428509,00 0,00 0,00 0,00 18,80 LB 3428509 0,00 3429145,80 0,02 0,00 44,00 19,80 LNB 3428509 0,00 3446290,80 0,52 20819,34 67,20 20,40 NetKey 3428509 0,00 3474183,60 1,33 20819,34 27,80 23,60 EdgeSet 4171078 21,66 4212014,80 22,85 28817,43 131,60 18,80 P a l CV m e r 1161808 2 4 C o pt6,92 = 1 1188144,00 0 8 6 6 5 9,34 6 23457,56 148,40 274,20
101 Prufer 1125116 3,54 1125123,62 3,54 326951,30 0,00 207,40 NB 2433136 123,91 2765160,40 154,47 204987,43 87,60 230,80 LB 1102278 1,44 1128824,00 3,88 25068,35 140,40 289,20 LNB 1197978 10,24 1495898,80 37,66 33297,66 165,00 290,40 NetKey 1100356 1,26 1178238,40 8,43 28814,60 67,00 455,60 EdgeSet 4056796 273,33 4098885,20 277,20 17199,67 86,00 333,20 R a id l1 0 Co pt = 5 3 6 7 4 CV 53674 0,00 54646,60 1,81 0,00 17,00 3,20 Prufer 79437 48,00 79437,52 48,00 16186,02 0,00 20,00 NB 53674 0,00 53674,00 0,00 0,00 0,80 2,80 LB 53674 0,00 53922,40 0,46 878,23 20,20 3,20 LNB 53674 0,00 53674,00 0,00 0,00 16,80 3,20 NetKey 53674 0,00 56815,40 5,85 6321,53 31,00 3,20 EdgeSet 60217 12,19 61417,00 14,43 692,96 12,60 3,40 R a id l2 0 (1 5 7 5 7 0 ) CV 173222 9,93 186121,20 1,81 20079,71 96,20 162,40 Prufer 259191 64,49 259186,89 64,49 68396,09 0,00 229,00 NB 157570 0,00 157570,00 0,00 0,00 23,40 181,00 LB 157570 0,00 158532,80 0,61 0,00 22,40 176,80 LNB 157570 0,00 161776,60 2,67 5009,85 40,40 193,40 NetKey 164544 4,43 183889,00 16,70 1332,90 43,60 253,40 EdgeSet 471453 199,20 510635,00 224,07 24777,02 4,80 189,60 B e r r y 6 Co pt = 5 3 4 CV 534 0,00 610,40 14,31 0,00 0,20 44,60 Prufer 579 8,43 579,02 8,43 14,76 0,00 1,00 NB 534 0,00 534,00 0,00 0,00 0,20 0,40 LB 534 0,00 534,00 0,00 0,00 0,40 0,20 LNB 534 0,00 534,00 0,00 0,00 0,60 0,40 NetKey 534 0,00 585,60 9,66 4,24 6,40 0,20 EdgeSet 534 0,00 534,00 0,00 0,00 62,60 0,20 B e r r y 3 5 Co pt = 1 6 9 1 5 CV 25615 51,43 33747,80 99,51 4611,75 188,40 295,00 Prufer 21931 29,65 22796,35 34,77 25092,39 0,00 248,20 NB 16915 0,00 16915,00 0,00 0,00 57,20 313,60 LB 16915 0,00 17283,00 2,18 192,33 100,80 341,20 LNB 21353 26,24 21781,40 28,77 461,03 147,60 308,20 NetKey 33693 99,19 42561,80 151,62 6221,13 53,40 599,20 EdgeSet 137435 712,50 143566,60 748,75 1702,71 1,60 331,00 B e r r y35u C o pt = 1627 3 CV 22638 39,11 24004,40 47,51 1665,94 133,60 704,80 Prufer 22422 37,79 21571,49 32,56 4570,74 0,00 253,13
102 NB 21513 32,20 21513,00 32,20 0,00 0,00 362,00 LB 17480 7,42 18327,00 12,62 1267,14 166,00 1197,75 LNB 19587 20,37 22653,80 39,21 1748,68 154,20 1042,00 NetKey 17616 8,25 18556,00 14,03 193,04 83,25 1978,50 EdgeSet 22688 39,42 22881,80 40,61 118,09 1,40 1156,20 R o th fa u l1 Co pt = 60883 CV 77348 27,04 77348 27,04 0,00 23,20 12,60 Prufer 77364 27,07 77863 27,89 236,00 0,00 14,80 NB 77348 27,04 77348 27,04 0,00 4,60 36,80 LB 77752 27,71 78413,20 28,79 200,11 119,20 35,00 LNB 77348 27,04 77534,80 27,35 352,85 114,80 35,00 NetKey 77348 27,04 78006,60 28,13 1900,70 74,60 49,60 EdgeSet 90458 48,58 94477,80 55,18 7526,44 111,20 38,20 R o th fa u l2 Co pt = 58619 CV 64100 9,35 64100,00 9,35 0,00 7,80 18,80 Prufer 67481 15,12 66221 12,97 1960,00 0,00 19,20 NB 64100 9,35 64100,00 9,35 0,00 5,00 35,00 LB 64303 9,70 64866,60 10,66 53,74 114,40 32,40 LNB 64100 9,35 65938,60 12,49 2212,54 133,00 31,60 NetKey 64100 9,35 64100,00 9,35 0,00 56,40 34,40 EdgeSet 68336 16,58 77273,00 31,82 4604,68 117,00 30,40 Bảng 4.3. Bảng tổng hợp kết quả thực nghiệm.
Để làm rõ kết quả bảng 4.3, hình 4.2 thể hiện lời giải tốt nhất của các phương pháp mã hóa cá thể đối với từng bộ dữ liệu; hình 4.3 thể hiện giá trị trung bình của các lời giải tốt nhất của từng phương pháp mã hóa cá thể đối với từng bộ dữ liệu; hình 4.4 thể hiện giá trị Gap của từng phương pháp mã hóa cá thể đối với từng bộ dữ liệu và hình 4.5 thể hiện chỉ số thế hệ tại đó đạt kết quả tốt nhất của các phương pháp mã hóa cá thể đối với từng bộ dữ liệu.
103
Hình 4.2. Biểu đồ giá trị tốt nhất đạt được của các phương pháp mã hóa đối với các bộ dữ liệu.
Hình 4.3. Biểu đồ giá trị trung bình đạt được của các phương pháp mã hóa đối với các bộ dữ liệu.
104
Hình 4.4. Biểu đồ giá trị Gap qua các thế hệ của các phương pháp mã hóa đối với các bộ dữ liệu.
Hình 4.5. Biểu đồ thế hệ qua các thế hệ của các phương pháp mã hóa đối với các bộ dữ liệu.
105
4.4.2 Nhận xét kết quả thực nghiệm
Từ bảng kết quả 4.3 và hình 4.4-4.8, có thể thấy rằng:
GA sử dụng mã hóa Prufer có độ lệch chuẩn cao nên tính hội tụ thấp và không thể đạt được kết quả tối ưu ngay cả đối với các bộ dữ liệu nhỏ.
GA sử dụng mã hóa NetKey có chất lượng lời giải tốt hơn GA sử dụng mã hóa Prufer, mã hóa CV, mã hóa EgdeSet nhưng không tốt bằng GA sử dụng mã hóa LB, mã hóa NB và mã hóa LNB đối với các bộ dữ liệu khác nhau. Thông qua giá trị Gap có thể thấy rằng các lời giải GA sử dụng mã hóa
NetKey không phụ thuộc vào tính chất của lời giải tối ưu.
GA sử dụng mã hóa CV chỉ đạt được kết quả tốt ở các bộ dữ liệu có kích thước nhỏ nhưng số thệ hệ để đạt được kết quả tốt nhất là khá lớn. Đối với các bộ dữ liệu có kích thước lớn, GA sử dụng mã hóa CV có giá trị Gap nhỏ hơn so với GA sử dụng mã hóa Prufer và mã hóa EdgeSet nhưng lớn hơn so với GA sử dụng các mã hóa còn lại.
GA sừ dụng mã hóa NB, LB và LNB với giá trị P1 và P2 cho chất lượng lời giải tốt hơn so với các phương pháp mã hóa còn lại , đặc biệt với các bộ dữ liệu có giá trị tối ưu là gần với MST (Bộ dữ liệu Berry6, Berry35, Palmer6). Trong đó giá trị tốt nhất của GA sử dụng mã hóa LNB thường thuộc khoảng giá trị tốt nhất của GA sử dụng mã hóa NB và LB. Tuy nhiên số thế hệ để đạt được lời giải tốt nhất của GA sử dụng mã hóa LNB lớn hơn so với các phương pháp mã hóa còn lại.
GA sử dụng mã hóa EdgeSet không heuristic cho chất lượng lời giải tồi hơn các phương pháp còn lại và không phụ thuộc vào tính chất của giá trị tối ưu.
GA sử dụng mã hóa EdgeSet không heuristic có giá trị gap và độ lệch chuẩn lớn hơn so với các phương pháp khác. Do đó, GA sử dụng mã hóa EdgeSet có tính hội tụ thấp. Do tính hội tụ thấp nên thời gian và số thế hệ đạt được lời