Professional Documents
Culture Documents
Báo Cáo Bài Tập Lớn: Đề Tài: Ứng Dụng Của Đại Số Tuyến Tính Trong Qui Hoạch Tuyến Tính Với Bài Toán Vận Tải
Báo Cáo Bài Tập Lớn: Đề Tài: Ứng Dụng Của Đại Số Tuyến Tính Trong Qui Hoạch Tuyến Tính Với Bài Toán Vận Tải
HCM
TRƯỜNG ĐẠI HỌC BÁCH KHOA
III. CÁC PHƯƠNG PHÁP GIẢI BÀI TOÁN VẬN TẢI ....................................9
IV. CÁC BƯỚC GIẢI BÀI TOÁN VẬN TẢI CÂN BẰNG THU PHÁT ...........9
V. CODE MATHLAB GIẢI BÀI TOÁN CÂN BẰNG THU PHÁT ................11
2
ỨNG DỤNG CỦA ĐẠI SỐ TUYẾN TÍNH TRONG QUY HOẠCH TUYẾN TÍNH
VỚI BÀI TOÁN VẬN TẢI
Bài toán vận tải (transportation problem) là bài toán quan trọng nhất trong các bài toán
qui hoạch tuyến tính. Người ta tổng kết rằng 85% các bài toán qui hoạch tuyến tính gặp
trong ứng dụng là bài toán vận tải hoặc mở rộng của nó. Thuật ngữ bài toán vận tải thường
được hiểu là bài toán vận chuyển sao cho cước phí nhỏ nhất.
Có m nơi 𝐴1 , 𝐴2 , … 𝐴𝑚 cung cấp cùng một một loại hàng hóa với khối lượng tương ứng
là a1, a2,....,am. . Hàng được cung cấp cho n nơi B1, B2,...., Bn với khối lượng tiêu thụ tương
ứng là b1, b2,....,bn. Cước phí chuyên chở một đơn vị hàng từ điểm phát Ai đến điểm thu
Bj là cij . Hãy lập phương án vận chuyển sao cho tổng chi phí vận chuyển là nhỏ nhất.
Hàm mục tiêu: tổng cước phí vận chuyển là nhỏ nhất.
𝑚 𝑛
∑ 𝑥𝑖𝑗 = 𝑎𝑖 (𝑖 = 1, 𝑚)
𝑖=1
Thu đủ hàng
𝑛
∑ 𝑥𝑖𝑗 = 𝑏𝑗 (𝑗 = 1, 𝑛)
𝑗=1
3
Cân bằng thu phát
thu (cầu) là ∑𝑛𝑗 𝑏𝑗 bằng nhau ta nói rằng cân bằng cung cầu (hay cân bằng thu phát).
Người ta thường trình bày bài toán vận tải dưới dạng bảng như sau:
Thu 𝑏1 𝑏2 ⋯ 𝑏𝑛
Phát
𝑎1 𝑐11 𝑐12 𝑐1𝑛
𝑥11 𝑥12 𝑥1𝑛
𝑎2 𝑐21 𝑐22 𝑐2𝑛
𝑥21 𝑥22 𝑥2𝑛
...
Trong đó:
Có n trạm thu hàng và khối lượng hàng tiêu thụ tương ứng là bn
Có m trạm phát hàng và khối lượng hàng cung cấp tương ứng là am
Cước phí chuyên chở một đơn vị hàng từ trạm phát đến trạm thu là cij
Với 𝑖 = 1, 𝑚 𝑣à 𝑗 = 1, 𝑛
● Trên cùng một dòng hay một cột không có quá hai ô chọn.
● Hai ô chọn liên tiếp thì nằm trên cùng một dòng hay một cột.
Tính chất 1: Một bảng vận tải có m dòng, n cột thì tập các ô chọn không chứa
chu trình có tối đa m + n - 1 ô.
5
Tính chất 2: Với một phương án có đủ m + n - 1 ô chọn không chứa chu
trình, thì với bất kỳ một ô loại nào được đưa vào phương án thì sẽ tạo thành
một chu trình và chu trình này là duy nhất.
Ví dụ 3. Xét bảng vận tải 3 dòng, 4 cột với một phương án có 3+4-1= 6 ô chọn cho
như sau:
Khi ta thêm một ô loại bất kỳ thì ô loại này kết hợp với một số ô chọn này tạo thành
chu trình. Chẳng hạn, ta thêm ô loại (1,2) vào phương án thì ô này sẽ kết hợp với các ô
(3,2); (3,3); (2,3); (2,1); (1;1) tạo thành chu trình.
6
Định lý 1: Một phương án được gọi là phương án cực biên của bài toán vận tải khi
và chỉ khi tập các ô chọn của nó không chứa chu trình.
Định lý 2: Một phương án cực biên có m + n - 1 ô chọn được gọi là phương án cực
biên không suy biến. Ngược lại, một phương án cực biên có ít hơn m + n - 1 ô chọn
được gọi là phương án cực biên suy biến.
Thu
20 40 70 30
Phát
1 4 5 7
50
20 30
9 6 9 3
20
10 10
4 6 1 5
40
40
1 2 3 5
50
20 30
7
Ví dụ 5. Phương án sau là phương án cực biên suy biến:
Thu
60 70 40 30
Phát
12 6 9 12
100
70 30
9 8 7 11
80
60 20
11 7 6 10
20
20
8
III. CÁC PHƯƠNG PHÁP GIẢI BÀI TOÁN VẬN TẢI
1. Phương pháp cước phí thấp nhất
Chọn ô có cước phí bé nhất. Điền vào ô đó giá trị lớn nhất có thể
Loại bỏ các ô mà trạm phát hàng hết khả năng cung cấp hoặc trạm thu hàng hết nhu
cầu.
Xác định lại ô có chi phí bé nhất trong các ô còn lại và tiếp tục làm giống như 2
bước trên cho tới khi nào hết khả năng phân phối.
Trong quá trình chọn ô phân phối có nhiều ô chọn có chi phí nhỏ nhất giống nhau
thì phân phối vào ô nào cũng được. Phương án thu được bằng phương pháp này là
phương án cực biên.
Ta ưu tiên phân phối lượng hàng nhiều nhất vào ô ở góc Tây - Bắc trên bảng vận tải. Khi đó
nếu:
Trạm phát nào đã hết hàng thì ta xóa dòng chứa trạm phát đó.
Trạm thu nào đã nhận đủ hàng thì ta xóa cột chứa trạm thu đó.
Sau đó lặp lại quá trình trên đối với những ô còn lại. Phương án được thành lập bằng phương
pháp góc Tây - Bắc là phương án cực biên.
IV. CÁC BƯỚC GIẢI BÀI TOÁN VẬN TẢI CÂN BẰNG THU PHÁT
Bước 1: Kiểm tra cân bằng thu phát
• Nếu ∑𝑚 𝑛
𝑖 𝑎𝑖 = ∑𝑗 𝑏𝑗 thì bài toán cân bằng thu phát → chuyển sang bước 3
• Nếu ∑𝑚 𝑛
𝑖 𝑎𝑖 ≠ ∑𝑗 𝑏𝑗 thì bài toán không cân bằng thu phát → tiếp tục bước 2
9
Thêm vào các trạm phát/ thu giả có cước phí 𝐶𝑖𝑛+1 = 0 để chuyển bài toán thành cân bằng.
Trường hợp phát > thu → thêm trạm thu giả 𝑏𝑛+1 với lượng hàng = ∑ 𝑝ℎá𝑡 − ∑ 𝑡ℎ𝑢
Trường hợp phát < thu → thêm trạm phát giả 𝑎𝑚+1 với lượng hàng = ∑ 𝑡ℎ𝑢 − ∑ 𝑝ℎá𝑡
Thành lập phương án cực biên ban đầu theo nguyên lý phân bổ tối đa với các ô chọn phân bổ
bằng các phương pháp: góc Tây Bắc, cước phí thấp nhất,…
Bước 4: Kiểm tra phương án suy biến hay không suy biến
• Phương án không suy biến là phương án có số ô chọn đúng bằng số ô trạm phát + số ô
trạm thu –1 → chuyển tới bước 6
• Phương án suy biến là phương án có số ô chọn < số ô trạm phát + số ô trạm thu –1 →
tiếp tục bước 5
Bổ sung thêm các ô loại bất kì của bảng làm ô chọn giả (lượng hàng phân bổ 𝑥𝑖𝑗 = 0) cho
đủ (𝑚 + 𝑛 − 1) ô chọn và đảm bảo không tạo thành chu trình.
𝑢𝑖 + 𝑣𝑗 + 𝑐𝑖𝑗 = 0
Với mọi (i, j) là các ô chọn (chỉ tính tại các ô chọn)
10
- Nếu có ∆𝑖𝑗 < 0 → Phương án không tối ưu và chuyển sang bước 8.
Bước 8: Xây dựng phương án mới tốt hơn (lập bảng mới):
• Tìm một ô (r,s) là ô có ∆𝑖𝑗 < 0 𝑣à 𝑛ℎỏ 𝑛ℎấ𝑡
• Tìm một chu trình xuất phát từ ô (r,s)
- Tìm chu trình: từ ô (r,s) kẻ các đường thẳng ngang hoặc dọc nối tới các ô chọn
trong bảng, rồi từ ô chọn đó nối tới các ô chọn khác cho đến khi quay trở lại ô (r,s);
các đường nối này phải thỏa mãn:
. Trên mỗi hàng hoặc cột chỉ có hai ô chọn
. Hai ô liên tiếp luôn trên cùng hàng hoặc cùng cột
• Đánh dấu (+) vào ô (r,s); dấu trừ (–) vào ô kế tiếp, rồi dấu (+),… cho đến hết vòng
• Tìm q = min{𝒙𝒊𝒋 } với 𝒙𝒊𝒋 thuộc các ô đánh dấu (–)
➢ Ô chọn nào là ô có dấu cộng (+) thì giá trị 𝒙𝒊𝒋 tại đó cộng thêm q
➢ Ô chọn nào là ô có dấu cộng (–) thì giá trị 𝒙𝒊𝒋 tại đó trừ thêm q
➢ Ô chọn nào không có dấu cộng (+) và trừ (–) thì giữ nguyên giá trị 𝒙𝒊𝒋
• Quay lại Bước 6 và thực hiện cho đến khi tìm được phương án tối ưu.
r = 0.01;
x = zeros(m+1,n+1);
s1 = zeros(m,1);
d1 = zeros(1,n);
sumd = 0;
sumd1 = 0;
11
for j = 1 : n
sumd = sumd + d(j);
d1(j) = d(j);
sumd1 = sumd1 + d1(j);
end
sums = 0;
sums1 = 0;
for i = 1 : m
sums = sums + s(i);
s1(i) = s(i);
sums1 = sums1 + s1(i);
end
if sums ~= sumd
disp('Bai toan cung khac cau!');
return
end
for j = 1 : n
while d1(j) > 0
for i = 1 : m
if s1(i) > 0 && d1(j) > 0
t = i;
k = j;
break
end
end
12
x(t,k) = d1(k);
d1(k) = 0;
s1(t) = 0;
end
end
end
cost = 0;
for i = 1 : m
for j = 1 : n
if x(i,j) > 0
cost = cost + x(i,j)*c(i,j);
end
end
end
NonBasic = 0;
for i = 1 : m
for j = 1 : n
if x(i,j) > 0
NonBasic = NonBasic + 1;
end
end
end
Check = m + n - 1;
if NonBasic >= Check
disp('Tong Chi Phi:');
disp(cost);
degen = 0;
else
disp('Tong Chi Phi:');
disp(cost);
degen = 1;
end
13
if degen == 1
NumDegen = Check - NonBasic;
CountDegen = 0;
for A = 1 : NumDegen
CountDegen = CountDegen + 1;
for j = 1 : n
CountCol = 0;
for i = 1 : m
if x(i,j) > 0
CountCol = CountCol + 1;
end
end
x(m+1,j) = CountCol;
end
for i = 1 : m
CountRow = 0;
for j = 1 : n
if x(i,j) > 0
CountRow = CountRow + 1;
end
end
x(i,n+1) = CountRow;
end
for j = 1 : n - 1
if x(m+1,j) == 1
jEnter = j;
for i = 1 : m - 1
if x(i,n+1) == 1
iEnter = i;
break
end
end
end
end
if x(iEnter,jEnter) == 0
x(iEnter,jEnter) = r;
14
break
end
end
for j = 1 : n
for i = 1 : m
if x(i,j) == r
d(j) = d(j) + r;
end
end
end
for i = 1 : m
for j = 1 : n
if x(i,j) == r
s(i) = s(i) + r;
end
end
end
end
countxdegen=0;
for i = 1 : m
for j = 1 : n
if x(i,j) > 0
countxdegen = countxdegen + 1;
end
end
end
if countxdegen >= Check;
else
disp('Do not correct Degeneracy VAM');
end
CountStep = 0;
for A = 1 : m*n
CountStep = CountStep + 1;
nonx = zeros(m,n);
for j = 1 : n
for i = 1 : m
15
if x(i,j) == 0
nonx(i,j) = 1;
end
end
end
CostLoop = zeros(m,n);
for j = 1 : n
for i =1 : m
if x(i,j) > 0
CostLoop(i,j) = inf;
end
end
end
for k = 1 : (m*n)
countnon=0;
for j=1:n
for i=1:m
if nonx(i,j)==1
ibas=i;
jbas=j;
countnon=1;
end
if countnon==1
nonx(ibas,jbas)=inf;
break
end
end
if countnon==1
break
end
end
% Construct the equivalent basic cell matrix
x11=zeros(m+1,n+1);
x22=zeros(m+1,n+1);
16
for j=1:n
for i=1:m
if x(i,j)>0
x11(i,j)=x(i,j);
x22(i,j)=x(i,j);
end
end
end
%% Construct stepping stone path for searching the improvement index
for j=1:n
for i=1:m
x11(ibas,jbas)=inf;
x22(ibas,jbas)=inf;
end
end
% Count the number of the basic cell on each row and column
for j=1:n
countcol=0;
for i=1:m
if x11(i,j)>0
countcol=countcol+1;
end
end;
x11(m+1,j)=countcol;
x22(m+1,j)=countcol;
end
for i=1:m
countrow=0;
for j=1:n
if x11(i,j)>0
countrow=countrow+1;
end
end
x11(i,n+1)=countrow;
x22(i,n+1)=countrow;
17
end
%% Eliminate the basic variables that has only one on each row
iterationloop=0;
for i=1:m
iterationloop=iterationloop+1;
for i=1:m
if x22(i,n+1)==1
ieliminate=i;
for j=1:n
if x22(ieliminate,j)<inf && x22(ieliminate,j)>0
jeliminate=j;
x22(ieliminate,jeliminate)=0;% Eliminate the basic variable on
row
x22(ieliminate,n+1)=x22(ieliminate,n+1)-1; % decrease the number
of the basic variable on row one unit
x22(m+1,jeliminate)=x22(m+1,jeliminate)-1; % decrease the number
of the basic variable on column one unit
end
end
end
end
%% Eliminate the basic variables that has only one on each column
for j=1:n
if x22(m+1,j)==1
jeliminate1=j;
for i=1:m
if x22(i,jeliminate1)<inf && x22(i,jeliminate1)>0
ieliminate1=i;
x22(ieliminate1,jeliminate1)=0;% Eliminate the basic variable
on row
x22(m+1,jeliminate1)=x22(m+1,jeliminate1)-1; % decrease the
number of the basic variable on column one unit
x22(ieliminate1,n+1)=x22(ieliminate1,n+1)-1;% decrease the
number of the basic variable on row one unit
end
end
end
end
18
%% Control the constructing loop path
for j=1:n
for i=1:m
if (x22(i,n+1)==0 || x22(i,n+1)==2) && (x22(m+1,j)==0 || x22(m+1,j)==2)
break
else
end
end
end
end
%% Make +/-sign on basic variables in the loop path (x2)
%1. Add - sign on basic variable on row(imax) and on basic variable on
%column (jmax)
for j=1:n
jneg=j;
x22(ibas,jneg)=(-1)*x22(ibas,jneg);
x22(m+1,jneg)=1;
x22(ibas,n+1)=1;
for i=1:m
if (x22(i,jneg)>0 && x22(m+1,jneg)==1)
ineg=i;
end
end
end
end
for p=1:n
for j=1:n
if (j~=jneg && x22(ineg,j)>0 && x22(ineg,n+1)==2)
19
jneg1=j;
x22(ineg,jneg1)=(-1)*x22(ineg,jneg1);
x22(ineg,n+1)=1;
x22(m+1,jneg1)=1;
for i=1:m
if (x22(i,jneg1)>0 && x22(m+1,jneg1)==1)
ineg1=i;
ineg=ineg1;
jneg=jneg1;
end
end
end
end
% Control loop
if jneg1==jbas
%break
end
end
%% Compute the improvement index (based on the unit cost of each basic cell)
sumloop=0;
for i=1:m
for j=1:n
if x22(i,j)~=0
icost=i;
jcost=j;
if x22(icost,jcost)>0
sumloop=sumloop+c(icost,jcost);
elseif x22(icost,jcost)<0
sumloop=sumloop+(-1)*c(icost,jcost);
end
end
end
20
end
CostLoop(ibas,jbas)=sumloop;
end
%% Loop controller
countcontrol=0;
for j=1:n
for i=1:m
if CostLoop(i,j)>=0
countcontrol=countcontrol+1;
end
end
end
if countcontrol==m*n
return
end
if x(i,j)>0
21
x33(i,j)=x(i,j);
x44(i,j)=x(i,j);
end
end
end
%% Construct stepping stone path for searching the improvement index
for j=1:n
for i=1:m
x33(ismall,jsmall)=inf;
x44(ismall,jsmall)=inf;
end
end
% Count the number of the basic cell on each row and column
for j=1:n
countcol1=0;
for i=1:m
if x33(i,j)>0
countcol1=countcol1+1;
end
end
x33(m+1,j)=countcol1;
x44(m+1,j)=countcol1;
end
for i=1:m
countrow1=0;
for j=1:n
if x33(i,j)>0
countrow1=countrow1+1;
end
end
x33(i,n+1)=countrow1;
x44(i,n+1)=countrow1;
end
% Eliminate the basic variables that has only one on each row
iterationloop1=0;
for i=1:m
22
iterationloop1=iterationloop1+1;
for i=1:m
if x44(i,n+1)==1
ieliminate3=i;
for j=1:n
if x44(ieliminate3,j)<inf && x44(ieliminate3,j)>0
jeliminate3=j;
x44(ieliminate3,jeliminate3)=0;% Eliminate the basic variable on
row
x44(ieliminate3,n+1)=x44(ieliminate3,n+1)-1; % decrease the
number of the basic variable on row one unit
x44(m+1,jeliminate3)=x44(m+1,jeliminate3)-1; % decrease the
number of the basic variable on column one unit
end
end
end
end
%% Eliminate the basic variables that has only one on each column
for j=1:n
if x44(m+1,j)==1
jeliminate4=j;
for i=1:m
if x44(i,jeliminate4)<inf && x44(i,jeliminate4)>0
ieliminate4=i;
x44(ieliminate4,jeliminate4)=0;% Eliminate the basic variable
on row
x44(m+1,jeliminate4)=x44(m+1,jeliminate4)-1; % decrease the
number of the basic variable on column one unit
x44(ieliminate4,n+1)=x44(ieliminate4,n+1)-1;% decrease the
number of the basic variable on row one unit
end
end
end
end
23
%% Control the constructing loop path
for j=1:n
for i=1:m
end
end
end
end
jneg=j;
x44(ismall,jneg)=(-1)*x44(ismall,jneg);
x44(m+1,jneg)=1;
x44(ismall,n+1)=1;
for i=1:m
if (x44(i,jneg)>0 && x44(m+1,jneg)==1)
ineg=i;
end
end
end
end
for p=1:n
for j=1:n
24
if (j~=jneg && x44(ineg,j)>0 && x44(ineg,n+1)==2)
jneg1=j;
x44(ineg,jneg1)=(-1)*x44(ineg,jneg1);
x44(ineg,n+1)=1;
x44(m+1,jneg1)=1;
for i=1:m
if (x44(i,jneg1)>0 && x44(m+1,jneg1)==1)
ineg1=i;
ineg=ineg1;
jneg=jneg1;
end
end
end
end
% Control loop
if jneg1==jsmall
% return
end
end
% Eliminate column j that has the number of basic variables =2
for j=1:n
if x44(m+1,j)==2
for i=1:m
if x44(i,j)>0
x44(i,j)=0;
end
end
x44(m+1,j)=0;
end
end
%Eliminate row i that has the number of basic variables =2
for i=1:m
if x44(i,n+1)>=2
for j=1:n
25
if x44(i,j)>0
x44(i,j)=0;
end
end
x44(i,n+1)=0;
end
end
%% Searching the absolute smallest path and add this path to
(ismall,jsmall) cell
minpath=inf;
for j=1:n
for i=1:m
if x44(i,j)<0
if abs(x44(i,j))<=minpath
minpath=abs(x44(i,j));
end
end
end
end
%% Add the new path to x matrix
for j=1:n
for i=1:m
if x44(i,j)~=0
x44(i,j)=abs(x44(i,j)+minpath);
if x44(i,j)==0
x44(i,j)=inf;
end
end
end
end
% Add a entering (ismall,jsmall)cell to x matrix
for j=1:n
26
for i=1:m
x44(ismall,jsmall)=minpath;
end
end
%% Combine the new path and the non-degeneracy path
for j=1:n
for i=1:m
if x44(i,j)>0
x(i,j)=x44(i,j);
end
end
end
for j=1:n
for i=1:m
if x(i,j)==inf
x(i,j)=0;
end
end
end
countstepdegen=0;
for i=1:m
for j=1:n
if x(i,j)>0 && x(i,j)~=inf
countstepdegen=countstepdegen+1;
end
end
end
sumdemand=zeros(1,n);
27
for j=1:n
demandsum=0;
for i=1:m
if round(x(i,j))>0
demandsum=demandsum+round(x(i,j));
end
end
sumdemand(j)=demandsum;
end
for j=1:n
if sumdemand(j)~=round(d(j))
disp('Unbalanced demand');
break
end
end
% Check supply
sumsupply=zeros(m,1);
for i=1:m
supplysum=0;
for j=1:n
if round(x(i,j))>0
supplysum=supplysum+round(x(i,j));
end
end
sumsupply(i)=supplysum;
end
for i=1:m
if sumsupply(i)~=round(s(i))
disp('Unbalanced supply');
break
end
end
else
% How to correct the degeneracy problem
28
%% How to correct degeneracy matrix
numstepdegen=reducetant-countstepdegen;
iterationstepDegen=0;
for A=1:numstepdegen
iterationstepDegen=iterationstepDegen+1;
29
for k=1:m*n
for i=1:m
if udual(i)<inf
iu=i;
for j=1:n
if x(iu,j)>0
vdual(j)=c(iu,j)-udual(iu);
end
end
end
end
for j=1:n
if vdual(j)<inf
jv=j;
for i=1:m
if x(i,jv)>0
udual(i)=c(i,jv)-vdual(jv);
end
end
end
end
countu=0;
countv=0;
for i=1:m
if udual(i)<inf
countu=countu+1;
end
end
for j=1:n
if vdual(j)<inf
countv=countv+1;
end
end
if (countu==m & countv==n)
return
end
end
30
unx=zeros(m,n);
for j=1:n
for i=1:m
if x(i,j)==0
unx(i,j)=udual(i)+vdual(j)-c(i,j);
end
end
end
%% Search maximum positive of udual+vdual-c(i,j) to reach a new basic variable
maxunx=0;
for j=1:n
for i=1:m
if unx(i,j)>=maxunx
maxunx=unx(i,j);
imax=i;
jmax=j;
end
end
end
%% Count the number of basic variable on each and row
for j=1:n
sumcol=0;
for i=1:m
if x(i,j)>0
sumcol=sumcol+1;
end
end
x(m+1,j)=sumcol;
end
for i=1:m
sumrow=0;
for j=1:n
if x(i,j)>0
sumrow=sumrow+1;
end
end
31
x(i,n+1)=sumrow;
end
%% Construct the equipvalent x matrix
for j=1:n+1
for i=1:m+1
x1(i,j)=x(i,j);
end
end
%% Eliminate an entering variable for adding a new one
for j=1:n
for i=1:m
if (x(i,j)==r || x1(i,j)==r)
x1(i,j)=0;
end
end
end
% Add a new entering variable to x1 matrix
for j=1:n
for i=1:m
x1(imax,jmax)=r;
end
end
32
end
end
x1(imax,jenter1)=r;
x(imax,jenter1)=r;
% Add demand and supply
for j=1:n
d(jenter1)=d(jenter1)+r;
end
for i=1:m
s(imax)=s(imax)+r;
end
end
end
%The number of basic variable
countopt=0;
for j=1:n
for i=1:m
if x(i,j)>0
countopt=countopt+1;
end
end
end
% Convert x matrix
xpath=zeros(m,n);
for j=1:n
for i=1:m
if x(i,j)>0
xpath(i,j)=round(x(i,j));
end
end
end
% Total cost
Zopt=0;
for j=1:n
for i=1:m
if xpath(i,j)>0
Zopt=Zopt+(xpath(i,j)*c(i,j));
33
end
end
end
disp('Ma tran ket qua:');
disp(xpath);
disp('Tong chi phi:');
disp(Zopt);
end
VI. VÍ DỤ CỤ THỂ
Một công ty may mặc có có 235 tấn hàng hóa ở 3 kho lần lượt tại Quận 5 (45 tấn),
Quận 6 (90 tấn) và Quận 7 (110 tấn). Cần vận chuyển hàng hóa đến các cửa hàng ở
Quận 1, Quận 2, Quận 3, Quận 4 lần lượt các số lượng hàng hóa là 40, 75, 60, 70 tấn..
Chi phí vận chuyển được cho ở bảng dưới đây:
Kho
Quận 5 82 73 74 79
Quận 6 80 75 81 79
Quận 7 80 77 77 82
Bài toán đặt ra là lập kế hoạch vận chuyển hàng từ các kho đến các cửa hàng sao cho
lượng hàng ở các kho phải được lấy đi hết, lượng hàng mà các cửa hàng yêu cầu phải
được đáp ứng đầy đủ và tổng chi phí vận chuyển là thấp nhất.
34
Bài giải
Bước 1: Xác định các ma trận từ đề bài
Bước 2: Nhập các ma trận vừa tìm được vào Command Window
Nhận xét: Qua kết quả thu được từ MATLAB, cho thấy lời giải ban đầu chưa giải ra
được chi phí tối ưu và sau 4 lần lặp lại bài toán đã cho ra được tổng chi phí thấp nhất
cần tìm.
35
DANH MỤC TÀI LIỆU THAM KHẢO
1) Quy hoạch tuyến tính bài toán vận tải
https://www.youtube.com/watch?v=y_kPBQl7GVU&t=2454s
https://www.youtube.com/watch?v=hok-ojKnAKg
https://voer.edu.vn/c/bai-toan-van-tai/78021439/a36107d4
2) Code mathlab giải bài toán cân bằng thu phát
https://123docz.net/document/5861265-code-matlab-giai-bai-toan-van-tai-
transportation.htm
36