Tải bản đầy đủ (.pdf) (24 trang)

QUY HOẠCH RỜI RẠC - CHƯƠNG 3 pps

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (589.99 KB, 24 trang )


Bùi Thế Tâm III.1 Quy hoạch rời rạc
Chương 3
THUẬT TOÁN GOMORY THỨ NHẤT
Trong chương này sẽ trình bày thuật toán Gomory thứ nhất và chứng minh sự hội
tụ của nó.
1. TƯ TƯỞNG PHƯƠNG PHÁP CẮT
1.1. Việc giải bài toán quy hoạch tuyến tính nguyên (,)
N
LC có dẫn tới việc giải
một bài toán quy hoạch tuyến tính
(, )AC không ?
Định lý 1. Giả sử L là một đa diện lồi,
N
L là tập các điểm nguyên của nó,
()
N
RVL≡ là bao lồi tuyến tính của tập các điểm nguyên
N
L
. Khi đó:
1)
()
N
RVL≡ là một đa diện nguyên (các đỉnh đều là nguyên)
2)
NN
RL= (1)
3) Tập
*
R


các phương án tựa của đa diện
R
chứa trong
N
R
:

* N
RR⊆ (2)

Chứng minh
1) Chứng minh
R là một đa diện nguyên ? Vì L là một đa diện lồi nên
N
L
là tập
hữu hạn

()
N
RVL≡ là tổ hợp lồi tuyến tính của một tập hữu hạn . Vì vậy, R là
một đa diện , đồng thời

* N
RL⊆ (3)
(tức là
R là đa diện nguyên).
2) Chứng minh
NN
RL= ?

Từ định nghĩa bao lồi tuyến tính suy ra

()
NN
LVL R⊆≡⇒
NN
LR⊆ . (4)
Ta phải chứng minh:

NN
RL⊆
? (5)
Thật vậy, giả sử lấy

N
xR∈ , (6)

N
LL⊆ nên ()
N
RVL= ()VL⊆ L= . Vì vậy

N
x
RRL∈⊆⊆ (7)
Từ (6) và (7) suy ra
N
xL∈ (vì x là nguyên thuộc L), vậy (5) được chứng minh.
Từ (4) và (5) suy ra đẳng thức (1) đúng.
3) Chứng minh

* N
RR⊆ ? Từ (3) và (1) suy ra (2) đúng.

Bùi Thế Tâm III.2 Quy hoạch rời rạc

Hệ quả 1
. Giả sử (, )XRC là phương án tựa tối ưu của bài toán (, )RC , khi đó
(, )XRC cũng là phương án tối ưu của bài toán (,)
N
LC. Vì vậy để giải bài toán quy
hoạch tuyến tính nguyên
(,)
N
LC
ta đi giải bài toán
(, )RC
.
1.2. Ta sẽ chứng minh: ()
N
RVL= là đa diện nguyên duy nhất mà tập các điểm
nguyên của nó trùng với
N
L .
Định lý 2. Giả sử L là một đa diện lồi, U là một đa diện lồi nguyên và

NN
UL= (8)
Khi đó

()

N
URVL== (9)
Chứng minh. Từ (8) trực tiếp suy ra

RU⊆ (10)
( vì
() ( )
NN
R
VL VU U== ⊆)
Ta phải chứng minh:

U
⊆ R ? (11)

U
là đa diện nguyên (tất cả các đỉnh của nó là nguyên) và (8) nên
*
U ⊆
NN
UL= ,
suy ra
U =
*
()VU ⊆ ()
N
VL ≡
R
. Vậy (11) là đúng
Từ (10) và (11) ta có điều cần chứng minh (9).

1.3.Ví dụ

Bùi Thế Tâm III.3 Quy hoạch rời rạc

BÀI TOÁN
(,)
N
LC

BÀI TOÁN
(, )LC
BÀI TOÁN
(,)
N
RVLC≡
Max
1
x
+
2
x

12
211 38xx+ ≤

12
7xx+ ≤
12
45 5xx−≤
0

j
x ≥

nguyên
j
x

Max(
1
x
+
2
x
)
12
211 38xx+ ≤ (a)
12
7xx+ ≤ (b)
12
45 5xx−≤ (c)
0
j
x ≥

Max(
1
x
+
2
x

)
2
3x ≤

12
5xx+ ≤
12
1xx−≤
0
j
x ≥


Max=5. Max=7 Max=5
Tối ưu là 2 điểm Tối ưu là một đoạn Tối ưu là đoạn
(2,3); (3,2) [ (
13
3
;
8
3
); (
40
9
;
23
9
)] [(2,3);(3,2) ]

1.4. Từ Hệ quả 1 chỉ ra khả năng xấp xỉ đúng bài toán (,)

N
LC bằng bài toán quy
hoạch tuyến tính
(, )RC nhưng không cho phương pháp xác định bài toán ()
N
RVL= .
Do đó xuất hiện vấn đề: cho một đa diện lồi
L , tìm bao lồi ()
N
VL các điểm nguyên của

? Vấn đề này nói chung cũng khó như chính việc giải bài toán quy hoạch tuyến tính
nguyên.
1.5. Khi xây dựng ()
N
VL ta đã không sử dụng thông tin về hàm mục tiêu CX
của bài toán quy hoạch tuyến tính nguyên. Vậy có nên tìm một bài toán quy hoạch
tuyến tính
(, )AC theo bài toán (,)
N
LC sao cho thoả mãn 3 điều kiện:
1) (,)
N
CX L C = (, )CX A C (các trị tối ưu trùng nhau) (12)

Bùi Thế Tâm III.4 Quy hoạch rời rạc
2)
NN
AL=
( tập các điểm nguyên bằng nhau ) (11)

3) Tất cả các phương án tựa tối ưu của bài toán quy hoạch tuyến tính
(, )AC đều
thoả mãn điều kiện nguyên:

*cN
AA A∩⊆ (14)
(tong đó
c
A
là tập hợp các phương án tối ưu của bài toán (A,C);
*
A là tập hợp các đỉnh
của đa diện lồi A)
Nói chung, việc xây dựng đa diện lồi
A thoả mãn (12) – (14) cũng rất phức tạp và
chưa có thuật toán hữu hiệu.

1.6. Khái niệm lát cắt đúng
Giả sử bài toán (,)
N
LC là bài toán quy hoạch nguyên nào đó và phương án tựa tối
ưu của bài toán quy hoạch tuyến tính tương ứng
(, )XLC không thoả mãn điều kiện
nguyên, tức là (, )XLC
N
L∉ . Khi đó bất đẳng thức:

jj
j
ax β≤


hay aX β≤ (15)
gọi là lát cắt đúng nếu thoả mãn 2 điều kiện:
- Điều kiện cắt:
(, )XLC không thoả mãn (15), tức là (, )aX L C β>
- Điều kiện đúng: nếu
X là phương án của (,)
N
LC thì X thoả mãn (15) , tức là

{}
N
LXaXβ⊂≤.
Nói cách khác, ràng buộc thêm không cắt đi một phương án nguyên nào của bài toán
(,)
N
LC.

Bùi Thế Tâm III.5 Quy hoạch rời rạc

1.7. Tư tưởng phương pháp cắt của Danzig
1. Việc giải (,)
N
LClà một quá trình gồm nhiều bước:
a) Ở bước thứ
r
giải bài toán bài toán quy hoạch tuyến tính phụ
(,)
r
LC

,
r
= 0, 1,
… với
0
LL=

b) Tập các điểm nguyên của tất cả các đa diện lồi là như nhau
01
NN
LL==…=
N
r
L =
Do đó, nếu phương án tối ưu
(,)
r
XL C
của bài toán
(,)
r
LC
thoả mãn điều kiện
nguyên thì nó cũng là phương án tối ưu
0
(,)
N
XL C của bài toán xuất phát
0
(,)

N
LC và
quá trình kết thúc.
c) Nếu
(,)
r
XL C
không thoả mãn điều kiện nguyên thì
(,)
r
XL C
không phải là
phương án của bài toán
1
(,)
r
LC
+
, tức là (,)
r
XL C
1r
L
+

2. Chuyển từ bước
r sang bước 1r + , tức là chuyển từ bài toán (,)
r
LCsang
1

(,)
r
LC
+
khi (,)
r
XL C không nguyên được thực hiện nhờ một lát cắt đúng
rr
ax β≤ .
Việc bổ sung lát cắt này vào ràng buộc của bài toán
(,)
r
LC sẽ chuyển đa diện lồi
r
L
thành
1r
L
+
.
Như vậy, phương pháp cắt có hai việc: xấp xỉ tuyến tính nhiều bước đối với bài
toán
(,)
N
LC, chuyển từ bước này sang bước khác nhờ một lát cắt đúng. Có ba vấn đề
tồn tại cần giải quyết: xây dựng lát cắt đúng, đảm bảo tính hữu hạn của quá trình giải, số
lượng lát cắt đúng không được tăng mãi. Thuật toán Gomory thứ nhất sẽ giải quyết
được cả ba vấn đề này một cách hiệu quả.
2. THUẬT TOÁN GOMORY THỨ NHẤT
Thuật toán Gomory lần đầu tiên thực hiện phương pháp cắt để giải bài toán quy

hoạch tuyến tính nguyên mà đối với nó việc xây dựng lát cắt đúng được tiến hành một
cách thuật toán, việc chứng minh tính hữu hạn của thuật toán cũng dễ dàng hơn.
2.1. Xét bài toán quy hoạch tuyến tính nguyên hoàn toàn

Bùi Thế Tâm III.6 Quy hoạch rời rạc
Max
0
x
=
1
n
jj
j
cx
=

(16)
1
n
ij j i
j
ax b
=
=


( 1, , )im=
(17)
j
x 0≥


(j=1, ,n)
(18)
j
x
nguyên
(j=1, ,n)
(19)
Giả sử
(, )XLC là phương án tựa tối ưu của bài toán (, )LC , từ đó ta có thể biểu diễn
các biến qua các biến phi cơ sở :

0ij
()
ii j
jN
xx xx

=+ −

, ( 0, , )in= (20)
Giả sử
x
là một số thực, ký hiệu
[
]
x
là phần nguyên (số nguyên lớn nhất không
vượt quá x),
{} []

xxx= −
là phần lẻ. Ví dụ [-1.3] = -2, {-1.3} = 0.7, {1.3} = 0.3.
Định lý 3. Giả sử X(L,C) có
0i
x
không nguyên với 1 in

≤ và:
1)
{}
{}
0ij
() ( )( )
ii i j
jN
zzX x x x

≡ = − + −−

, ( 1, 2, , )in= (21)
2)
X là phương án của bài toán (,)
N
LC
Khi đó:
a)
i
z nguyên (22)
b)
i

z
0≥
. (23)
Chứng minh.
a) Chứng minh
i
z nguyên ? Từ (20) ta có:

[]
{}
[]{}
0 0 ij ij
()()
ii i j
jN
xx x x x x

=+ + + −


Kết hợp với (21) suy ra
[]
[]
0ij
()
iii j
jN
zxx xx

= − ++ −


. Do giả thiết 2) ta có
i
x ,
j
x
nguyên, nên từ biểu thức trên suy ra
i
z nguyên.
b) Chứng minh
i
z ≥ 0. Giả sử phản chứng
i
z < 0 , từ (21) ta có:

{}
{}
0ij
() ( )( ) 0
ii i j
jN
zzx x x x

≡ = − + −−<



{
}
0i

x− > -1 ;
j
x ≥ 0 và
{
}
ij
x
[
)
0, 1∈ nên 10
i
z− <<, tức là
i
z không nguyên.
Điều này mâu thuẫn với chứng minh câu a), do đó
i
z
0≥ .

Chú ý, nếu
0
x được đảm bảo tính nguyên (chẳng hạn mọi
j
c đều là nguyên) thì
Định lý 3 cũng đúng với
0i = .

Bùi Thế Tâm III.7 Quy hoạch rời rạc
Hệ quả 2. Giả sử
(, )XLC

không thoả mãn điều kiện nguyên (19), như vậy đối
với
i
nào đó (1≤
i
≤ n)
0i
x
không nguyên . Khi đó các hệ thức (21) và (23) xác định
một lát cắt đúng.
Chứng minh.
a) Mọi phương án của bài toán (,)
N
LC đều thoả mãn (21) và (23) (trong chứng
minh định lý), do đó điều kiện đúng của lát cắt được thoả mãn.
b) Đặt vào (21) phương án tối ưu không nguyên
(, )XLC . Do (, )
j
xLC=0,
j
N∈ ,
suy ra
{}
0
((,)) 0 0
ii
zXLC x= − +<, trái với (23), tức là điều kiện cắt thoả mãn.
2.2. Trong lược đồ phương pháp cắt ở trên, vì bài toán (,)
r
LCcó thể có nhiều lời

giải nên (,)
r
XL C không duy nhất. Gomory giải bài toán (,)
r
LC thay cho bài
toán
(,)
r
LC, do đó phương án l - tối ưu (,)
r
XL C là tựa và xác định duy nhất, các tính
toán trên tiến hành nhờ
l - phương pháp.
2.3. Trong phương pháp cắt vấn đề quan trọng là việc tăng số lượng ràng buộc.
Gomory đặt kích thước hạn chế cho bảng đơn hình mở rộng bằng số (n+2) x (k+1). Các
ràng buộc
rr
aX β≤ chỉ là phương pháp để cắt phương án tối ưu không nguyên
(,)
r
XL C
và chuyển từ bài toán
(,)
r
LC
sang bài toán
1
(,)
r
LC

+
. Chú ý rằng biến
1nr
x
++
( 0r ≥ ) lập tức đưa ra khỏi cơ sở sau khi đưa vào ràng buộc :
1
1
0
nr r r
nr
xaX
x
β
++
++
= −









Tư tưởng của Gomory như sau:
- Ngay sau khi
1nr
x

++
đưa ra khỏi cơ sở dòng tương ứng xoá khỏi bảng đơn
hình mở rộng.
- Nếu trong qúa trình tính toán tiếp theo
1nr
x
++
lại đưa vào cơ sở thì dòng tương
ứng trong bảng đơn hình không được khôi phục và
1nr
x
++
không tham gia vào các tính
toán tiếp theo. Như vậy ở bước lặp bất kỳ của tính toán, bảng đơn hình bao gồm (k+1)
cột như bảng đơn hình xuất phát, số lượng các dòng không vượt quá n+2. Suy ra cỡ của
bảng không vượt quá (n+2) x (k+1).
2.4. Nếu bài toán (, )LC không có lời giải vì hàm mục tiêu
0
xCX= không bị
chặn trên khúc lồi
L thì thuật toán Gomory thứ nhất không áp dụng được.
Thuật toán Gomory cũng không áp dụng được trong trường hợp bài toán
(, )LC có
lời giải nhưng
l - bài toán
(, )LC
không có lời giải. Điều đó dường như là tập hợp các
phương án tối ưu của bài toán
(, )LC khác trống nhưng không bị chặn .


Bùi Thế Tâm III.8 Quy hoạch rời rạc

Về sau ta sẽ giả thiết :
1)
0
xCX≡ bị chặn trên trênL
2) Nếu tập hợp các phương án tối ưu của
(, )LC khác trống
thì nó phải bị chặn, tức là nếu bài toán(, )LC giải được thì bài toán (, )LC cũng giải
được
2.5. Thuật toán Gomory thứ nhất

Bước lặp ban đầu.
Giải bài toán
(, )LC ≡
0
(,)LC nhờ l - phương pháp, nếu nó không giải được thì
bài toán
0
(,)
N
LC cũng không giải được .
Nếu bài toán
0
(,)LC giải được và
0
(,)XL C thoả mãn điều kiện nguyên thì
0
(,)XL C là phương án tối ưu của bài toán nguyên ban đầu
0

(,)
N
LC. Nếu không thoả
mãn điều kiện nguyên thì chuyển sang bước
0r = .

Bước lặp
0r ≥
.
Giả sử (,)
r
XL C không thoả mãn điều kiện nguyên thì ta biểu diễn
0
xCX≡ và
12
, , ,
n
xx x qua các biến phi cơ sở ()
jr
xj N∈ . Ta có:
r
ij
()
r
r
iio j
jN
xx xx

=+ −


, 0,1, ,in= .
Ta nhận được bảng đơn hình:
0
r
ij
,
n
r
r
iQ j N
Tx
∈∈
= là chấp nhận được và l - chuẩn.
Chọn dòng đầu tiên ứng với thành phần không nguyên:
k
{}
{}
min 1 , không nguyên
r
io
ii n x= ∈
và xây dựng lát cắt đúng:

{}
{}()
()
r
1
0kj

1
1
0
nguyên
r
nr j
k
jNr
nr
nr
xx xx
x
x
++

++
++


= − + −−


















(24)

Bùi Thế Tâm III.9 Quy hoạch rời rạc
Viết dòng thứ nhất của (24) vào cuối bảng đơn hình
r
T . Ta được bảng đơn hình
không chấp nhận được (chỉ với
1nr
x
++
) và l - chuẩn. Dùng l -phương pháp đối với
bảng này, đồng thời sau khi đưa khỏi cơ sở
1nr
x
++
thì dòng tương ứng
1nr++
bị
xoá, sau khi đưa vào cơ sở
l
x (
1lr≥ +
) thì dòng tương ứng không được khôi phục.

Nếu cuối cùng ta nhận được bảng đơn hình ứng với bài toán quy hoạch tuyến tính
không giải được thì bài toán
0
(,)
N
LC cũng không giải được .
Nếu ta nhận được bảng
1r
T
+
chấp nhận được và l - chuẩn thì kiểm tra tính nguyên
của
1
(,)
r
XL C
+
. Nếu
1
(,)
r
XL C
+
thoả mãn điều kiện nguyên thì nó đồng thời là
phương án tối ưu của bài toán
0
(,)
N
LC
, nếu không thoả mãn thì chuyển sang bước

r+1.
3. TÍNH HỮU HẠN CỦA THUẬT TOÁN GOMORY THỨ NHẤT
Giả sử tập các phương án tối ưu của bài toán
0
(,)LC là bị chặn.
Định lý 4. Giả sử có các điều kiện sau:
1) Tính nguyên của hàm mục tiêu
0
xCX≡ được đảm bảo và
0
x được xét khi
chọn dòng xây dựng lát cắt đúng.
2) Một trong các khẳng định sau là đúng:
i) Hàm mục tiêu
0
x bị chặn dưới trên
0
L .
ii) Bài toán
0
(,)
N
LCcó ít nhất một phương án
'
X .
Khi đó thuật toán Gomory thứ nhất kết thúc sau một số hữu hạn bước lặp lớn.
Trước khi chứng minh định lý ta cần chứng minh ba bổ đề. Giả sử
(,)
r
XL C

01
( , , , )
rrrr
n
Xxxx≡≡ . Kí hiệu
r
X
là giả phương án ứng với bảng
r
T nhận
được từ bảng
r
T sau khi loại khỏi cơ sở
1nr
x
++
và xoá dòng tương ứng .

Bổ đề 1. Ta có:
1
r
rr
XXX
+
> ≥ .
Bất đẳng thức đầu tiên suy ra từ công thức biến đổi bảng đơn hình và tính
l -
chuẩn của bảng đơn hình (cột đầu tiên của
r
T được tính theo công thức

{
}
{}
0
0
()
.,
()
r
k
rrr
ll
r
kl
x
R
RR
x



có số đầu tiên khác 0 là dương). Bất đẳng thức thứ hai là do cột
0 giảm khi dùng phương pháp đơn hình đối ngẫu từ vựng.
Bổ đề 2. Các số ( 0,1, , )
r
i
xi n= bị chặn dưới.
Chứng minh. Với i = 1, , n điều đó suy ra từ điều kiện không âm
0
j

x ≥
( 1, , )
j
n= . Với
0i =
điều đó suy ra từ điều kiện 2) của định lý 4. Thật vậy,
nếu i) là đúng thì bổ đề 2 là hiển nhiên đúng. Nếu điều kiện ii) được thoả mãn thì
'r
XX≥ suy ra
'
00
r
xx≥ .
Bổ đề 3. Nếu
r
X
không thoả mãn điều kiện nguyên và
0
rr
pp
xx≡ không nguyên
thì:

Bùi Thế Tâm III.10 Quy hoạch rời rạc
[
]
01 1
0
( , , , , ) ( , , )
rr r r

rr
p
pp
xx x x x x


.
Chứng minh
Giả sử k
{}
{}
min 0,1, , , không nguyên
r
io
ii n x= ∈ , suy ra kp≤ . Giả sử

{}
{}
{}
lex min , 0
r
r
j
r
l
r
r
kj
r
kl

kj
R
R
jNx
x
x




= ∈≠






(dòng quay là lát cắt mới thêm) và
{}
{}
( ) min i i 0,1, n ; 0
rr
lil
hR x= ∈≠( hàng đầu
tiên của cột
l
R có hệ số
0≠
, cụ thể là
0

r
hl
x >
do
0
r
l
R >
).

{}
00()
rr r
kl kl l
xxhRkp≠⇒ ≠⇒ ≤≤. Có hai khả năng xảy ra:
1)
()
r
l
hR q p≡ < .
2)
()
r
l
hR q p≡ =
.
Trong trường hợp 1) theo quy tắc của
l
-phương pháp
r

r
q
q
xx<

{}
{}
0
(do 0)
r
rrrr
r
k
q
qq
r
ql ql
kl
x
xx xx x
x
= − <>
, và bổ đề được chứng minh.
Trong trường hợp 2) ta có
()
r
l
hR k p==
. Vì vậy
0

0
r
r
i
i
xx=
với
()
r
l
ikhR<=

(h là chỉ số đầu tiên
r
hl
x
khác không) và
{}
{}
0
00
r
rr
r
k
r
kk kl
kl
x
xx x

x
= −
.

r
kl
x = 0
r
hl
x > , nên
{}
rr
kl kl
xx≥ . Từ đó ta có :

{}
[
]
00 0 0
rr r
r
kk k k
xx x x≤− = .
Do k = p nên bổ đề được chứng minh.
Chứng minh định lý 4
Giả sử dãy :

01
, , , ,
r

XX X vô hạn (25)
Khi đó theo Bổ đề 1 và Bổ đề 2 tồn tại
0
i ,
0
0 in≤≤; tồn tại
0
0r ≥ và một dãy vô
hạn :
12 10
( )rr r rr
ν
<<<< ≥ (26)
sao cho ta có :

1rr
i
i
xx
+
= ;
0
rr≥ ;
0
01ii≤≤ − (27)

00
1rr
ii
xx

νν
+
< ,(ν = 1,2, ) (28)
Từ Bổ đề 1 và (27) ta có

0
0
1
0
,
rr
i
i
xxrr
+
≤≥ (29)

Bùi Thế Tâm III.11 Quy hoạch rời rạc
Từ (28), (29) và bổ đề 2 suy ra tồn tại số
'
0
rr>
và các số nguyên
0
z

0
z
+1
sao cho:

0
00
1
r
i
zx z<<+
,
'
()rr≥ (30)
Từ (27), (30) và Bổ đề 3 suy ra:
[
]
0
00
1
0
rr
r
i
ii
xxxz
+
≤≤ =
. Điều này là mâu thuẫn
với (30), định lý được chứng minh.
4. GIẢI VÍ DỤ SỐ
Giải bài toán sau bằng thuật toán Gomory thứ nhất:
Max
3210
2 xxxx


+
=

82
321


+ xxx

94
321

+
+ xxx
(31)
322
321

+

− xxx

63
321


− xxx
0
1

≥x
,
0
2
≥x
,
0
3
≥x

321
,, xxx nguyên.
Sau khi thêm biến bù bài toán viết lại thành:
Max
3210
2 xxxx

+
=


3214
28 xxxx
+


=


3215

49 xxxx



= (32)
3216
223 xxxx

+
+
=

3217
36 xxxx
+
+

=

0,,,,,
7654321
≥xxxxxxx , ;
7654321
,,,,, xxxxxxx nguyên.
Từ đây ta có bảng đơn hình xuất phát. Vì bảng đơn hình xuất phát không là l-
chuẩn ta phải thêm ràng buộc phụ:
100
321
=


+
+
gzxxx hay
0100
3218
≥−−−= xxxx và 0
8
≥x và viết vào phía dưới bảng 1.
Bảng đơn hình xuất phát sau khi thêm ràng buộc phụ:

Bùi Thế Tâm III.12 Quy hoạch rời rạc









Bảng 1
x
8
100.00000 1.00000 1.00000* 1.00000

Thực hiện một bước của đơn hình đối ngẫu từ vựng ta được bảng 2 là l- chuẩn.


Bảng 2
Tiếp tục dùng thuật toán đơn hình đối ngẫu từ vựng giải bài toán phụ quy hoạch

tuyến tính cho đến tối ưu ta được các bảng 3, bảng 4, bảng 5, bảng 6.


Bảng 3

1 - x
1
-x
2
-x
3

x
0
0.00000 -1.00000 -2.00000 1.00000
x
1
0.00000 -1.00000 0.00000 0.00000
x
2
0.00000 0.00000 -1.00000 0.00000
x
3
0.00000 0.00000 0.00000 -1.00000
x
4
8.00000 2.00000 1.00000 -1.00000
x
5
9.00000 1.00000 4.00000 1.00000

x
6
3.00000 -1.00000 -2.00000 2.00000
x
7
6.00000 3.00000 -1.00000 -1.00000
1 - x
1
-x
8
-x
3

x
0
200.00000 1.00000 2.00000 3.00000
x
1
0.00000 -1.00000 - 0.00001 0.00000
x
2
100.00000 1.00000 1.00000 1.00000
x
3
0.00000 0.00000 -0.00001 -1.00000
x
4
-92.00000 1.00000 -1.00000 -2.00000*
x
5

-391.00000 -3.00000 -4.00000 -3.00000
x
6
203.00000 1.00000 2.00000 4.00000
x
7
106.00000 4.00000 1.00000 0.00000
1 - x
1
-x
8
-x
4

x
0
62.00000 2.50000 0.50000 1.50000
x
1
0.00000 -1.00000 - 0.00001 0.00000
x
2
54.00000 1.50000 0.50000 0.50000
x
3
46.00000 -0.50000 0.50000 -0.50000
x
4
0.00000 0.00000 0.00000 -1.00000
x

5
-253.00000 -4.50000 -2.50000* -1.50000
x
6
19.00000 3.00000 0.00000 2.00000
x
7
106.00000 4.00000 1.00000 0.00000

Bùi Thế Tâm III.13 Quy hoạch rời rạc
1 - x
1
-x
5
-x
4

x
0
11.40000 1.60000 0.20000 1.20000
x
1
0.00000 -1.00000 - 0.00001 0.00000
x
2
3.40000 0.60000 0.20000 0.20000
x
3
-4.60000 -1.40000* 0.20000 - 0.80000
x

4
0.00000 -0.00001 0.00000 -1.00000
x
5
0.00000 0.00000 -1.00000 0.00000
x
6
19.00000 3.00000 0.00000 2.00000
x
7
4.80000 2.20000 0.40000 -0.60000
Bảng 4


Bảng 5
Tám dòng đầu của bảng 6 là bảng đơn hình l- chuẩn và chấp nhận được.
Do x
0
lẻ nên từ dòng 0 sinh lát cắt ở dòng x
9
theo công thức (24) và ta được bảng 6.
Chọn dòng x
9
làm dòng quay









Bảng 6
x
9
-0.76923 -0.38462 -0.53846 * -0.15385

1 - x
3
-x
5
-x
4

x
0
6.14286 1.14286 0.42857 0.28571
x
1
3.28571 -0.71429 -0.14286 0.57143
x
2
1.42857 0.42857 0.28571 -0.14286
x
3
0.00000 -1.00000 0.00000 0.00000
x
4
0.00000 0.00000 0.00000 -1.00000
x

5
0.00000 0.00000 -1.00000 0.00000
x
6
9.14286 2.14286 0.42875 0.28571
x
7
-2.42857 1.57143 0.71429 -1.85714*
1 - x
3
-x
5
-x
7

x
0
5.76923 1.38462 0.53846 0.15385
x
1
2.53846 -0.23077 0.07692 0.30769
x
2
1.61538 0.30769 0.23077 -0.07692
x
3
0.00000 -1.00000 0.00000 0.00000
x
4
1.30769 -0.84615 -0.38462 -0.53846

x
5
0.00000 0.00000 -1.00000 0.00000
x
6
8.76923 2.38462 0.53846 0.15385
x
7
0.00000 0.00000 0.00000 -1.00000

Bùi Thế Tâm III.14 Quy hoạch rời rạc
Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng đơn
hình l- chuẩn và chấp nhận được. Biến x
1
lẻ nên từ dòng x
1
sinh ra lát cắt ở dòng x
10
.









Bảng 7
x

10
-0.42857 -0.71429 -0.14286 -0.28571 *
Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng đơn
hình l- chuẩn và chấp nhận được. Biến x
2
lẻ nên từ dòng x
2
sinh ra lát cắt ở dòng x
11
.








Bảng 8
x
11
-0.50000 -0.50000 -0.50000 -0.50000*

T
hực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng đơn
hình l- chuẩn và chấp nhận được, có cột phương án là nguyên và quá trình lặp kết thúc.
1 - x
3
-x
9

-x
7

x
0
5.00000 1.00000 1.00000 0.00000
x
1
2.42857 -0.28571 0.14286 0.28571
x
2
1.28571 0.14286 0.42857 -0.14286
x
3
0.00000 -1.00000 0.00000 0.00000
x
4
1.85714 -0.57143 -0.71429 -0.42857
x
5
1.42857 0.71429 -1.85714 0.28571
x
6
8.00000 2.00000 1.00000 0.00000
x
7
0.00000 0.00000 0.00000 -1.00000
1 - x
3
-x

9
-x
10

x
0
5.00000 1.00000 1.00000 0.00000
x
1
2.00000 -1.00000 0.00000 1.00000
x
2
1.50000 0.50000 0.50000 -0.50000
x
3
0.00000 -1.00000 0.00000 0.00000
x
4
2.50000 0.50000 -0.50000 -1.50000
x
5
1.00000 0.00000 -2.00000 1.00000
x
6
8.00000 2.00000 1.00000 0.00000
x
7
1.50000 2.50000 0.50000 -3.50000

Bùi Thế Tâm III.15 Quy hoạch rời rạc










Bảng 9
Vậy phương án tối ưu là ( 1; 2; 0; 4; 0; 8; 5) với trị hàm mục tiêu x[0]=5
5. CHƯƠNG TRÌNH MÁY TÍNH
• Thuật toán này dùng để giải bài toán quy hoạch tuyến tính nguyên hoàn toàn, có
dạng:

max
1
0
→=

=
j
m
j
j
xcx

ij
m
j

ij
bxa ≤

=1
,
p
i , ,1
=

0≥
j
x và nguyên , m
j
, ,2,1
=

các b[i] có thể dương và âm, phương án xuất phát có thể không đối ngẫu chấp nhận
được. Nếu bài toán giải có ràng buộc đẳng thức dạng:
ii
m
j
ij
bxa =

=1
thì ta thay thế bằng
hai bất đẳng thức:
ii
m
j

ij
bxa ≤

=1

ii
m
j
ij
bxa ≥

=1
.
Sau khi thêm biến bù bài toán trên có thể viết ở dạng:
max))((
1
0
→−−=

=
m
j
jj
xcx

mjxx
jj
, ,2,1))(1(
=



=
., ,2,1))((
1
pixabx
j
m
j
ijiim
=−−+=

=
+


1 - x
3
-x
9
-x
11

x
0
5.00000 1.00000 1.00000 0.00000
x
1
1.00000 -2.00000 -1.00000 2.00000
x
2

2.00000 1.00000 1.00000 -1.00000
x
3
0.00000 -1.00000 0.00000 0.00000
x
4
4.00000 2.00000 1.00000 -3.00000
x
5
0.00000 -1.00000 -3.00000 2.00000
x
6
8.00000 2.00000 1.00000 0.00000
x
7
5.00000 6.00000 4.00000 -7.00000

Bùi Thế Tâm III.16 Quy hoạch rời rạc
., ,2,10 pmjx
j
+
=


j
x nguyên. ., ,2,1
p
m
j
+

=


Trong chương trình sử dụng các biến và mảng sau:
- m: số biến chính, n: số biến chính và biến bù của bài toán (n=m+p), gz là một
số dương đủ lớn và thường lấy bằng
},,{max
jiij
cba .
- x
0
=0 nếu có kể x
0
nguyên và bằng 1 nếu x
0
không cần nguyên.
- ss = 1 nếu bảng đơn hình s ban đầu là l- chuẩn và chấp nhận được , = 2 nếu
bảng là l- chuẩn và không chấp nhận được, =3 nếu bảng không là l - chuẩn
- Mảng s gồm n + 2 dòng và m+1 cột lúc đầu ghi dữ liệu của bài toán sau đó lưu
bảng đơn hình ở mỗi bước. Dòng n+1 để chứa ràng buộc phụ.
- s[0][0] hàm mục tiêu, cột 0 là cột phương án, dòng 0 là các ước lượng
- cs : các biến ở bên trái bảng đơn hình, nc : các biến phi cơ sở
• Cách nhập dữ liệu
Dữ liệu ban đầu của bài toán được ghi trong một tệp văn bản, gồm có :
- n, m, gz, x
0
, ss.
- Mảng s dữ liệu ban đầu bố trí dạng ở dưới và được ghi vào tệp dữ liệu theo từng
dòng :













- Tiếp đến là mảng cs: nhập các số từ 0, 1, 2,…, n.
- Cuối cùng là mảng nc: nhập các số từ 1, 2,…, m.
• Với dữ liệu bài toán (31) thì tệp dữ liệu VDG1.sli, có dạng:
-x
1
-x
2
. . . . . . . . . –x
m
0 -c
1
-c
2
. . . . . . . . –c
m
x
0
x
1

x
2
#
x
m
0
0
#
0
-1 0 . . . . . . . . . . 0
0 -1 . . . . . . . . . 0
# # % #
0 0 . . . . . . . . . . -1
x
m+1
#
x
n
b
1

#
b
p
-a
11
. . . . . . . . . - a
1m
# # #
-a

p1
. . . . . . . . . a
pm


Bùi Thế Tâm III.17 Quy hoạch rời rạc
7 3 100 0 3
0 -1 -2 1
0 -1 0 0
0 0 -1 0
0 0 0 -1
8 2 1 -1

9 1 4 1
3 -1 -2 2
6 3 -1 -1
0 1 2 3 4 5 6 7
1 2 3
• Văn bản chương trình
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <dos.h>
#define M 30
#define N 30
double s[N+2][M+1],r,gz;
int kgd,kgd2,blap,blap2,sb,cmin,x0,ss;
int m,n,i,j,k,l,le,lc,tg,cs[N+2],nc[M+1];
unsigned long far *t; long int t1,t2;
char *s1,*s2; FILE *f1,*f2;

int ktnguyen(double x);
int cotquay();
void biendoi();
void inbang(int cuoi);
int dhdoingau();
void main()
{ clrscr();
t= (unsigned long far *)MK_FP(0,0X46C); t1=*t;
printf("\nCo in trung gian hay khong 1/0 ? ");
scanf("%d%*c",&tg);
// Nhap du lieu
printf("\nVao ten tep so lieu : "); gets(s1);

Bùi Thế Tâm III.18 Quy hoạch rời rạc
f1= fopen(s1,"r"); fscanf(f1,"%d%d%lf%d%d",&n,&m,&gz,&x0,&ss);
for (i=0;i<=n;i++) for (j=0; j<=m;j++)
{ fscanf(f1,"%lf",&r); s[i][j]=r; }
for (i=0; i<=n;i++) fscanf(f1,"%d",&cs[i]) ;
for (j=1; j<=m; j++) fscanf(f1,"%d",&nc[j]);
fclose(f1);
sb=1; blap=0;
// In du lieu nhap de kiem tra
printf("\nn,m,ep,gz,x0,ss = %d %d %13.5lf %d %d",n,m,gz,x0,ss);
if (tg==1){ printf("\nVao ten tep chua ket qua : "); gets(s2);
f2=fopen(s2,"w");
fprintf(f2,"\nn,m,ep,x0,ss = %d %d %13.5lf %d %d",n,m,gz,x0,ss);
}
printf("\nBang 1, so lieu ban dau");
if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau");
inbang(0);

if (ss==1){
printf("\nBang 1, so lieu ban dau, l- chuan, chap nhan duoc");
if (tg==1)
fprintf(f2,"\nBang 1, so lieu ban dau, l- chuan, chap nhan duoc");
lc = n; goto Lap1;}

if (ss==2){
printf("\nBang 1, so lieu ban dau, l- chuan, khong chap nhan duoc, chay ngay DHDN");
if (tg==1)
fprintf(f2,"\nBang 1, so lieu ban dau, l- chuan, khong chap nhan duoc, chay ngay DHDN");
goto L1;}
// Them rang buoc phu
sb=1; cs[n+1]=n+1; s[n+1][0]=gz;
for (j=1;j<=m; j++) s[n+1][j]=1;
printf("\nBang 1, so lieu ban dau them rang buoc phu");
if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau them rang buoc phu");
inbang(1);
l=n+1; // dong quay la dong cuoi cung
// Xac dinh cot quay
cmin=1;
for (j=2;j<=m;j++)

Bùi Thế Tâm III.19 Quy hoạch rời rạc
{ for (i=0; i<=n;i++)
{ if (s[i][cmin] > s[i][j]) {cmin=j; break;}
if (s[i][cmin] < s[i][j]) break;
}
}
printf("\nDong quay= %d, Cot quay= %d, Phan tu quay= %13.5lf", l,cmin,s[l][cmin]);
if (tg==1) { fprintf(f2,"\nDong quay= %d, Cot quay = %d, Phan tu quay= %13.5lf",

l,cmin,s[l][cmin]);
}
biendoi(); sb++;
printf("\nBang %d, l- chuan dau tien",sb);
if (tg==1) fprintf(f2,"\nBang %d, l- chuan dau tien",sb);
inbang(0);
L1: kgd2= dhdoingau();
if (kgd2==1) {
printf("\nBai toan phu khong giai duoc, STOP");
if (tg==1) fprintf(f2,"\nBai toan phu khong giai duoc, STOP");
getch(); getch(); return;
}
lc=n+1;
// Tim xong bang l- chuan + chap nhan duoc, sang Buoc lap lon
Lap1: blap = blap+1;
printf("\n ");
printf("\n\nBUOC LAP LON THU %d: ",blap);
if (tg==1)
{ fprintf(f2,"\n ");
fprintf(f2,"\n\nBUOC LAP LON THU %d: ",blap);}
// Kiem tra loi giai toi uu bai toan phu co nguyen khong
le=-1;
for (i=x0; i<=n; i++)
if (ktnguyen(s[i][0])==0) {le = i; break; }
printf("\nThanh phan le thuoc dong = %d",le);
if (tg==1) fprintf(f2,"\nThanh phan le thuoc dong = %d",le);
if (le==-1) {
printf("\nPHUONG AN TOI UU QHTT NGUYEN: ");
if (tg==1) fprintf(f2,"\nPHUONG AN TOI UU QHTT NGUYEN: ");
for (i=0; i<=n;i++)


Bùi Thế Tâm III.20 Quy hoạch rời rạc
printf("\nx[%2d] = %13.5lf",cs[i],s[i][0]);
printf("\nSo luong lat cat: %d lat cat",blap-1);
printf("\nSo bang don hinh da lap : %d bang",sb);
if (tg==1){ for (i=0; i<=n;i++)
fprintf(f2,"\nx[%2d] = %13.5lf",cs[i],s[i][0]);
fprintf(f2,"\nSo luong lat cat: %d lat cat",blap-1);
fprintf(f2,"\nSo bang don hinh da lap : %d bang",sb);
}
t= (unsigned long far *)MK_FP(0,0X46C);
t2=*t;
printf("\nThoi gian chay chuong trinh: %ld giay", (long int)((t2-t1)/18.21));
if (tg==1) fprintf(f2,"\nThoi gian chay chuong trinh: %ld giay",
(long int)((t2-t1)/18.21));
fclose(f2); getch();
return;
}
// Tao lat cat moi va ghi vao cuoi bang
lc++;
cs[n+1]=lc;
for (j=0; j<=m; j++)
{ if (ktnguyen(s[le][j])) s[n+1][j]=0;
else s[n+1][j]= -(s[le][j]- floor(s[le][j])); }
printf("\nBang %d, sau khi them lat cat",sb);
if (tg==1) fprintf(f2,"\nBang %d, sau khi them lat cat",sb);
inbang(1);
// Xac dinh dong quay va cot quay
l=n+1 ;
printf("\nDong quay = %d",l);

if (tg==1) fprintf(f2,"\nDong quay = %d",l);
cotquay();
printf("\nCot quay = %d, Phan tu quay = %13.5lf",cmin,s[l][cmin]);
if (tg==1)
fprintf(f2,"\nCot quay = %d, Phan tu quay = %13.5lf",cmin,s[l][cmin]);
// Bien doi bang don hinh
biendoi(); sb++;
printf("\nBang %d, bang dau tien bai toan phu",sb);
if (tg==1) fprintf(f2,"\nBang %d, bang dau tien bai toan phu",sb);

Bùi Thế Tâm III.21 Quy hoạch rời rạc
inbang(0);
kgd2= dhdoingau();
if (kgd2==1) {
printf("\nBai toan phu khong giai duoc");
if (tg==1) fprintf(f2,"\nBai toan phu khong giai duoc, STOP");
getch(); getch(); return;
}
goto Lap1;
}
int ktnguyen(double x)
{ long int h; double z; z=fabs(x); h=(int)(z+0.5);
if (fabs(z-h)<=0.0001) return 1; else return 0;
}
int cotquay()
{ k=0;
for (j=1; j<=m; j++) if (s[l][j]<-0.000001) { k=j; break;}
if (k==0) return 1;
cmin=k;
for (j=k+1;j<=m;j++) if (s[l][j]< -0.000001)

{ // so sanh cot cmin voi cot j, neu j < cmin thi cmin = j
for (i=0; i<=n;i++)
{ double t1,t2;
t1= s[i][cmin]/fabs(s[l][cmin]); t2=s[i][j]/fabs(s[l][j]);
if (t1 > t2) {cmin=j; break;}
if (t1 < t2) break;
}
}
return 0;
}
void biendoi()
{ for (j=0;j<=m;j++) if (j!= cmin)
{ for (i=0;i<=n;i++) if (i!=l) s[i][j]=s[i][j]-(s[l][j]/s[l][cmin])*s[i][cmin];
s[l][j]=0;
}
for (i=0;i<=n;i++) if (i!=l) s[i][cmin]=-s[i][cmin]/s[l][cmin];
s[l][cmin]=-1;
nc[cmin]=cs[l];

Bùi Thế Tâm III.22 Quy hoạch rời rạc
}
void inbang(int cuoi)
{ int n1; if (cuoi==1) n1=n+1; else n1=n;
printf("\nCo so : ");
for (i=0; i<=n1;i++) printf("%d ",cs[i]) ; printf("\n");
printf("Phi co so : ");
for (j=1; j<=m; j++) printf("%d ",nc[j]);printf("\n");
for (i=0;i<=n1;i++) { for (j=0; j<=m;j++)
printf(" %10.5lf ",s[i][j]);
printf("\n"); }

if (tg==1) {
fprintf(f2,"\nCo so : ");
for (i=0; i<=n1;i++) fprintf(f2,"%d ",cs[i]) ; fprintf(f2,"\n");
fprintf(f2,"Phi co so : ");
for (j=1; j<=m; j++) fprintf(f2,"%d ",nc[j]);fprintf(f2,"\n");
for (i=0;i<=n1;i++) { for (j=0; j<=m;j++)
fprintf(f2," %13.5lf ",s[i][j]);
fprintf(f2,"\n"); }
}
getch();
}

int dhdoingau()
{ blap2 =0;
Lap2: blap2++;
printf("\nBuoc lap Don hinh doi ngau thu %d : ",blap2);
if (tg==1) fprintf(f2,"\nBuoc lap Don hinh doi ngau thu %d : ",blap2);
l=-1;
for (i=1;i<=n;i++) if (s[i][0]<0) {l=i; break;}
printf("\nDong quay %d ",l);
if (tg==1) fprintf(f2,"\nDong quay = %d",l);
if (l==-1) {
printf("\nBang tren ung phuong an toi uu cua bai toan phu");
if (tg==1) fprintf(f2,"\nBang tren ung phuong an toi uu bai toan phu");
return 0;
}
else { kgd=cotquay();

Bùi Thế Tâm III.23 Quy hoạch rời rạc
if (kgd==1) return 1;

printf("\nCot quay = %d, Phan tu quay = %13.5lf",cmin,s[l][cmin]);
if (tg==1) fprintf(f2,"\nCot quay = %d, Phan tu quay = %13.5lf", cmin,s[l][cmin]);
biendoi(); sb++;
printf("\nBang %d, DHDN",sb);
if (tg==1) fprintf(f2,"\nBang %d, DHDN",sb);
inbang(0);
goto Lap2;
}
}

Sau khi chạy chương trình ta nhận được lời giải tối ưu của bài toán (31) là:
x[ 0] = 5.00000
x[ 1] = 1.00000
x[ 2] = 2.00000
x[ 3] = 0.00000
x[ 4] = 4.00000
x[ 5] = 0.00000
x[ 6] = 8.00000
x[ 7] = 5.00000
Số lượng lát cắt: 3 lát cắt.
Số bảng đã lập :9 bảng.
BÀI TẬP
Giải các bài toán quy hoạch tuyến tính nguyên hoàn toàn sau bằng thuật toán
Gomory thứ nhất
Bài 1. Max
210
xxx
+
=


38112
21

+ xx
7
21

+ xx
554
21

− xx
0;0
21
≥≥ xx

21
, xx nguyên.
Đáp số: ( x0, x1, x2, x3, x4, x5) = (5, 3, 2, 10, 2, 3), dùng 4 lát cắt, 12 bảng.
Bài 2. x0 = x1 + 4 * x2 > Max

Bùi Thế Tâm III.24 Quy hoạch rời rạc
- x1 + 2 * x2 <= 2
3* x1 + 2 * x2 <= 6
x1, x2 => 0 và nguyên
Đáp số : ( x0, x1, x2, x3, x4) = ( 5; 1; 1; 1; 1 ), dùng 2 lát cắt, 6 bảng.

Bài 3. Max x0 = 3 * x1 + 4 * x2
3 * x1 + 2 * x2 <= 8
x1 + 4 * x2 <= 10

x1, x2 => 0 và nguyên
Đáp số : ( x0, x1, x2, x3, x4) = ( 11; 1; 2; 1; 1 ), dùng 4 lát cắt , 9 bảng.

Bài 4. Tìm Max (C, X) : AX <= B, X => 0 và nguyên.
-1 8 -4 6 -5 20
9 -7 1 -2 4 15
A = 1 1 1 1 1 B = 25
-2 -4 -3 -5 -1 -26
3 2 -6 -7 1 -10
C = ( 2 -4 7 -5 3 )
Đáp số : (x0, x1, x2, x3, x4, x5) = ( 153 / 0 / 2 / 23 / 0 / 0 ), dùng 18 lát cắt và 19
bảng đơn hình.

×