Chƣơng này phát biểu và mô tả lại bài toán tìm đƣờng TSP. Tìm hiểu thuật toán ACO tổng quát từ đó xây dựng thuật toán ACO áp dụng để giải bài toán TSP. Sử dụng ngôn ngữ lập trình hƣớng đối tƣợng Java để cài đặt chƣơng trình Demo giải quyết bài toán TSP nhằm tìm ra đƣờng đi ngắn nhất.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN 1. Kết quả đạt đƣợc trong luận văn
Luận văn đã trình bày một số kết quả nghiên cứu về Thuật toán tối ƣu đàn kiến ACO, các phiên bản của thuật toán ACO và ứng dụng thuật toán ACO vào bài toán TSP. Các kết quả bao gồm:
+ Phân tích hành vi của đàn kiến trong tự nhiên, từ đó mô phỏng hành vi thực thế của đàn kiến bằng đàn kiến nhân tạo và xây dựng giải pháp tìm đƣờng đi tối ƣu bằng phƣơng pháp xác xuất giữa các điểm mà kiến di chuyển qua dựa trên thông tin về độ dài đƣờng đi, thông tin heuristic và mùi pheromone mà các con kiến để lại trên đƣờng mà chúng di chuyển qua.
+ Trình bày phƣơng pháp tối ƣu hóa đàn kiến ACO, các thuật toán ACO-Metaheuristic: AC, ACS và MMAS. Phƣơng pháp cải tiến quy luật di chuyển của đàn kiến và quy luật cập nhật vết mùi pheromone từ đó đƣa ra ý kiến phân tích, đánh giá thuật toán ACO.
+ Ứng dụng thuật toán ACO để giải bài toán TSP: Phát biểu bài toán TSP; áp dụng thuật toán ACO trong TSP; xây dựng chƣơng trình demo bằng ngôn ngữ lập trình hƣớng đối tƣợng Java.
Hạn chế của luận văn:
- Luận văn chƣa trình bày đƣợc đầy đủ các biện pháp giải quyết bài toán dựa trên việc ứng dụng thuật toán ACO, chỉ mới thực hiện trên mô hình tuần tự, chƣa thực hiện trên mô hình song song.
- Nội dung áp dụng thuật toán ACO chỉ giới hạn ở bài toán TSP tĩnh (Static - TSP), chƣa áp dụng trên bài toán TSP động (Dynamic - TSP).
2. Hƣớng nghiên cứu tiếp theo
- Tiếp tục nghiên cứu thuật toán đàn kiến ACO và song song hóa thuật toán; đồng thời nghiên cứu thêm các thuật toán Metaheuristic khác để có cái nhìn tổng quát hơn về phƣơng pháp tối ƣu thuật toán.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
- Tiếp tục nghiên cứu một số thuật toán khác liên quan đến “Trí tuệ bầy đàn” (Intelligence Swarm): đàn chim, đàn cá, ...
- Cài đặt tiếp các chức năng còn thiếu trong chƣơng trình để có thể đƣa ứng dụng triển khai vào các lĩnh vực cụ thể.
Do trình độ và khả năng nghiên cứu của bản thân còn hạn chế nên luận văn không tránh khỏi những thiếu sót, Em rất mong nhận đƣợc sự đóng góp ý kiến của các thầy cô, bạn bè, đồng nghiệp để luận văn đƣợc hoàn thiện hơn.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
TÀI LIỆU THAM KHẢO Tài liệu Tiếng Việt
[1] Đào Duy Bình, Ứng dụng giải thuật Meta-Heuristic trong bài toán tìm đường đi ngắn nhất,, Tạp chí Khoa học & Công nghệ - ĐH Đà Nẵng - SỐ 5(40), 2010.
[2] Châu Mạnh Quang, Phương pháp Q-Learning và ứng dụng của phương pháp này trong bài toán tìm đường, Tạp chí khoa học Giao Thông Vận Tải, Năm 2010.
[3] Phạm Hồng Luân, Dƣơng Thành Nhân, Nghiên cứu ứng dụng thuật toán ACO (Ant Colony Optimization) tối ưu thời gian và chi phí cho dự án xây dựng, Tạp chí phát triển KH&CN, TẬP 13, SỐ Q1 - 2010.
Tài liệu Tiếng Anh
[4] Marco Dorigo and Thomas Stützle, Ant Conoly Optimization, A Bradford Book, The MIT Press, Cambridge, Massachusetts, London, England, 2004.
[5] Marco Dorigo and ThomasStützle, The Ant Colony Optimization Metaheuristic: Algorithms, applications and Advances, Technical Report IRIDIA/2000-32, IRRIDIA, Université Libre de Bruxelles, Belgium, 2000. [6] Marco Dorigo, Mauro Birattari, and Thomas Stützle, Ant Conoly Optimization, IEEE COMPUTATIONAL INTELLIGENCE MAGAZINE, 11/2006.
[7] Dinh Quang Huy; Do Duc Dong; and Hoang Xuan Huan, Multi-level ant system - a new approach through the new pheromone update for ant colony optimization. The IEEE international conference on Research, Innovation and Vision for the Future (RIVF), 2006.
[8] Thomas Stützle and Holger H. Hoos, Max - Min Ant System, Technical Report IRIDIA/ Furure Generation Computer System 16, 2000, 889 - 914.
Website từ Internet
[9] http://www.aco-metaheuristic.org.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
PHỤ LỤC
Một số thủ tục chính của chƣơng trình
(viết bằng ngôn ngữ Java) 1/ Thủ tục chính:
public static void main(String[] args) { // KHOI TAO CAC THAM SO
int n = 10; //so dinh cua do thi int m = 10; //so con kien
int VL = 500; //tong so vong lap cua thuat toan ACO int anpha = 1;
int beta = 3;
float pho = (float ) 0.5;
ConKien kien[] = new ConKien[m]; // Khai bao va khoi tao dan kien for(int k = 0; k < kien.length; k++){
kien[k] = new ConKien(n); }
TSP doThi1= new TSP(n); //khai bao va khoi tao do thi int luuVTKien = 0;
int luuVL = 0; int luuCD = 0;
System.out.println();
System.out.println(" --- CHUONG TRINH DEMO ---"); System.out.println("Ap dung TT ACO giai bai toan TSP ---"); System.out.println(" --- Su dung thuat toan AS (Ant System) --"); System.out.println();
doThi1.nhapKCngaunhien(); // Khoi tao khoang cach doThi1.khoiTaoNongDoMui(); // Khoi tao NONG DO MUI doThi1.tinhlaiTT(anpha, beta);
// THUAT TOAN
if((n == 0) | (n > 500) | (m == 0) | (m > 50) | (VL > 1000))
System.out.println("Xin moi nhap lai du lieu: 0<n<500 | 0<m<50 | 0<so vong lap<1000");
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ int lap = 0;
while(lap < VL){ int step = 0;
//Dat m con kien ngau nhien vao n dinh int r = 0; for(int k = 0; k <kien.length; k++){ r =(int)Math.round(Math.random()*(doThi1.n - 1)); kien[k].tour[step] = r; kien[k].tham[r] = true; }
// Xay dung duong di (tour) while(step < (doThi1.n - 1)){
step++;
for(int k = 0; k < kien.length; k++){
kien[k].chonDinhTiepTheo(kien[k], step, doThi1); }
}
// Tinh chieu dai duong di (tour) for(int k = 0; k < kien.length; k++){
int d = 0; //do dai tour int vt1 = 0; int vt2 = 0; for(int h = 0; h < (doThi1.n-1); h++){ vt1 = kien[k].tour[h]; vt2 = kien[k].tour[h+1]; d = d + doThi1.khoangCach[vt1][vt2]; } vt1 = kien[k].tour[0]; d = d + doThi1.khoangCach[vt1][vt2]; // cong them k/c quay ve dinh xuat phat kien[k].chieuDaiTour = d;
}
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ for(int k = 0; k < kien.length; k++){ for(int h = 0; h < doThi1.n; h++){ kien[k].tham[h] = false; } }
// Xac dinh duong di ngan nhat tai moi vong lap int tourNN = kien[0].chieuDaiTour;
for(int k = 1; k < kien.length; k++){ if(tourNN > kien[k].chieuDaiTour){ tourNN = kien[k].chieuDaiTour; luuVL = lap; luuVTKien = k; } }
// Luu lai duong di ngan nhat cua cac vong lap if((luuCD == 0) | (luuCD > tourNN)){
luuCD = tourNN; luuVL = lap; }
// Cap nhat nong do mui tren cac canh doThi1.bayHoiMui(pho); // Bay hoi for(int k = 0; k < kien.length; k++){
doThi1.tangCuongMui(kien[k]); }
// Tinh lai mang Thongtin doThi1.tinhlaiTT(anpha, beta); lap++;
}
System.out.println();
System.out.println("KET QUA");
System.out.println(" + So dinh cua do thi = " + doThi1.n); System.out.println(" + So con kien = " + m); System.out.println(" + So vong lap = " + lap);
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ System.out.println("+ Chieu dai duong di ngan nhat=" + luuCD); System.out.print(" + Duong di: " );
for(int j = 0; j < doThi1.n; j++){ System.out.print(kien[luuVTKien].tour[j] + "--"); } System.out.print(kien[luuVTKien].tour[0]); System.out.println(); } }
2/ Thủ tục Nhập khoảng cách giữa các đỉnh của đồ thị (khoảng cách tạo ngẫu nhiên trong khoảng 0 - 50):
public void nhapKCngaunhien(){ int s; for(int i = 0; i < n; i++){ for(int j = i +1; j < n; j++){ s = (int)Math.round(Math.random() * 50); if(s == 0) s++; khoangCach[i][j] = s; khoangCach[j][i] = khoangCach[i][j]; } } } 3/ Thủ tục Chọn đỉnh kế tiếp:
public void chonDinhTiepTheo(ConKien kien1, int step, TSP t1){ int c = kien1.tour[step - 1];
double tong = 0.0;
double thongTin1[] = new double [t1.n]; double r;
int j;
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ if(this.tham[j])
thongTin1[j] = 0.0;
else{
thongTin1[j] =t1.thongTin[c][j]; tong = tong + thongTin1[j];
}
}
r = Math.random() * tong; //chon r ngau nhien trong (0, tong) j = 0;
double cantren = thongTin1[j]; while(cantren < r) {
j++;
cantren = cantren +thongTin1[j]; }
this.tour[step] = j; this.tham[j] = true; }
4/ Thủ tục bay hơi nồng độ mùi trên các cạnh: public void bayHoiMui(float pho){
for(int i = 0; i < n; i++){
for(int j = i + 1; j < n; j++){
mui[i][j] = (1 - pho) * mui[i][j]; mui[j][i] = mui[i][j];
} }
}
5/ Thủ tục tăng cƣờng nồng độ mùi trên các cạnh kiến đa qua: public void tangCuongMui(ConKien kien){
int vt1 = 0; int vt2 = 0;
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ for(int i = 0; i < (n - 1); i++){
vt1 = kien.tour[i]; vt2 = kien.tour[i + 1];
mui[vt1][vt2] = mui[vt1][vt2] + delta; mui[vt2][vt1] = mui[vt1][vt2];
}
vt1 = kien.tour[0];
mui[vt1][vt2] = mui[vt1][vt2] + delta; mui[vt2][vt1] = mui[vt1][vt2];
}
6/ Thủ tục tính lại giá trị mảng thông tin:
public void tinhlaiTT(int anpha, int beta){ double tong = 0.0;
double p[] = new double [n]; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(j!=i) { p[j] = ((Math.pow(mui[i][j], anpha)) * (Math.pow((1.0/khoangCach[i][j]), beta))); } else p[j] = 0; tong = tong + p[j]; } for(int j = 0; j < n; j++){ thongTin[i][j] = p[j] / tong; } } }