Chương trình thử nghiệm được xây dựng được viết bằng ngôn ngữ C# cùng với bộ công cụ phát triển Visual Studio của Microsoft.
Để đơn giản cho thí nghiệm, thay vì input dữ liệu đầu vào dạng đồ thị, chương trình sẽ phát sinh tập các điểm ngẫu nhiên trên mặt phẳng, chi phí chính là khoảng cách giữa 2 điểm theo nguyên tắc càng ngắn càng tốt.
Giao diện chính của chương trình
Vùng bên trái bao gồm các nút điều khiển:
- Số lượng “input” (N) thành phố cần thử nghiệm (+, -). Maximum 100 thành phố. - Nút “Tạo ngẫu nhiên thành phố”: tạo mẫu đầu vào ngẫu nhiên vị trí các thành phố. - Nút “Tìm giải pháp”: gọi thực thi giải thuật di truyền. Chương trình sẽ chạy bằng thread con.
Vùng bên phải hiển thị đồ hoạ về đồ thị kết quả, cập nhật đồng thời với các thế hệ NST (lời giải) được tạo ra khi giải thuật thực thi.
- Đỉnh màu đỏ: thành phố xuất phát.
- Đỉnh màu tím và chu trình: lộ trình các thành phố người du lịch sẽ ghé thăm.
Hàm lai ghép và chọn lọc:
//chọn cá thể đầu mảng (tốt nhất) làm cá thể bố để lai ghép var bestSoFar = _populationWithDistances[0];
int halfCount = _populationWithDistances.Length / 2;
for(int i=0; i<halfCount; i++) {
// lai ghép
var parent = _populationWithDistances[i].Key;
var child1 = _Reproduce(parent);
var child2 = _Reproduce(parent);
var pair1 = new KeyValuePair<Location[], double>(child1,
Location.GetTotalDistance(_startLocation, child1));
var pair2 = new KeyValuePair<Location[], double>(child2,
Location.GetTotalDistance(_startLocation, child2));
_populationWithDistances[i*2] = pair1; _populationWithDistances[i*2 + 1] = pair2; }
// giữ lại cá thể bố, đặt vào cuối mảng
_populationWithDistances[_populationWithDistances.Length-1] = bestSoFar;
// chọn lọc bằng cách sắp xếp lại mảng cá thể, cho lần chạy tiếp theo
Array.Sort(_populationWithDistances, _sortDelegate);
Hàm đột biến:
//xác xuất đột biến là 10% cá thể của quần thể
int mutationCount = GetRandomValue(locations.Length/10) + 1;
for(int mutationIndex=0; mutationIndex<mutationCount; mutationIndex++) {
// chọn vị trí đột biến và loại đột biến (3) đối với nhiễm sắc thể int index1 = GetRandomValue(locations.Length);
int index2 = GetRandomValue(locations.Length-1);
if (index2 >= index1) index2++;
switch(GetRandomValue(3)) {
case 0: Location.SwapLocations(locations, index1, index2); break;
case 1: Location.MoveLocations(locations, index1, index2); break;
case 2: Location.ReverseRange(locations, index1, index2); break;
default: throw new InvalidOperationException(); }
}
Nhận xét kết quả thí nghiệm: đại đa số lời giải tìm được có dạng bao lồi của tập điểm (thành phố).
Kết quả minh họa 52 thành phố: