2.4.1 Mô hình bài toán xếp ba lô
Mô hình bài toán xếp ba lô là một trong những mô hình quan trọng trong lý thuyết thuật toán. Chúng ta xét 2 mô hình cơ bản của bài toán:
2.4.1.1 Bài toánxếp ba lô 0-1
Input: + Cho n đồ vật, đồ vật thứ i có thể tích là a(i) + Cho 1 ba lô có thể tích b
Output: Hãy xác định nhóm đồ vật để đặt vừa khít ba lô
Nhận xét:
+ Bài toán trên có thể xác định lời giải chính xác bằng thuật toàn duyệt toàn bộ theo tư tưởng như sau: Hãy duyệt mọi tổ hợp của các đồ vật, ứng với mỗi tổ hợp (i1,i2,..,ik) thử điều kiện a(i1)+a(i2)+…+a(ik)=b để xác định nghiệm đúng. Khi đó số phương án được duyệt chính bằng
1 2 1
... n n 2n
n n n n
C +C + C - +C ; tức là chúng ta có độ phức tạp của thuật toán là hàm mũ.
+ Chúng ta có thể giải bài toán bằng thuật toán không đơn định đa thức như sau: sử dụng hàm: CHOICE(0,1):là hàm chọn các đồ vật. Khi đó bài toán được đưa về bài toán sau đây
Liệu có tồn tại tập chỉ số T{1,2,.. ,n}thỏa mãn ai B
T i . Khi đó bài toán được giải bằng thuật toán sau đây:
For i:=1 to n do xi:= CHOICE({0,1}); if n i i ia x 1
=B then TRUE else FALSE
Thuật toán trở thành thuật toán không đơn định đa thức với độ phức tạp O(n).
“Hãy xác định nhóm đồ vật đặt trong balo sao cho phần thừa còn lại là ít nhất”. Khi đó việc giải bài toán cũng được thực hiện tương tự, tuy nhiên chúng ta phải đưa thêm hàm mục tiêu f=b-(a(i1)+a(i2)+…+a(ik)). Khi đó phương án cần xác định là phương án thỏa mãn f đạt giá trị nhỏ nhất (f>=0).
2.4.1.2 Bài toán xếp ba lô mở rộng
Input: + Cho n đồ vật, đồ vật thứ i có thể tích là ai, có giá trị là pi + Cho 1 ba lô có thể tích b
Output: Hãy xác định nhóm đồ vật thỏa mãn: tổng thể tích không vượt quá ba lô đồng thời tổng giá trị là lớn nhất
Nhận xét:
+ Bài toán trên có thể xác định lời giải chính xác bằng thuật toàn duyệt toàn bộ theo tư tưởng như sau: Kí hiệu (x1,x2,…,xn) là một phương án lựa chọn các đồ vật với xi {0,1}. Khi đó hãy duyệt mọi phương án (x1,x2,…,xn), ứng với mỗi phương án xác định điều kiện
1 1 2 2 ... n n
a x + a x + + a x £ b. Nếu thỏa mãn thì xác định tiếp giá trị hàm mục tiêu f X( ) = p x1 1 + p x2 2 + ...+ p xn n từ đó xác định phương án tốt nhất.
Hiển nhiên bài toán đưa về bài toán duyệt mọi dãy nhị phân có độ dài n với độ phức tạp hàm mũ.
Thuật toán giải được mô tả như sau: using namespace std;
int X[N],A[N],b,P[N],n,fmax,Xluu[N]; void input()
{
cout<<"Nhap so do vat: ";cin>>n; cout<<"Nhap the tich ba lo: ";cin>>b;
cout<<"Nhap the tich cac do vat: ";printf("\n");
cout<<"Nhap gia tri cac do vat : ";printf("\n");
for (int i=1;i<=n;i++) {cout<<"Do vat: "<<i<<" ";cin>>P[i];} fmax=0;
}
void output() { int f,T;
f=0;T=0;
for (int i=1;i<=n;i++) {T=T+X[i]*A[i];f=f+X[i]*P[i];} if ((T<=b)&(f>fmax))
{ fmax=f;
for (int i=1;i<=n;i++) Xluu[i]=X[i];} }
void Try(int k) {
int j;
for (j=0;j<=1;j++)
{ X[k]=j;if (k==n) output();else Try(k+1);} }
int main() { input();
Try(1);
cout<<"Phuong an toi uu: ";
for (int i=1;i<=n;i++) cout<<Xluu[i]<<" "; cout<<"Gia tri toi uu fmax= "<<fmax; }
+ Tương tự, chúng ta có thể giải bài toán bằng thuật toán không đơn định đa thức như sau: sử dụng hàm: CHOICE(0,1): là hàm chọn các đồ vật. Khi đó bài toán được đưa về bài toán sau đây
Liệu có tồn tại tập chỉ số T{1,2,.. ,n} thỏa mãn n i i ix B a 1 và n i i ix p 1
đạt max. Khi đó bài toán được giải bằng thuật toán sau đây:
For i:=1 to n do xi:= CHOICE({0,1}); if n i i ia x 1
<=B then <xác đinh f> else FALSE
Thuật toán trở thành thuật toán không đơn định đa thức với độ phức tạp O(n).
+ Bài toán Knaspack có thể giải bằng thuật toán GA với cấu trúc gen là dãy nhị phân và toán tử lai ghép đa điểm hoặc lại ghép mặt nạ (Xem phụ lục)
2.4.2 Bài toán quân cờ Domino 2.4.2.1 Mô tả bài toán 2.4.2.1 Mô tả bài toán
Định nghĩa 1: Một quân bài Domino là một bộ (a,b) trong đó a là số hàng trên, b là số hàng dưới
a B
Định nghĩa 2: Phép lật quân được hiểu là một phép biến đổi bộ (a,b) thành bộ (b,a)
Bài toán:
Input: Cho n quân bài Domino (a1,b1),(a2,b2),...(an,bn) xếp thành một hàng ngang. Output: Hãy xác định các phép lật quân để sao cho độ chênh lệnh giữa tổng các số hàng trên so với tổng các số hàng dưới đạt giá trị nhỏ nhất.
a1 a2 .... an-1 An
b1 b2 bn-1 Bn
Phân tích
+ Kí hiệu một phương án lật quân là một bộ X=(x1,x2,…,xn) trong đó x(i)=1 tức là lật quân thứ i, x(i)=0 tức là không lật quân thứ i. Khi đó để tìm phương án lật quân tối ưu, chúng ta có thể sử dụng thuật toàn duyệt toàn bộ tất cả các phương án từ đó xác định phương án có độ chênh lệch nhỏ nhất. Kí hiệu hàm mục tiêu 1 ( ) x (b ) n i i i i f x a = = å -
Khi đó sử dụng thuật toán duyệt tất cả các dãy nhị phân độ dài n bằng thuật toán quay lui, ta mô tả thuật toán tìm lời giải chính xác của bài toán trên như sau:
using namespace std;
int X[N],A[N],B[N],n,fmin,Xluu[N]; void swap(int &a,int &b)
{ int tg;tg=a;a=b;b=tg;} void input()
{ int tren,duoi;
tren=0;duoi=0;
cout<<"Nhap so quan bai: ";cin>>n;
cout<<"Nhap gia tri hang duoi: ";printf("\n");
for (int i=1;i<=n;i++) {cin>>A[i];duoi=duoi+A[i];} cout<<"Nhap gia tri hang tren : ";printf("\n");
for (int i=1;i<=n;i++) { cin>>B[i];tren=tren+B[i];}
fmin=abs(tren-duoi); cout<<"Do chenh ban dau "<<fmin<<" "; }
void output()
tren=0;duoi=0;
for (int i=1;i<=n;i++) if (X[i]==1) swap(A[i],B[i]); for (int i=1;i<=n;i++) {tren=tren+B[i];duoi=duoi+A[i];} f=abs(tren-duoi);
if (f<fmin){fmin=f;for (int i=1;i<=n;i++) Xluu[i]=X[i];} }
void Try(int k) {int j;
for (j=0;j<=1;j++)
{ X[k]=j;if (k==n) output();else Try(k+1);} }
int main() { input();
Try(1);
cout<<"Phuong an lat quan toi uu: ";
for (int i=1;i<=n;i++) cout<<Xluu[i]<<" "; cout<<"do chenh be nhat= "<<fmin;
}
Hiển nhiên thuật toán trên có độ phức tạp O(2n).
+ Ta có thể sử dụng thuật toán quy hoạch động để giải bài toán trên như sau: Xây dựng mảng Wi là độ chênh lệch giữa phần trên và phần dưới của quân bài thứ i. Gọi C(i,j) là số các phép lật nhỏ nhất với các quân cờ từ 1 đến i, để hàng trên có tổng là j. Khi đó ta có công thức quy hoạch động:
C(i,j) = min {C(i-1, j-Tren(i)), C(i-1, Duoi(i))+1}.
Từ các C(i,j) ta dễ dàng tìm ra chênh lệch tối thiểu bằng thuật toán quy hoạch động xác định mảng C. Tuy nhiên thuật toán trên cần đòi hỏi số ô nhớ là rất lớn nếu số n là lớn
Có thể thấy rằng mô hình bài toán trên cũng là bài toán thuộc lớp NP.
+ Bài toán Domino có thể giải bằng thuật toán GA với cấu trúc gen là dãy nhị phân và toán tử lai ghép đa điểm hoặc lại ghép mặt nạ (Xem phụ lục)
2.4.3 Mô hình bài toán TSP
Bài toán: Người giao hàng cần đi giao hàng tại n địa điểm. Người giao hàng xuất phát từ một địa điểm xuất phát, đi qua các địa điểm khác để giao hàng và trở về địa điểm ban đầu trong đó yêu cầu mỗi địa điểm chỉ đến một lần. Hãy tìm một chu trình sao cho tổng quãng đường đi là nhỏ nhất.
Định lý 1: Bài toán TSP là NP đầy đủ. (Xem [1]) Nhận xét:
+ Bài toán trên có thể tìm được nghiệm chính xác bằng cách sử dụng chiến lược duyệt toàn bộ các chu trình trong đồ thị bằng thuật toán quay lui từ đó suy ra nghiệm tối ưu. Tuy nhiên độ phức tạp của thuật toán là O(n!) nên thuật toán là không khả thi trong thực tế.
+ Có thể xây dựng thuật toán tìm nghiệm xấp xỉ tìm hành trình gần đúng bằng cách sử dụng thuật toán cây cực tiểu MST-PRIM (áp dụng tìm cây khung nhỏ nhất, hoạt động tương tự Dijkstra) để tìm các lộ trình ngắn nhất trong đồ thị. Thuật toán được mô phỏng như sau
Procedure APPROX-TSP-TOUR:
APPROX-TSP-TOUR(G, c);
1 Lựa chọn đỉnh r V(G) là một đỉnh “gốc”.
2 Tăng tưởng một cây tỏa nhánh cực tiểu T cho G từ gốc r
(dùng MST-PRIM (G, c, r)) – Thuật toán tìm cây tỏa nhánh cực tiểu.
3 Cho L là danh sách các đỉnh được ghé thăm trong một tầng cây tiền cấp của T.
4 Return chu trình hamilton H ghé thăm các đỉnh theo thứ tự L có độ dài nhỏ nhất.
Ta có thể chứng minh thuật toán APPROX-TSP-TOUR với một số điều kiện nào đó về bộ dữ liệu đầu vào sẽ trả về một hành trình gần tối ưu .
Định lý 2: APPROX-TSP-TOUR là một thuật toán xấp xỉ có một cận tỷ số là 2 cho bài toán người bán hàng với bất đẳng thức tam giác” (Xem [1]).
Thời gian thực hiện của APPROX-TSP-TOUR là O(E) = O(V2), trong thời gian đa thức. Thuật toán APPROX-TSP-TOUR trả về một hành trình có mức hao phí không nhiều hơn gấp hai lần mức hao phí của một hành trình tối ưu.
+ Bài toán TSP có thể giải bằng thuật toán GA với vấn đề chọn cấu trúc gen là dãy hoán vị và toán tử lai ghép đặc biệt (Xem [2])
Chương 3.
ỨNG DỤNG GIẢI THUẬT DI TRUYỀN
GIẢI BÀI TOÁN LẬP LỊCH GIẢNG DẠY THỰC HÀNH 3.1 Mô hình bài toán thực tế
Trong lớp các bài toán dạng NP và NPC thì lớp các bài toán lập lịch là một lớp các bài toán rất quan trọng trong thực tế, có thể kể đến các mô hình: Lập lịch kế hoạch sản xuất trong các xí nghiệp, lập lịch giảng dạy trong các trường học, lập lịch bay cho các sân bay,… Trong luận văn, chúng tôi sẽ nghiên cứu chi tiết bài toán lập lịch hướng dẫn thực hành tại mô hình trường cao đẳng dạy nghề. Mô hình được tham khảo từ trường Cao đẳng Cơ khí Luyện kim.
Chúng ta xét bài toán: Giả sử có một danh sách gồm NS các giáo viên giảng dạy thực hành và một danh sách gồm NP các phòng giảng dạy thực hành nghề cho sinh viên (Tiện, hàn, Cơ, Điện, Điện tử, Rèn,…). Biết rằng mỗi giáo viên chỉ có thể hướng dẫn thực hành tại một số phòng thực hành phù hợp với chuyên môn đào tạo và đồng thời mỗi giáo viên chỉ có thể sẵn sàng nhận hướng dẫn thực hành theo lịch trong một số buổi xác định. Yêu cầu xếp lịch hướng dẫn thực hành cho tất cả các giáo viên tại tất cả các phòng thực hành trong 1 số hữu hạn các buổi để sao cho tại mọi buổi, tất cả các phòng thực hành phải có giáo viên hướng dẫn phù hợp với chuyên môn đào tạo đồng thời số buổi hướng dẫn của các giảng viên là tương đương nhau.
Xuất phát từ bài toán trên, chúng ta có mô hình toán học chi tiết cho bài toán như sau:
Input
- Tập S={1,2,…,NS} số hiệu các giáo viên.
- Tập P={1,2,…,NP} số hiệu các phòng thực hành.
- Tập T={1,2,…,NT} số hiệu các buổi trong lịch toàn lịch hướng dẫn.
số hiệu s trong buổi hướng dẫn thứ t trong đó TS(s,t)=1 là sẵn sàng, TS(s,t)=0 là không sẵn sàng
- Mảng PS(s,p) biểu diễn sự phù hợp chuyên môn giữa các giáo viên và phòng thực hành trong đó: PS(s,p)=1 chuyên môn giáo viên số hiệu s phù hợp với phòng thực hành p, PS(s,p)=0 – Không phù hợp.
Các biến số
-Các biến quyết định X(p,t)=s – Giáo viên s được xếp vào phòng thực hành p trong buổi hướng dẫn t.
-Các biến C(s) - Ghi lại tổng số buổi hướng dẫn của giáo viên s trong toàn lịch phân công giảng dạy.
Các điều kiện ràng buộc:
H1: Tại một thời điểm t, 1 giáo viên chỉ được hướng dẫn nhiều nhất là 1 phòng thực hành.
H2: Chỉ xếp lịch hướng dẫn cho các giáo viên sẵn sàng trong buổi giảng dạy. H3: Các giáo viên chỉ được phép hướng dẫn tại các phòng thực hành phù hợp về chuyên môn.
H4: Tại mọi thời điểm, các phòng thực hành đều phải có giáo viên hướng dẫn.
Output
Hãy xếp lịch phân công hướng dẫn thực hành cho tất cả các giáo viên thỏa mãn tất cả các ràng buộc H1,…,H4 sao cho tại mọi buổi, tất cả các phòng thực hành phải có giáo viên hướng dẫn phù hợp với chuyên môn đào tạo đồng thời số buổi hướng dẫn của các giảng viên là tương đương nhau.
Nhận xét: Bài toán trên là một dạng bài toán quy hoạch rời rạc có ràng buộc phi tuyến tính. Để nhận được lời giải đúng, chúng ta có thể sử dụng phương pháp duyệt toàn bộ từ đó kiểm tra các điều kiện để từ đó suy ra nghiệm tối ưu. Tuy nhiên việc thiết kế thuật toán duyệt toàn bộ là rất khó đồng thời độ phức tạp của thuật toán là hàm mũ. Do đó phương án duyệt toàn bộ là không khả thi. Sau đây chúng ta sẽ nghiên cứu việc thiết kế lời giải bài toán bằng giải thuật di truyền.
3.2 Thiết kế giải thuật di truyền GA
3.2.1 Xây dựng cấu trúc cá thể, các hàm kiểm tra
Lựa chọn cấu trúc cá thể (phương án): Kí hiệu 1 phương án xếp lịch là một ma trận X(NP,NT) trong đó X(p,t)=s, s S được hiểu là phân giáo viên có số hiệu s hướng dẫn phòng thực hành p, pP tại buổi t, t T . Như vậy tập hợp các phương án chính là tập hợp các ma trận các phần tử là các số nguyên dương 0<x<NS+1 có số chiều NP×NT.
Xây dựng hàm C(s) chính bằng tổng tất cả các phần tử trong ma trận phương án X thỏa mãn điều kiện X(p,t)=s, với mọi 1 p NP;1 t NT; Như vậy C(s) chính là tổng số buổi hướng dẫn của giáo viên s trong toàn lịch phân công giảng dạy.
Các ràng buộc cứng:
+ H1: Tại một thời điểm t, 1 giáo viên chỉ được giảng dạy nhiều nhất là 1 phòng thực hành sẽ tương đương với điều kiện: Trên một cột của ma trận X không tồn tại 2 phần tử bằng nhau. Chúng ta kí hiệu hàm FH1(X) để kiểm tra điều kiện H1 trong phương án X.
+ H2: Chỉ xếp lịch giảng dạy cho các giáo viên sẵn sàng trong buổi giảng dạy tương ứng sẽ tương đương với điều kiện: Nếu X(p,t)=s thì T(s,t)=1 hay T(X(p,t),t)=1.
+ H3: Các giáo viên chỉ được phép hướng dẫn tại các phòng thực hành phù hợp về chuyên môn đào tạo sẽ tương đương với điều kiện: Nếu X(p,t)=s thì P(s,p)=1 hay P(X(p,t),p)=1.
Kết hợp 2 điều kiện H2 và H3, điều kiện thỏa mãn đồng thời H2 và H3 chính là
T(X(p,t),t)× P(X(p,t),p)=1; với mọi 1 p NP;1 t NT;
Chúng ta kí hiệu hàm FH23(X) là hàm kiểm tra điều kiện H2 và H3 trong phương án X.
+ H4: Tại mọi thời điểm, các phòng thực hành đều phải có giáo viên hướng dẫn sẽ tương đương với tất cả các phần tử trong ma trận X đều dương.
X(p,t)>0; với mọi 1 p NP;1 t NT; Chúng ta kí hiệu hàm FH4(X) để kiểm tra điều kiện H4.
Hàm mục tiêu của bài toán: Vì tổng số các buổi hướng dẫn của các giáo viên luôn bằng NP×NT (Giả thiết tất cả các phòng thực hành đều phải xếp kín tất cả các buổi), do đó để đảm bảo yêu cầu của bài toán: số các buổi hướng dẫn của các giáo viên là xấp xỉ bằng nhau sẽ tương đương với: Hãy xác định phương án X thỏa mãn tất cả các ràng buộc để sao cho hàm mục tiêu:
1 ( ) ( ) ax S s F X C s m
Như vậy bài toán lập lịch giảng dạy được đưa về bài toán: Hãy xác định phương án X thỏa mãn các ràng buộc mô tả bởi các hàm ràng buộc FH1(X), FH23(X), FH4(X) để sao cho hàm mục tiêu ( )F X max
3.2.2 Xây dựng các toán tử trong GA
Các tham số đầu vào thuật toán
+ NS – Số các giáo viên cần xếp lịch giảng dạy (Các giáo viên được đánh số liên tiếp từ 1..NS)
+ NP – Số các phòng thực hành (Các phòng được đánh số liên tiếp từ 1..NP). + NT - số các buổi trong lịch giảng dạy (Các buổi được đánh số liên tiếp từ 1..NT)
+ Mảng TS mô tả trạng thái sẵn sàng của các giáo viên + Mảng PS mô tả sự phù hợp chuyên môn của các giáo viên + Biến size – Kích thước của quần thể khởi tạo