You are on page 1of 36

ĐẠI HỌC QUỐC GIA TP.

HCM
TRƯỜNG ĐẠI HỌC BÁCH KHOA


BÁO CÁO BÀI TẬP LỚN


Môn: Đại số tuyến tính

Đề 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
GVHD: Ph.D Đặng Văn Vinh
Lớp: L05
STT Mã số SV Họ Tên
1 2211739 Võ Trung Kiên
2 2212597 Phạm Thành Phú
3 2213546 Hà Huy Toại
4 2213941 Lê Nhật Khánh Việt
5 2214059 Phạm Lư Vỹ
6 2214063 Đào Ngọc Đông Xuân

Thành Phố Hồ Chí Minh, Tháng 12 – 2022


MỤC LỤC

I. BÀI TOÁN VẬN TẢI CÂN BẰNG THU PHÁT ...............................................3

1. Mô hình bài toán .....................................................................................................3

2. Phương án vận chuyển ...........................................................................................3

3. Bảng vận tải ............................................................................................................4

II. CÁC ĐỊNH NGHĨA VÀ ĐỊNH LÝ, TÍNH CHẤT...........................................4

III. CÁC PHƯƠNG PHÁP GIẢI BÀI TOÁN VẬN TẢI ....................................9

1. Phương pháp cước phí thấp nhất ...........................................................................9

2. Phương pháp góc Tây - Bắc ..................................................................................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

VI. VÍ DỤ CỤ THỂ ................................................................................................34

DANH MỤC TÀI LIỆU THAM KHẢO ..............................................................36

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.

I. BÀI TOÁN VẬN TẢI CÂN BẰNG THU PHÁT


1. Mô hình bài toán

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.

2. Phương án vận chuyển

Hàm mục tiêu: tổng cước phí vận chuyển là nhỏ nhất.
𝑚 𝑛

𝑓 = ∑ ∑ 𝑐𝑖𝑗 𝑥𝑖𝑗 → 𝑚𝑖𝑛


𝑖=1 𝑗=1

Các hàm ràng buộc:

Phát hết hàng


𝑚

∑ 𝑥𝑖𝑗 = 𝑎𝑖 (𝑖 = 1, 𝑚)
𝑖=1

Thu đủ hàng
𝑛

∑ 𝑥𝑖𝑗 = 𝑏𝑗 (𝑗 = 1, 𝑛)
𝑗=1

Ràng buộc biên: 𝑥𝑖𝑗 ≥ 0 ∀ 𝑖, 𝑗

3
Cân bằng thu phát

Khi tổng số hàng dự trữ m ở điểm phát (cung) là ∑𝑚


𝑖 𝑎𝑖 và tổng số nhu cầu của n điểm

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).

3. Bảng vận tải

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𝑛
...

𝑎𝑚 𝑐𝑚1 𝑐𝑚2 𝑐𝑚𝑛


𝑥𝑚1 𝑥𝑚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

Khối lượng chở từ trạm phát đến trạm thu là xij

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, 𝑛

II. CÁC ĐỊNH NGHĨA VÀ ĐỊNH LÝ, TÍNH CHẤT


Định nghĩa ô chọn, ô loại

+ Ta viết (i ; j) là ô ở dòng i cột j


+ Trong bảng vận tải, những ô có xij > 0 được gọi là ô chọn, những ô có xij = 0
4
gọi là ô loại.

Định nghĩa đường đi

Đường đi là tập hợp các ô chọn sao cho:

● 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.

Ví dụ 1. Dãy các ô chọn sau tạo thành một đường đi:

Định nghĩa chu trình

Một đường đi khép kín được gọi là một chu trình

Ví dụ 2. Dãy các ô chọn sau tạo thành một chu trình

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.

Ví dụ 4. Phương án sau là phương án cực biên không 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.

2. Phương pháp góc Tây - Bắc

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

Bước 2: Đưa bài toán về cân bằng thu phát

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 = ∑ 𝑡ℎ𝑢 − ∑ 𝑝ℎá𝑡

Bước 3: Tìm phương án xuất phát

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ước 5: Đưa về phương án không suy biến

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.

Bước 6: Tính các thế vị 𝑢𝑖 , 𝑣𝑗


• Chọn một 𝑢𝑖 = 0 hoặc 𝑣𝑗 = 0 (tương ứng với hàng hoặc cột nào mà có nhiều ô chọn
nhất).
• Các 𝑢𝑖 và 𝑣𝑗 còn lại phải thỏa mãn

𝑢𝑖 + 𝑣𝑗 + 𝑐𝑖𝑗 = 0

Với mọi (i, j) là các ô chọn (chỉ tính tại các ô chọn)

Bước 7: Tính ∆𝑖𝑗 tại các ô loại và kết luận

∆𝑖𝑗 = 𝑢𝑖 + 𝑣𝑗 + 𝑐𝑖𝑗 ,∀(i, j)

 Kiểm tra dấu hiệu tối ưu của phương án:

Nếu mọi ∆𝑖𝑗 ≥ 0 → Phương án đang xét tối ưu → Tính fmin

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.

V. CODE MATHLAB GIẢI BÀI TOÁN CÂN BẰNG THU PHÁT


clc;
c = input('Nhap ma tran chi phi:\n');
s = input('Nhap ma tran cung cap (dang cot):\n');
d = input('Nhap ma tran nhu cau (dang d):\n');
[m,n] = size(c);

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

if d1(k) > s1(t)


d1(k) = d1(k) - s1(t);
x(t,k) = s1(t);
s1(t) = 0;
elseif d1(k) < s1(t)
s1(t) = s1(t) - d1(k);
x(t,k) = d1(k);
d1(k) = 0;
elseif d1(k) == s1(t)

12
x(t,k) = d1(k);
d1(k) = 0;
s1(t) = 0;
end
end
end

disp('Loi giai ban dau:');


disp(x);

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

if (x22(ibas,j)~=0 && x22(ibas,j)<inf && x22(ibas,n+1)==2)

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

%% Searching the absolute smallest improvement index


minindex=0;
for j=1:n
for i=1:m
if CostLoop(i,j)<=0
if CostLoop(i,j)<=minindex
minindex=CostLoop(i,j);
ismall=i;
jsmall=j;
end
end
end
end
%% Construct a new stepping stone loop using add the new basic variable to
change in x matrix
% Construct the equivalent basic cell matrix
x33=zeros(m+1,n+1);
x44=zeros(m+1,n+1);
for j=1:n
for i=1:m

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

if (x44(i,n+1)==0 || x44(i,n+1)==2) && (x44(m+1,j)==0 ||


x44(m+1,j)==2)
break

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

if (x44(ismall,j)~=0 && x44(ismall,j)<inf && x44(ismall,n+1)==2)

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

if countstepdegen >= Check

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;

%% Construct the u-v variables


%% Construct the u-v variables
udual=zeros(m,1);
vdual=zeros(1,n);
for i=1:m
udual(i)=inf;
end
for j=1:n
vdual(j)=inf;
end
udual(1)=0;
for i=1:1
for j=1:n
if x(i,j)>0
vdual(j)=c(i,j)-udual(i);
end
end
end
for j=1:1
for i=1:m
if x(i,j)>0
iu=i;
if udual(iu)<inf
vdual(j)=c(i,j)-udual(iu);
else
if vdual(j)<inf
udual(iu)=c(i,j)-vdual(j);
end
end
end
end
end

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

% Seaching and adding the entering point for corrective action


for i=1:m
if i~=imax
if x1(i,jmax)>0
ienter1=i;
for j=1:n
if j~=jmax
if x1(ienter1,j)>0
jenter1=j;
end
end
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:

Cửa hàng Quận 1 Quận 2 Quận 3 Quận 4

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

• Ma trận chi phí: [82 73 74 79; 80 75 81 79; 80 77 77 82]


• Ma trận cung cấp: [45 90 110]
• Ma trận nhu cầu: [40 75 60 70]

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

You might also like