Cố định thành phố xuất phát là T1. Bài toán người du lịch trở thành bài toán :
Tìm min { f(x2,…,xn)=c[1,x2]+c[x2,x3]+…+c[xn-1,xn]+c[xn,1] | (x2,…,xn) là hoán vị của {2,…,n} } G/s đã đi qua k thành phố: T1 --> T(a1) -->… -->T(ak) ứng với phương án bộ phận (a1, a2,…, ak) và chi phí cho hành trình bộ phận này là σ=c[1,a2]+c[a2,a3]+…+c[ak-1,ak]. Để phát triển thành
hành trình đầy đủ, còn phải đi qua n-k+1 đoạn đường nữa. Ta có:
σ +(n-k+1)cmin ≤ min {f(x): x1 = a1, …,xk = ak}
nên có thể chọn g(a1,…,ak)=σ +(n-k+1)cmin
Ví dụ: giải bài toán người du lịch với ma trận chi phí sau:
C= 0
3 14 18 15
HD: cmin=3. Gọi σ chi phí hành trình bộ phận, cận dưới g= σ + 3(n-k+1) f = +∞ *k=2: x2=2,3,4,5 x2=2 : σ=3, g=3+(5-2+1) x 3=15 x2=3 : σ=14, g=14+(5-2+1) x 3=26 x2=4 : σ=18, g=18+(5-2+1) x 3=30 x2=5 : σ=15, g=15+(5-2+1) x 3=27 vv… * Cài đặt /*
bai toan nguoi du lich */
#include <stdio.h> #include <conio.h> #include <values.h> int n;//so thanh pho
int c[100][100];//ma tran chi phi
int cmin;//chi phi nho nhat trong ma tran chi phi int tp[100];//tp[i]=0:tp i da di qua, =1 chua di qua int cost;//chi phi bo phan
int fopt; //gia tri ky luc, gia tri cuoi cung la gia tri toi uu int x[100];//la mot phuong an
int xopt[100];//la phuong an toi uu void ReadFile()
{
FILE *fin; int i,j;
if ((fin = fopen("dulich.dat", "rt"))== NULL) {
printf("Khong tim thay file dulich.dat.\n"); return ;
}
//doc so thanh pho fscanf(fin,"%d",&n); //doc ma tran chi phi for (i=0;i<n;i++)
for (j=0;j<n;j++)
fscanf(fin,"%d",&c[i][j]); fclose(fin);
//xuat thong tin de kiem tra printf("\nSo thanh pho:%d",n); printf("\nMa tran chi phi:"); for (i=0;i<n;i++) { printf("\n"); for (j=0;j<n;j++) printf("%3d",c[i][j]); } } void Init() { int i,j;
cmin=MAXINT;//so kieu int lon nhat for (i=0;i<n;i++)
{
tp[i]=1;//tat ca tp i deu chua di qua for (j=0;j<n;j++)//tim cmin
if ( (i!=j)&&(c[i][j]<cmin)) cmin=c[i][j]; }
fopt=MAXINT;//ky luc ban dau cost=0;//chi phi bo phan
x[0]=0;//tp bat dau di la tp 0 }
void CNKL() //cap nhat ky luc {
int i,s;
s=cost+c[x[n-1]][x[0]];//cong them chi phi tro ve tp dau if (s<fopt)//neu chi phi cua hanh trinh nay < ky luc {
fopt=s;//ghi nhan ky luc moi
for (i=0;i<n;i++) xopt[i]=x[i]; //ghi nhan hanh trinh moi } } void Try(int i) { int j; for (j=1;j<n;j++) if (tp[j]) { x[i]=j; tp[j]=0;//tp j da duoc chon
cost=cost+c[x[i-1]][x[i]];//chi phi bo phan if (i==n-1) CNKL(); else if (cost+(n-i+1)*cmin<=fopt) Try(i+1); tp[j]=1; cost=cost-c[x[i-1]][x[i]]; } } void Result() { int i;
printf("\n\nChi phi nho nhat:%d",fopt);
printf("\nHanh trinh co chi phi nho nhat:\n"); for (i=0;i<n;i++) printf ("%d -> ",xopt[i]+1); printf ("%d",xopt[0]+1); } void main() { clrscr(); ReadFile(); Init(); Try(1); Result(); getch(); } /* vi du ve file duclich.dat 6 0 3 93 13 33 9 4 0 77 42 21 16 45 17 0 36 16 28 39 90 80 0 56 7 28 46 88 33 0 25 3 88 18 46 92 0 Co ds la:
Chi phi nho nhat:104
Hanh trinh co chi phi nho nhat: 1->4->6->3->2->5->1
Bài tập chương 1: TỔ HỢP
1/ (bài 4/ trang 16)
Cho A={0,1,2,3,4} và quan hệ R trên A như sau:
R={(0,0),(2,1),(0,3),(1,1),(3,0),(1,4),(4,1),(2,2),(2,4),(3,3),(4,4),(1,2),(4,2)} R có là quan hệ tương đương? Nếu có hãy tìm phân hoạch tương ứng với R. HD:
Vẽ đồ thị có hướng tương ứng với R. Mỗi phần tử của tập A là 1 đỉnh, có cung hướng từ đỉnh i đến đỉnh j nếu (i,j) ∈ R. 4 0 1 2 3 Các lớp tương đương: A1={0,3}; A2={1,2,4}; 2/ bài 5/trang 16 Xét các tập với các phần tử là các số nguyên: A0={…,-10,-5,0,5,10,15,20,25,…} A1={…,-9,-4,1,6,11,16,21,26,…} A2={…,-8,-3,2,7,12,17,22,27,…} A3={…,-7,-2,3,8,13,18,23,28,…} A4={…,-6,-1,4,9,14,19,24,29,…}
a) Chứng minh các tập A0, A1, A2, A3, A4 tạo thành một phân hoạch của tập số nguyên Z
b) Chỉ ra quan hệ R ứng với phân hoạch này. HD:
Ai={ a | a chia 5 dư i } a) Kiểm tra hai điều kiện
Ai ∩Aj = ∅ (i≠j)
∪Ai = Z
b) a R b ⇔a≡b (mod 5) hoặc a R b ⇔a-b chia hết cho 5 3/ Hãy đơn giản các biểu thức sau
a) A(B A)
b) (AB) (ABC D) (AB) c) A B (ABC)
d) A (AB) (ABC) (ABCD)
4/Quan hệ R = {(a,b)| a+b=2k, a,b,k∈Z} có là quan hệ tương đương trên Z? HD:
+ phản xạ: cm voi moi a thuoc Z => (a,a) thuoc R
a+a=2a => (a,a) thuoc R => R phản xạ
Phản xạ: Nếu mỗi đỉnh đều có khuyên (đỉnh có cung hướng đến chính nó)
Đối xứng: mỗi canh đều có hai hướng (gọi là cạnh) Bắc cầu: nếu ba đỉnh đã có hai cạnh thì phải có cạnh thứ ba.
+ đối xứng: (a,b) thuoc R cm (b,a) thuoc R
(a,b) thuoc => a+b=2k =>b+a=2k =>(b,a) thuoc R => R đối xứng + bắc cầu: (a,b),(b,c) thuoc R cm (a,c) thuoc R
(a,b) thuoc R=>a+b=2k1; (b,c) thuoc R => b+c=2k2
=> a+c=2(k1+k2-b) =2k voi k=k1+k2-b => (a,c) thuoc R => R bắc cầu
Vậy R là quan hệ tương đương trên Z.
5/ Cho A={1,2,3,4,5,6}. Trên A xác định quan hệ R ={(a,b)| a-b=3k, a,b∈A, k∈ Z} .
a) Biểu diễn R bằng phương pháp liệt kê, phương pháp ma trận, phương pháp đồ thị có hướng b) Chứng minh R là quan hệ tương đương trên A. Tìm phân hoạch do R sinh ra.
c) Tìm quan hệ tương đương S trên A sinh ra các lớp sau: A1={1}; A2={2,3}; A3={4,5,6} HD:
a) R={(1,1)(2,2)(3,3)(4,4)(5,5)(6,6)(1,4)(4,1),(2,5)(5,2)(3,6)(6,3)}
b)
+ phản xạ: a-a=0=3*0 => aRa
+ đối xứng: a-b=3k => b-a=3(-k)=3k1 => bRa
+bắc cầu: a-b=3k1 , b-c=3k2 => a-c=3(k1+k2)=3k =>aRc Phân hoạch S={{1,4};{2,5};{3,6}}
c) S={(1,1)(2,2)(3,3)(4,4)(5,5)(6,6)(2,3)(3,2),(4,5)(5,4)(5,6)(6,5)(4,6)(6,4)}
6/ Cho tập X={1,2,…,n}; và cho quan hệ R trên X dạng liệt kê. Viết chương trình nhập vào số nguyên dương n và các cặp của quan hệ R, cho biết R có là quan hệ tương đương trên X hay không, nếu có cho biết các lớp tương đương mà R sinh ra.
HD:
+Dùng mảng hai chiều a[n][n] để lưu quan hệ R, a[i][j]=1 nếu (i,j)∈R và a[i][j]=0 nếu (j,j)∉R. Ban đầu gán toàn bộ mảng là 0, khi nhập cặp (i,j) nào thì gán phần tử a[i][j] tương ứng bằng 1.
+ Kiểm tra quan hệ tương đương:
- phản xạ: nếu tất cả các phần tử trên đường chéo chính bằng 1; tức là a[i][i]=1, ∀i∈{1,..,n}
- đối xứng: nếu mảng có tính đối xứng qua đường chéo chính, tức là a[i][j]=a[j][i], ∀i,j ∈{1,..,n}
- bắc cầu: nếu a[i][k]=1 và a[k][j]=1 thì a[i][j]=1;∀i,j,k ∈{1,..,n}
7/ Xét các quan hệ sau trên tập số nguyên: R1= {(a,b)| a≤b}; //px, kg doi xung,bc R2= {(a,b)| a>b}; //kg px, kg dx, bc
R3= {(a,b)| a=b hoặc a=-b};//px,dx,bc=>td R4= {(a,b)| a=b}; //px,dx,bc=>td
R5= {(a,b)| a=b+1};//kg px, kg dx, kg bc R6= {(a,b)| a+b≤3}//kg px, dx, kg bc
Quan hệ nào là quan hệ tương đương, quan hệ nào không là quan hệ tương đương? tại sao? HD:
R3 , R4 là quan hệ tương đương; các quan hệ khác không là qhtđ. 2 1 0 0 1 0 0 0 3 1 4 5 6
8/ Có bao nhiêu quan hệ R có tính phản xạ (đối xứng) trên tập A có n phần tử? HD:
+ Nếu R có tính phản xạ thì R phải có n cặp dạng (a,a) với a∈A. Vậy có thể chọn một số cặp
trong n2-n cặp còn lại bổ sung vào R để tạo ra một quan hệ khác. Số cách chọn bổ sung chính là số tập con của tập n2-n phần tử, vậy số quan hệ có tính phản xạ là2n n( −1)
+ Gọi tập X1 ={(a,a)|a∈A}; X2 ={(a,b)|a,b∈A và a≠b}; số phần tử của X1 là n; số phần tử của X2 là
n2-n ; Ta có thể chọn một số cặp trong X1 và/hoặc một số cặp trong X2 làm các cặp của R. Khi chọn một cặp (a,b) ∈X2 thì cũng phải chọn cặp (b,a)∈X2 . Vây số quan hệ có tính đối xứng là
( 1) / 2
2 * 2n n n−
9/ Hãy tìm một quan hệ trên A={1,2,3,4} sao cho nó có tính chất: a) Phản xạ và đối xứng nhưng không bắc cầu
b) Phản xạ và bắc cầu nhưng không đối xứng c) Đối xứng và bắc cầu nhưng không phản xạ
10/ Trong số các quan hệ dưới đây, hãy cho biết quan hệ nào có tính phản xạ, đối xứng, phản xứng, bắc cầu:
a) C là một tập con cố định của E, xét quan hệ R trên P(E) là tập tất cả các tập con của E: A R B ⇔ A∩C=B∩C
b) quan hệ R trên Z: x R y ⇔x+y chẵn c) quan hệ R trên Z: x R y ⇔x-y lẻ
d) quan hệ R trên ZxZ : (a,b)R(c,d)⇔a≤c e) quan hệ R trên Z: x R y ⇔x2 +y2 chẵn f) quan hệ R trên ¡ : x R y ⇔|x|=|y|
g) quan hệ R trên ¡ : x R y ⇔sin2x+cos2y=1
11/ R là một quan hệ trên A với n phần tử. Cho biết các khẳng định sau đúng hay sai. Nếu sai, chỉ ra một phản ví dụ
a) Nếu R phản xạ thì |R|≥n b) Nếu |R|≥n thì R phản xạ
c) Nếu R1 và R2 là hai quan hệ trên A sao cho R2 ⊃R1 và R1 phản xạ thì R2 phản xạ
d) Kết luận tương tự như c) cho tính đối xứng, phản xứng, bắc cầu.
e) Nếu R1 và R2 là hai quan hệ trên A sao cho R2 ⊃R1 và R2 phản xạ thì R1 phản xạ
f) Kết luận tương tự như e) cho tính đối xứng, phản xứng, bắc cầu.
12/ Quan hệ đối ngẫu R* của quan hệ R được định nghĩa bởi : x R* y ⇔y R x a) Quan hệ đối ngẫu của R* là gì ?
b) Có thể nói gì về R nếu R=R*
c) Nếu R bắc cầu thì R* có bắc cầu không ? Câu hỏi tương tự cho tính đối xứng, phản xứng. 13/ Cho A={1,2,3,4}. Xác định số các quan hệ trên A có tính chất:
a) Phản xạ b) Đối xứng c) Phản xạ và đối xứng d) Phản xứng e) Đối xứng và phản xứng f) Phản xạ, đối xứng và phản xứng.
14/ Giả sử |A|=n và R là tập con lớn nhất của tập AxA sao cho R là một quan hệ phản xứng. Tìm số phần tử của R. Có bao nhiêu quan hệ R thoả điều kiện trên?
a) Kiểm tra lại R là một quan hệ tương đương. b) Tìm các lớp tương đương [1],[2],[3].
c) Tìm phân hoạch của A do R sinh ra.
16/ Cho A={1,2,3,4,5}; A1={1,2}, A2={2,3,4}, A3={5}. Định nghĩa quan hệ R trên A như sau: x R y ⇔ ∃i: 1≤i≤3 và x,y∈Ai
R có phải là quan hệ tương đương không ?
17/ Xét quan hệ R trên ¡ 2sao cho : (x,y) R (z,t) ⇔ x=z a) Chứng minh R là quan hệ tương đương
b) Chỉ ra các lớp tương đương và cho biết ý nghĩa hình học.
18/ Cho A={1,2,3,4,5} và R là quan hệ trên A2 sao cho : (a,b)R(c,d)⇔a+b=c+d a) Kiểm tra lại R là một quan hệ tương đương
b) Xác định các lớp tương đương [(1,3)] ; [(2,4)] ; [(1,1)] c) Chỉ ra phân hoạch của A do R tạo ra.
Bài tập chương 2 : Bài toán đếm
1/ Viết chương trình tính số mất thứ tự Dn bằng hai cách: a) Dùng công thức trực tiếp