1. Trang chủ
  2. » Công Nghệ Thông Tin

ỨNG DỤNG GIẢI THUẬT NHÁNH CẬN ĐỂ GIẢI QUYẾT BÀI TOÁN NGƯỜI DU LỊCH

20 712 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 262,42 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài toán Người du lịch (Travelling Salesman Problem TSP) là một trong những bài toán kinh điển và khó trong tin học. Bài toán có phát biểu rất đơn giản nhưng rất khó giải trong trường hợp tổng quát với không gian tìm kiếm rộng lớn, khó bởi các thuật toán hiệu quả nhất đã được biết đến có thời gian giải quyết bài toán này tăng dần theo cấp số nhân của n, hay độ phức tạp thuật toán tăng theo hàm số mũ. Có rất nhiều cách tiếp cận giải bài toán này ngay từ khi nó mới ra đời, như sử dụng quy hoạch tuyến tính, thuật toán vét cạn, thuật toán người láng giềng gần nhất, kỹ thuật nhánh và cận, nhưng mới chỉ dừng lại ở các bộ dữ liệu nhỏ

Trang 1

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM TP.HCM

HỌ VÀ TÊN HỌC VIÊN

ĐỀ TÀI:

ỨNG DỤNG GIẢI THUẬT NHÁNH CẬN ĐỂ GIẢI QUYẾT BÀI TOÁN NGƯỜI DU LỊCH

Chuyên ngành: KHOA HỌC MÁY TÍNH

Người hướng dẫn:

Thành Phố Hồ Chí Minh – 2017

Trang 2

MỤC LỤC

CHƯƠNG I LỜI GIỚI THIỆU 3

CHƯƠNG II TỔNG QUAN VỀ BÀI TOÁN NGƯỜI DU LỊCH 4

I Giới thiệu bài toán 4

II Mô tả bài toán TSP 4

III Các thuật toán giải bài toán TSP 5

1 Thuật giải chính xác 5

2 Thuật giải gần đúng heuristic 5

I Giới thiệu 7

II Ưu điểm và nhược điểm của giải thuật nhánh cận 9

III Code Chương Trình 10

IV Bộ dữ liệu 14

V Kết Quả 15

VI Kết Luận 18

TÀI LIỆU THAM KHẢO 19

Trang 3

CHƯƠNG I LỜI GIỚI THIỆU

Bài toán Người du lịch (Travelling Salesman Problem - TSP) là một trong những bài toán kinh điển và khó trong tin học Bài toán có phát biểu rất đơn giản nhưng rất khó giải trong trường hợp tổng quát với không gian tìm kiếm rộng lớn, khó bởi các thuật toán hiệu quả nhất đã được biết đến có thời gian giải quyết bài toán này tăng dần theo cấp số nhân của n, hay độ phức tạp thuật toán tăng theo hàm số mũ Có rất nhiều cách tiếp cận giải bài toán này ngay từ khi nó mới ra đời, như sử dụng quy hoạch tuyến tính, thuật toán vét cạn, thuật toán người láng giềng gần nhất, kỹ thuật nhánh và cận, nhưng mới chỉ dừng lại ở các bộ dữ liệu nhỏ Gần đây có nhiều thuật toán ra đời theo hướng tiếp cận về tiến hóa như thuật toán di truyền Genetic Algorithm hay cách mô phỏng hành vi của đàn kiến như thuật toán đàn kiến được áp dụng cho kết quả tốt hơn rất nhiều

Từ bài toán người du lịch này có thể áp dụng cho nhiều tình huống trong 2 thực tế như: lập lịch tối ưu cho dự án, sắp xếp các hành trình du lịch, định tuyến trong các mạng viễn thông…

Xuất phát từ nhu cầu tìm đường đi ngắn nhất với một giải thuật tốt cho không gian tìm kiếm rộng lớn, áp dụng được cho nhiều bài toán tối ưu tổ hợp trong thực tế, mục tiêu của báo cáo này nhằm tìm hiểu thuật toán đàn kiến, xem xét hiệu quả của thuật toán đàn kiến áp dụng vào bài toán tối ưu tổ hợp và so sánh tính hiệu quả của thuật toán đàn kiến với thuật toán di truyền

Trang 4

CHƯƠNG II TỔNG QUAN VỀ BÀI TOÁN NGƯỜI DU LỊCH

I Giới thiệu bài toán

Bài toán người du lịch hay còn được gọi là bài toán TSP là một bài toán khá nổi tiếng trong lĩnh vực tối ưu tổ hợp được nghiên cứu trong lý thuyết khoa học máy tính

có nội dung như sau: Một người bán hàng xuất phát từ thành phố của anh ta, anh ta muốn tìm một đường đi ngắn nhất đi qua tất cả các thành phố của khách hàng mỗi thành phố đúng một lần và sau đó trở về thành phố ban đầu Nó nhanh chóng trở thành bài toán khó thách thức toàn thế giới bởi độ phức tạp thuật toán tăng theo hàm

số mũ (trong chuyên ngành thuật toán người ta còn gọi chúng là những bài toán NP-khó)

II Mô tả bài toán TSP

TSP có thể được mô hình như một đồ thị (hình 1.5), các đỉnh của đồ thị tương ứng với các thành phố và các cạnh thì tương ứng với đường nối giữa các thành phố, chiều dài của một cạnh tương ứng với khoảng cách giữa 2 thành phố Một đường đi trong bài toán TSP là một chu trình Hamilton trên đồ thị và một lời giải tối ưu của bài toán là chu trình Hamilton ngắn nhất

Đồ thị thường là đồ thị đầy đủ, vì vậy mọi cặp cạnh đều được nối bởi các cạnh Đây là bước đơn giản hóa bài toán vì việc tìm chu trình Hamilton trong một đồ thị đầy

đủ là dễ Các bài toán mà không phải hai thành phố nào cũng được nối với nhau có thể được chuyển đổi thành đồ thị đầy đủ bằng cách thêm những cạnh có độ dài lớn giữa các thành phố này, những cạnh này sẽ không xuất hiện trong chu trình tối ưu

Trang 5

Hình 1.5 Mô tả bài toán TSP

Đồ thị thường là đồ thị đầy đủ, vì vậy mọi cặp cạnh đều được nối bởi các cạnh Đây là bước đơn giản hóa bài toán vì việc tìm chu trình Hamilton trong một đồ thị đầy

đủ là dễ Các bài toán mà không phải hai thành phố nào cũng được nối với nhau có thể được chuyển đổi thành đồ thị đầy đủ bằng cách thêm những cạnh có độ dài lớn giữa các thành phố này, những cạnh này sẽ không xuất hiện trong chu trình tối ưu

III Các thuật toán giải bài toán TSP

1 Thuật giải chính xác

Trong các thuật giải chính xác cho bài toán người du lịch, đầu tiên phải kể đến thuật toán vét cạn Thuật toán này tìm tất cả các chu trình hamilton trong đồ thị, sau

đó chọn một chu trình nhỏ nhất làm đáp án

2 Thuật giải gần đúng heuristic

Khi bài toán có kích thước n đỉnh nhỏ thì các thuật giải chính xác được áp dụng cho kết quả nhanh chóng và duy nhất Nhưng khi số đỉnh của bài toán tăng lên đáng

kể thì độ phức tạp của thuật toán do đó cũng tăng lên Trong trường hợp này, chất lượng của giải pháp không phải là vấn đề quan tâm nhất mà hiệu suất tính toán và sự đơn giản về khái niệm được ưu tiên hơn, khi đó thuật toán heuristic được sử dụng để đưa ra một giải pháp không phải là tối ưu nhất nhưng chấp nhận được do sai số so với giải pháp tối ưu nhất không nhiều Trong luận văn này giới thiệu bốn thuật toán nổi tiếng nhất là: thuật toán láng giềng gần nhất, thuật toán tìm kiếm cục bộ, thuật toán

Trang 6

nhánh cận và thuật toán di truyền Trong đó thuật toán cục bộ thường được sử dụng kết hợp với thuật toán đàn kiến ACO để tăng hiệu suất tìm kiếm giải pháp

Thuật toán tìm kiếm cục bộ

Thuật toán tìm kiếm cục bộ là giải pháp metaheuristic cho việc giải các bài toán tính toán tối ưu khó trong máy tính Thuật toán này có thể được áp dụng cho các bài toán tìm kiếm lời giải gần đúng tối ưu trong một loạt các lời giải ứng viên Phương pháp tìm kiếm sẽ duyệt qua các lời giải trong không gian tìm kiếm cho đến khi lời tìm ra lời giải được cho là tối ưu hoặc vượt quá thời gian tìm kiếm cho phép Thuật toán tìm kiếm cục bộ sẽ bắt đầu từ một ứng viên lời giải (chưa tối ưu), kiểm tra và cải thiện dần bằng cách chỉ quan tâm tới giải pháp hiện thời rồi xem xét chuyển sang ứng viên lời giải láng giềng của lời giải hiện thời đến khi dừng thuật toán Tuy nhiên mỗi ứng viên lời giải đều có thể có hơn một lời giải láng giềng, nên mỗi cách lựa chọn lời giải láng giềng trong danh sách láng giềng để thành bước duyệt kế tiếp có thể trở thành một thuật toán khác

Thuật toán di truyền

Thuật toán di truyền là thuật toán metaheuristic Metaheuristic là một cách gọi chung cho các thuật toán heuristic trong việc giải quyết các bài toán tổ hợp khó Hầu hết các thuật toán metaheuristic đều lấy cảm hứng từ tự nhiên như: thuật toán luyện thép (SA), thuật toán di truyền (GA), thuật toán đàn kiến (ACO),… Thuật toán đàn kiến là metaheuristic dùng chiến lược của kiến trong thế giới thực để giải bài toán tối ưu SA xuất phát từ phương thức xác suất và kỹ thuật luyện bao gồm việc nung và điều khiển

àm nguội các kim loại để đạt được trạng thái năng lượng nhỏ nhất Trong khi đó thuật toán di truyền dựa trên ý tưởng từ cơ chế di truyền trong sinh học và tiến trình tiến hóa trong cộng đồng các cá thể của một loài

Thuật toán láng giềng gần nhất

Thuật giải vét cạn ở trên cho ta một đáp án tối ưu, tuy nhiên độ phức tạp của nó

là quá cao (O(n!)) Do đó trong thực tế, người ta chấp nhận các thuật giải cho kết quả tốt (nhưng không phải lúc nào cũng tốt) bởi sự đơn giản, nhanh chóng và cài đặt dễ

Trang 7

dàng Một trong các thuật giải đó là thuật toán láng giềng gần nhất hay còn được gọi

là thuật toán tham lam

Thuật toán nhánh cận

Thuật toán nhánh cận là phương pháp chủ yếu để giải các bài toán tối ưu tổ hợp Tư tưởng cơ bản của thuật toán là trong quá trình tìm kiếm lời giải, sẽ phân hoạch tập các phương án của bài toán thành hai hay nhiều tập con biểu diễn như một nút của một cây tìm kiếm và cố gắng bằng cách đánh giá cận các nút, tìm cách loại bỏ những nhánh cây (những tập con các phương án của bài toán) mà biết chắc chắn không phải phương án tối ưu Mặc dù trong trường hợp tồi nhất, thuật toán sẽ trở thành duyệt toàn bộ, nhưng trong những trường hợp cụ thể nó có thể rút ngắn đáng kể thời gian tìm kiếm

Trang 8

CHƯƠNG III THUẬT TOÁN TỐI ƯU NHÁNH CẬN

I Giới thiệu

Một trong những bài toán đặt ra trong thực tế là việc tìm ra một nghiệm thoả mãn một

số điều kiện nào đó, và nghiệm đó là tốt nhất theo một chỉ tiêu cụ thể, nghiên cứu lời giải các lớp bài toán tối ưu thuộc về lĩnh vực quy hoạch toán học Tuy nhiên cũng cần phải nói rằng trong nhiều trường hợp chúng ta chưa thể xây dựng một thuật toán nào thực sự hữu hiệu để giải bài toán, mà cho tới nay việc tìm nghiệm của chúng vẫn phải dựa trên mô hình liệt kê toàn bộ các cấu hình có thể và đánh giá, tìm ra cấu hình tốt nhất Việc liệt kê cấu hình có thể cài đặt bằng các phương pháp liệt kê: Sinh tuần tự và tìm kiếm quay lui

Thuật toán quay lui (backtracking) là chiến lược tìm nghiệm bài toán bằng cách xét tất

cả các phương án có thể Đó là một quá trình tìm kiếm theo độ sâu trong một tập hợp các lời giải Trong quá trình tìm kiếm, nếu ta gặp một hướng lựa chọn không thỏa mãn, ta quay lui về điểm lựa chọn nơi có các hướng khác và thử hướng lựa chọn tiếp theo Khi đã thử hết các lựa chọn xuất phát từ điểm lựa chọn đó, ta quay lại điểm lựa chọn trước đó và thử hướng lựa chọn tiếp theo tại đó Quá trình tìm kiếm thất bại khi không còn điểm lựa chọn nào nữa Đây là một thuật toán có thể áp dụng để giải rất nhiều bài toán với kích thước dữ liệu thích hợp Ưu điểm của thuật toán là đảm bảo tìm ra nghiệm đúng chính xác

Mô hình thuật toán quay lui là tìm kiếm trên một cây phân cấp Nếu giả thiết rằng ứng với mỗi nút tương ứng với một giá trị được chọn cho x[i] sẽ ứng với chỉ 2 nút tương ứng với 2 giá trị mà x[i+1] có thể nhận thì cây n cấp sẽ có tới 2n nút lá, con số này lớn hơn rất nhiều lần so với dữ liệu đầu vào n

Chính vì vậy mà nếu như ta có thao tác thừa trong việc chọn x[i] thì sẽ phải trả giá rất lớn về chi phí thực thi thuật toán bởi quá trình tìm kiếm lòng vòng vô nghĩa trong các bước chọn kế tiếp x[i+1], x[i+2], … Khi đó, một vấn đề đặt ra là trong quá trình liệt

kê lời giải ta cần tận dụng những thông tin đã tìm được để loại bỏ sớm những phương

Trang 9

án chắc chắn không phải tối ưu Kỹ thuật đó gọi là kỹ thuật đánh giá nhánh cận trong tiến trình quay lui Kĩ thuật Nhánh cận (Nhánh và cận – Branch and Bound) giúp chúng ta đánh giá được nghiệm, do có thể cắt bỏ đi những phương án (nhánh) không cần thiết, việc tìm nghiệm tối ưu sẽ nhanh hơn, cải thiện được độ phức tạp thuật toán Những bài toán tìm một nghiệm, liệt kê hoặc bài toán tối ưu là những lớp bài toán có thể giải bằng Kĩ thuật Nhánh cận

Ý tưởng của thuật toán:

Nhánh cận là kỹ thuật xây dựng cây tìm kiếm phương án tối ưu, nhưng không xây dựng toàn bộ cây mà sử dụng giá trị cận để hạn chế bớt các nhánh

- Giữ lại phương án mẫu

- Tính chi phí cho các phương án khác ngay trong quá trình xây dựng

o Tốt hơn: cập nhật lại phương án mẫu và tiếp tục tìm phương án tiếp theo

o Không tốt hơn: quay lại bước trên và xét phương án khác

Gọi p là 1 hoán vị của {1,2,…,n} ta được hành trình Tp(1)-> Tp(2) -> … Tp(n)

Ta có n! hành trình

Nếu ta chọn đỉnh 1 là đỉnh xuất phát thì ta có (n-1)! hành trình, bài toán trở thành: + Tìm Min{f(x)}

Hàm đệ quy quay lui cho nhánh cận:

Try(i){

For(j=1; j<n; j++)

If ( chấp nhận được phương án) {

Xác định xi theo j;

Ghi nhận trạng thái mới;

If( i=n)

Cập nhật trạng thái tối ưu;

Trang 10

Xác định cận g(x1, x2, x3,…);

If (g(x1, x2, x3,…) < f* ) Try(i+1);

}

}

}

II Ưu điểm và nhược điểm của giải thuật nhánh cận

Ưu điểm: Giảm được chi phí do loại bỏ được những bước đi không cần thiết

Nhược điểm: Việc xây dựng hàm g phụ thuộc vào từng bài toán tối ưu tổ hợp cụ thể Hàm g phải đảm bảo các yêu cầu sau:

+ Việc tính giá trị hàm g phải đơn giản hơn bài toán tìm

min=min{ f(a):=a=(a1,a2,a3,…)) thuộc X, Xi=ai, i=1,…,n}

+ Giá trị của f phải sát với giá trị của min

Trang 11

III Code Chương Trình

#include <iostream>

#include <stdio.h>

#include <conio.h>

#include <time.h>

#include <cstdlib> // call rand()

#include <stdlib.h> // call itoa(): chuyen so sang chuoi

#include <string.h>

#define max 101

using namespace std;

char duongdan_dulieu[100]= "E:\\BaiTapC\\TieuLuan_ThayBao\\TSP\\dulieu\\tsp_" ;

char duongdan_ketqua[100]= "E:\\baitapC\\TieuLuan_ThayBao\\TSP\\output\\kq_tsp" ; int a[max][max]; // ma tran ke vo huong co trong so

int n; // so luong dinh

bool b[max]={ false }; // mang danh dau

char s[10];

int kq[max],bestConfig[max]={0}; // mang tam, va mang luu cau hinh tot nhat

int mmin=32000,cost=0; // gia tri thap nhat khi di qua cac dinh va gia tri tam

long g,ss;

int start; // dinh bat dau

void Try( int i);

void xoakitu( char *xau, int v, int n=1)

{

v+n-1>strlen(xau)?*xau=NULL:xau[v]=xau[v+n],v+n<strlen(xau)?xoakitu(xau,v+1,n):0; }

void Init( int kk)

{

// Doc gia tri vao ma tran a[][]

FILE *FileIn;

itoa(kk,s,10);

strcat(duongdan_dulieu,s);

strcat(duongdan_dulieu, ".txt" );

FileIn=fopen(duongdan_dulieu, "r" );

fscanf(FileIn, "%d \n" ,&n);

if (!FileIn)

{

cout<< "Loi mo tep de doc." ;

}

Trang 12

for ( int i=0; i<n;i++)

for ( int j=0; j<n; j++)

if ( i==j) a[i][j]=0;

else { fscanf(FileIn, "%d" ,&a[i][j]);

a[j][i] = a[i][j];

}

if (kk<10)

{

xoakitu(duongdan_dulieu,strlen(duongdan_dulieu)-5,5);

}

if (kk>=10 && kk<100)

{

xoakitu(duongdan_dulieu,strlen(duongdan_dulieu)-6,6);

}

if (kk>=100 && kk<1000)

{

xoakitu(duongdan_dulieu,strlen(duongdan_dulieu)-7,7);

}

if (kk>=1000 && kk<10000)

{

xoakitu(duongdan_dulieu,strlen(duongdan_dulieu)-8,8);

}

fclose(FileIn);

}

void Try( int i)

{

g=0;ss=0;

//neu i == n thi kiem tra de xem phai la cau hinh tot hon thi luu lai

cout<< "->" ;

if (i==n)

{

if (cost+a[kq[i-1]][kq[0]]<mmin)

{

mmin=cost+a[kq[i-1]][kq[0]];

g++;ss+=2;

for ( int k=0; k < n;k++)

{ bestConfig[k]=kq[k];

ss++; g+=2;

} }

}

else

{

Trang 13

for ( int j=0;j<n;j++) // duyet qua cac dinh co the di qua

{

g++;ss++;

// neu chua di qua va gia tri con cho phep

if (b[j]== false && cost+a[kq[i-1]][j] < mmin) {

ss+=2;g+=3;

//ghi nho lai ket qua

kq[i]=j;

b[j]= true ;

cost+=a[kq[i-1]][j];

//goi de qui den buoc tiep theo

Try(i+1);

//xoa bo ghi nho

b[j]= false ;

cost-=a[kq[i-1]][j];

g+=2;

}

}

}

}

// -void Output() // ham xuat cac gia tri

{

for ( int i=0;i<n;i++)

{

cout<<bestConfig[i]+1<< "->" ;

}cout<<bestConfig[0]+1<<endl;

cout<< "Chi phi: " <<mmin<<endl;

}

Trang 14

// -MAIN -int main( void )

{

int soluongtep;

// Ghi ket qua ra tep

FILE *FileOut; FILE *FileIn;

strcat(duongdan_ketqua, ".txt" );

FileOut=fopen(duongdan_ketqua, "w" );

if (!FileOut )

cout<< "Loi mo tep de doc." ;

soluongtep=84;

clock_t start = clock();

for ( int i=5; i<=soluongtep; i+=2)

{

Init(i);

start=i;

kq[0]=start;

b[start]= true ;

Try(1); // bat dau goi tu dinh dau tien di,khi bang n thi dung

Output();

clock_t finish = clock();

float duration = ( float )(finish - start) / CLOCKS_PER_SEC;

fprintf(FileOut, "%d\t %d\t %10.7f\t\t%d\t\t%d\n" ,i,mmin,duration,g,ss); }

fclose(FileOut);

return 0;

}

Ngày đăng: 23/07/2020, 15:44

HÌNH ẢNH LIÊN QUAN

Hình 1.5 Mô tả bài toán TSP - ỨNG DỤNG GIẢI THUẬT NHÁNH CẬN ĐỂ GIẢI QUYẾT BÀI TOÁN NGƯỜI DU LỊCH
Hình 1.5 Mô tả bài toán TSP (Trang 5)
Bảng hồi quy tuyến tính - ỨNG DỤNG GIẢI THUẬT NHÁNH CẬN ĐỂ GIẢI QUYẾT BÀI TOÁN NGƯỜI DU LỊCH
Bảng h ồi quy tuyến tính (Trang 18)

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w