Code thuật toán nhánh cận người du lịch năm 2024

Bài toán người du lịch: Một nguời du lịch muốn đi tham quan n thành phố T1,T2…, Tn . Xuất phát từ một thành phố nào đó, người du lịch muốn đi qua tất cả các thành phố còn lại, mỗi thành phố đi qua duy nhất 1 lần rối quay trở trở lại thành phố xuất phát.

Gọi Cij là chi phí đi từ thành phố Ti đến Tj . Hãy tìm một hành trình thỏa yêu cầu bài toán sao cho chi phí là nhỏ nhất.

Hãy cùng Lập trình không khó đi giải quyết bài toán này nhé các bạn

Code bài toán người du lịch

Chúng ta sẽ lưu ma trận chi phí đi từ Ti đến Tj là a[i][j]. Như vậy, tại đường chéo của ma trận thì chi phí sẽ bằng 0. Giả sử với ma trận sau:

int graph[4][4] \= { {0, 10, 15, 20},

{10, 0, 35, 25},

{15, 35, 0, 30},

{20, 25, 30, 0}

};

Chúng ta giả sử có 4 thành phố: T0, T1, T2, T3. Như vậy thì hàng đầu tiên là chi phí đi từ T0 đến T0, T1, T2, T3 lần lượt là 0, 10, 15, 20. Tương tự với các hàng phía sau.

Hỗ trợ thanh toán qua INTERNET BANKING tất cả các ngân hàng: VietcomBank, BIDV, VietinBank, SacomBank, TechcomBank, Á Châu, TPbank, MBbank, AgriBank, VPbank, SHB, MaritimeBank, DongAbank, VIB, EximBank, HDbank, NCB, Việt Á, OceanBank, PGbank, BacAbank...

Bạn cần đăng nhập để tải code qua chức năng này!

ĐĂNG NHẬP NGAY

Hỗ trợ CHUYỂN KHOẢN TRỰC TIẾP qua các số tài khoản ngân hàng: VietcomBank, BIDV, VietinBank, SacomBank, TechcomBank, Á Châu, TPbank, MBbank, AgriBank, VPbank, SHB, MaritimeBank

Bạn cần đăng nhập để tải code qua chức năng này!

ĐĂNG NHẬP NGAY

  1. TỰ LUẬN...................................................................................................................
  • Câu 1:.............................................................................................................................
  • Câu 2:.............................................................................................................................
  • Câu 3:.............................................................................................................................
  • Câu 4:.............................................................................................................................
  • Câu 5:
  • II. LẬP TRÌNH.........................................................................................................
  • 1. Đề bài :..................................................................................................................
  • 1. Ý tưởng giải thuật:...............................................................................................
  • 1. Code chương trình:..............................................................................................
  • 1. Chạy chương trình :.............................................................................................
  • III. TÀI LIỆU THAM KHẢO :.................................................................................
  • Ta có số trận đã đấu của mỗi người có thể là 0,1,2,3,4. Nhưng vì không thể có cùng lúc một người đã đấu 4 trận và một người chưa đấu trận nào, nên có tối đa 4 loại số trận đã đấu.
  • Vận dụng nguyên lý Dirichlet ta có ít nhất có 2 người có cùng số trận đã đấu. Câu 3: Tìm số nghiệm nguyên không âm của phương trình: x 1 + x 2 + x 3 + x 4 = 20, thỏa màn điều kiện x 1 ≤ 3; x 2 ≥2; x 3 > BÀI LÀM Ta có: x 1 + x 2 + x 3 + x 4 = 20 (1) x 1  3; x 2  2; x 3 > 4 (). Ta viết điều kiện đã cho thành x 1  3; x 2  2; x 3  5. Xét các điều kiện sau:  x 2  2; x 3  5 ()  x 1  4; x 2  2; x 3  5 () Gọi p, q, r lần lượt là số nghiệm nguyên không âm của phương trình (1) thỏa các điều kiện (), (), (). Ta có: p = q – r. Đặt : x 1 ’ = x 1 ; x 2 ’ = x 2 - 2; x 3 ’ = x 3 - 5; x 4 ’ = x 4 Phương trình (1) trở thành : x 1 ’+ x 2 ’ + x 3 ’ + x 4 ’ = 13 (2) Số nghiệm nguyên không âm của (1) thỏa() bằng số nghiệm nguyên không âm của (2)

→ Số nghiệm là : K 134 = C 13 (4+13-1) = C 1316 Vậy q = C 13 16 Lý luận tương tự, ta có : r = K 94 = C 9 (4+9-1) = C 912 → p = q - r = C 1316 - C 912 = 560 - 220 = 340 Vậy số nghiệm nguyên không âm của phương trình (1) thỏa điều kiện () là 340. Câu 4: Áp dụng thuật toán nhánh cận giải bài toán người du lịch với ma trận chi phí như sau: ∞ 08 05 22 04 ∞ 09 17 15 07 ∞ 12 05 27 17 ∞ BÀI LÀM

  1. Viết thứ tự các đỉnh được thăm của đồ thị theo thuật toán BFS. b) Tìm đường đi ngắn nhất từ đỉnh a đến các đỉnh còn lại của đồ thị bằng thuật toán Dijkstra. c) Tìm cây khung nhỏ nhất của đồ thị trên bằng thuật toán Kruskal. d) Tìm cây khung nhỏ nhất của đồ thị trên bằng thuật toán Prim. BÀI LÀM a) Đỉnh Queue Đã thăm Còn lại a b,h,g a b,c,d,e,g,h,k b h,g,c,k a,b c,d,e,g,h,k h g,c,k,d a,b,h c,d,e,g,k g c,k,d,e a,b,h,g c,d,e,k c k,d,e a,b,h,g,c d,e,k k d,e a,b,h,g,c,k d,e d e a,b,c,d,h,g,k d e rỗng a,b,c,d,e,g,h,k rỗng → Thứ tự các đỉnh được thăm : a,b,c,d,e,g,h,k b) a b c d e g h k (∞,-) (∞,-) (∞,-) (∞,-) (∞,-) (∞,-) (∞,-) 0* (∞,-) (3,k) (2,k) (∞,-) (∞,-) (∞,-) (1,k)* -

(3,h) (3,k) (2,k)* (6,h) (∞,-) (8,h) - - (3,h)* (3,k) - (4,c) (∞,-) (5,c) - -

  • (3,k)* - (4,c) (∞,-) (5,c) - -
  • (4,c)* (∞,-) (5,c) - -
  • (11,d) (5,c)\ - -
  • (10,g)\ - - -

Từ k đến h : k→h ; Độ dài : 1 ; S = {k,h}. Từ k đến g : k→c→g ; Độ dài : 5 ; S = { k,c,g}. Từ k đến e : k→c→g→e ; Độ dài : 10 ; S = {k,c,g,e}. Từ k đến d : k→c→d ; Độ dài : 4 ; S = {k,c,d}. Từ k đến c : k→c ; Độ dài : 2 ; S = {k,c}. Từ k đến b : k→b ; Độ dài : 3 ; S = {k,b}. Từ k đến a : k→h→a ; Độ dài : 3 ; S = {k,h,a}. c)

Khởi tạo [∞,k] [3,k] [2,k] [∞,k] [∞,k] [∞,k] [1,k]* [0,k] k 1 [2,h]* [3,k] [2,k] [5,h] [∞,k] [7,h] - - k,h 2 - [3,k] [2,k]* [5,h] [∞,k] [7,h] - - k,h,a 3 - [3,k] - [2,c]* [∞,k] [3,c] - - k,h,a,c 4 - [3,k]* - - [7,d] [3,c] - - k,h,a,c,d 5 - - - - [7,d] [3,c]* - - k,h,a,c,d,b 6 - - - - [5,g]* - - - k,h,a,c,d,b,g 7 - - - - - - - - k,h,a,c,d,b,g,e → Độ dài cây khung nhỏ nhất là: 1+2+2+2+3+3+5 = 18. Cây khung nhỏ nhất của đồ thị :

II. LẬP TRÌNH :
  1. Đề bài : Lập trình cài đặt thuật toán nhánh cận giải bài toán người du lịch.

2. Ý tưởng giải thuật:...............................................................................................

Ta đánh giá được một giới hạn (cận) chung cho những giá trị này (đối với bài toán tìm min là cận dưới, đối với bài toán tìm max là cận trên). Nếu cận tính được không tốt hơn kỷ lục hiện có (đối với bài toán tìm min là không nhỏ hơn, đối với bài toán tìm max là không lớn hơn) thì có nghĩa là hướng phát triển của nhánh tìm kiếm này là vô ích, có thể bỏ qua để xét giá trị khác cho xi. Việc không xét những giá trị tiếp theo của xi giúp cho loại bỏ được một loạt các nhánh trên cây tìm kiếm. Vì thế kỹ thuật đánh giá này có tên gọi là đánh giá nhánh cận (tìm cận tại mỗi nhánh tìm kiếm). Để đánh giá được nhánh cận, cần có sự xem xét kỹ tính chất của hàm mục tiêu và điều này không đơn giản. Thông thường, cận được đánh giá cố gắng đạt được hai tiêu chí :

  • Càng sát với giá trị tối ưu của bài toán càng tốt.
  • Việc tính cận càng đơn giản càng tốt. Tiêu chí thứ nhất giúp cho việc lùi càng sớm trên cây tìm kiếm, nghĩa là càng cắt được nhiều nhánh trên cây này, tiêu chí thứ hai làm giảm bớt các phép tính trong một vòng lặp đệ quy (mà số lượng lồng nhau của chúng là rất lớn!). Trên thực tế hai tiêu chí này thường xung đột lẫn nhau: để đánh giá cận càng sát, việc tính nó càng phức tạp. Việc điều chỉnh hai tiêu chí này cho phù hợp là cả một nghệ thuật, nó đòi hỏi nhiều kinh nghiệm và kiến thức trong việc đánh giá các bất đẳng thức. Bây giờ, giả sử g(x1, x2, ..., xi) là cận dưới tương ứng với bước thứ i của bài toán tìm min. Khi đó trong thủ tục TRY(i) của mô hình duyệt toàn bộ, trước khi gọi TRY(i +1), ta cần thử lại bất đẳng thức g(x1, x2, ..., xi) < min (nghĩa là chỉ tiến sang bước sau nếu cận dưới nhỏ hơn kỷ lục hiện thời):

int chuaxet[100]; int kq[100]; int MIN=0; int a=1; void Input() { cout<<"\nNhap so luong thanh pho: "; cin>>n; cout<<"Nhap chi phi cho cac cung duong \n"; for(int i=1; i<=n; i++) for(int j=1;j<=n;j++) { if(i!=j) { cout<<"c["<>c[i][j]; } else c[i][j]=0; } x[1]=1; for(int i=2;i<=n;i++) chuaxet[i]=1; }

void Output() { cout<<"\nMa tran chi phi :\n"; for(int i=1; i<=n; i++) { cout<<"{" ; for(int j=1;j<=n;j++) { if(j!=n) cout<"; for(int i=2;i<=n;i++) cout<<"T"<"; cout<<"T1"; cout<<"\n Chi phi cua hanh trinh la: "<

int main() { Input(); Output(); Try(2); Result(); getch(); } 4. Chạy chương trình : III. TÀI LIỆU THAM KHẢO :