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

QUY HOẠCH RỜI RẠC - CHƯƠNG 4 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 (662.7 KB, 33 trang )


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


Chương 4
THUẬT TOÁN GOMORY THỨ HAI

Chương này trình bày hai thuật toán: thuật toán Gomory thứ hai dùng để giải bài
toán quy hoạch tuyến tính nguyên bộ phận, thuật toán Dalton - Llewellyn dùng để giải
bài toán quy hoạch tuyến tính với các biến nhận giá trị rời rạc.
1. LƯỢC ĐỒ LOGIC CHUNG CỦA THUẬT TOÁN
Xét bài toán quy hoạch rời rạc:

0
1
ij
1
11
Max (1)
1, , (2)
0 1, , (3)
1, , ; (4)
n
jj
j
n
ji
j
j
jj
xcx


ax b i m
xjn
xD j nnn
=
=
=
==
≥=
∈= ≤



Bài toán này kí hiệu là (L
D
,
C) =(L
0
D
,C)
L
D
là miền chấp nhận được của bài toán (L
D
,
C)
D
j
là các tập rời rạc. Điều kiện rời rạc (4) có thể có các dạng khác nhau trong các
trường hợp cụ thể.
Ta giả sử rằng:

1) Hàm mục tiêu x
0
bị chặn trên trên miền (2)- (3)
2) Nếu tập phương án tối ưu của bài toán (1) – (3) khác rỗng thì nó phải bị
chặn

Lược đồ logic của thuật toán như sau:

Bước lặp ban đầu. Giải l - bài toán
(
)
(
)
0
,,LC L C≡ xác định bởi (1) – (3). Nếu
nó không giải được thì bài toán
(
)
0
,
D
L
C
cũng không giải được. Nếu bài toán
(
)
0
,LC giải
được và phương án
(

)
0
,XLC
thoả mãn điều kiện rời rạc (4) thì nó đồng thời là phương
án tối ưu của bài toán
(
)
,
D
L
C
. Nếu
(
)
0
,XLC không thoả mãn điều kiện rời rạc thì
chuyển sang bước lặp thứ r = 0

Bước lặp thứ r (r ≥ 0). Giả sử
(
)
,
r
XLC không thoả mãn điều kiện rời rạc, ta
biểu diễn hàm mục tiêu x
0
= CX và x
1
,x
2

, …,x
n
qua các biến phi cơ sở x
j
(j
r
N∈ )
(
)
r
r
0ij
jN
, 0,1, ,
r
ii j
x
xxxi n

=+ − =


và nhận được bảng đơn hình
r
ijr
Tx= là chấp nhận được và là l - chuẩn.
Chọn k là dòng có chỉ số nhỏ nhất ứng với thành phần không thoả mãn điều kiện
rời rạc
{
}

{
}
10
min 1, , ;
r
ii
kiinxD=∈ ∉

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


và theo một qui tắc nào đó (tùy từng thuật toán) ta xây dựng lát cắt đúng :
(
)
r
10
jN
1
(5)
0(6)
nr j j
nr
xx
x
γγ
++

++
=+ −





Viết dòng (5) vào cuối bảng đơn hình T
r
ta được bảng mới là không chấp nhận
được (chỉ đối với dòng cuối cùng vừa thêm vào) và là
l
- chuẩn. Sau khi đưa x
n+r+1
ra
khỏi cơ sở thì dòng tương ứng sẽ bị xoá, nếu đưa vào cơ sở x
l
(
1ln≥+
) thì dòng
tương ứng không phục hồi. Nếu nhận được bảng đơn hình ứng với bài toán qui hoạch
tuyến tính không giải được thì bài toán
(
)
0
,
D
LC không giải được. Nếu nhận được bảng
đơn hình T
r+1
là chấp nhận được và l - chuẩn thì kiểm tra phương án l - tối ưu
(
)
1

,
r
XL C
+
có thoả mãn điều kiện rời rạc (4) hay không, nếu nó thoả mãn thì nó là
phương án tối ưu của bài toán
(
)
0
,
D
LC, nếu không thoả mãn thì chuyển sang bước lặp
thứ r+1

2. THUẬT TOÁN GOMORY THỨ HAI
2.1. Thuật toán này cho phép ta giải các bài toán qui hoạch tuyến tính nguyên bộ
phận
0
1
ij
1
11
Max (7)
1, , (8)
0 1, , (9)
nguyên 1, , ; (10)
n
jj
j
n

ji
j
j
j
xcx
ax b i m
xjn
xjnnn
=
=
=
==
≥=
=≤




2.2. Định lý 1. Giả sử
(
)
,
r
r
XLC X≡ là phương án tựa tối ưu của bài toán
(
)
,
r
L

C
và T
r
là bảng đơn hình tương ứng,
0
r
i
x
không nguyên với
1
1 in≤≤ (hoặc
1
0 in≤≤ nếu hàm mục tiêu cũng yêu cầu đảm bảo tính nguyên). Khi đó bất đẳng thức

0
r
jj
jN
x
γγ



(11)
hoặc nó được viết lại là

0
r
jj
jN

Zx
γγ

=− +

(12)

0Z ≥
(13)
là một lát cắt đúng, trong đó:

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



{}
{} {}{ }
{}
{}
{}
()
{}{ }
{}
{}
()
00
rr
ij 1 ij 0
0
rr

ij 1 ij 0
0
rr
ij 1 ij
0
rr
ij 1 ij
0
,
1,
1
1, 0
1, 0
1
r
i
r
i
r
i
r
i
r
i
j
r
i
r
i
x

xjnxx
x
xjnxx
x
xjnx
x
xjnx
x
γ
γ
=

≤≤


− ≤>



=

≥+ ≥



−≥+<





(14)

Chứng minh định lý 1. Trước hết điều kiện cắt được thỏa mãn là do

{
}
00
0
r
rr
jj i
jN
xx
γ
γ

=
<=

(vì
0
r
i
x
không nguyên)
Kiểm tra điều kiện đúng. Viết khai triển của x
i
theo các biến phi cơ sở:
(
)

r
0ij
r
r
ii j
jN
x
xxx

=
+−

.
Giả sử
'
ij 1
r
ij
'
ij ij 1
,1
,
r
r
xjNjn
x
xy jNjn


≥+


=

+∈≤



ở đây
ij
y là số nguyên nào đó chọn sau sao cho các hệ số của lát cắt là nhỏ nhất. Khi đó
{
}
1
'
00
,
() ()
rr
rr
i i ij j i ij j i
jN jn jN
x
xyxxxxZX
∈≤ ∈

−+ =+ −≡



.

Nếu X là một phương án của bài toán qui hoạch tuyến tính nguyên thì
()
i
Z
X là
nguyên.
Ta đặt:
{}
{}
()
()
'
ij
'
ij
'
ij
'
ij
,0
,0
() 0 (15)
() 0 (16)
r
r
rr
rr
j
jN
j

jN
NjjNx
NjjNx
SX xx
SX xx
+

+

+



=∈−>
=∈−≤
=− ≥
=− ≤



và viết lại
{}
{}
0
0
() 0 (17)
1
() 0 (18)
r
i

r
i
x
SX
x
SX
+



−≥


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


Tiếp tục ta nhận được:
{
}
0
() () ()
r
ii
x
SX SX ZX
+−
++=
(
()
i

Z
X
nguyên).
Ta có hai trường hợp sau:
Trường hợp 1: () ()0SX SX
+−
+
≥ . Khi đó
{
}
0
() 0
r
ii
ZX x≥>
, và do
()
i
Z
X nguyên nên ()1
i
ZX≥ , suy ra
{
}
0
() ()1
r
i
SX SX x
+−

+≥−
, tiếp theo do
(18)


{
}
{
}
00
()1 ()1
rr
ii
SX x SX x
+−
≥− − ≥− .
Vì vậy

{
}
{}
{}
0
0
0
()
1
r
i
r

i
r
i
x
SX x
x
+


(19)
Trường hợp 2: () ()0SX SX
+−
+
< . Khi đó
{
}
0
()
r
ii
Z
Xx< , và do ()
i
Z
X
nguyên nên
()0
i
ZX≤ . Suy ra
{}

{} {}
{}
0
00
0
() () ()0
() () (do ()0)
( ) (20)
r
ii
rr
ii
r
i
xSXSXZX
SX x SX x SX
SX x
+−
−+ +

++=≤
−≥+ ≥ ≥
−≥

Hợp nhất trong Trường hợp 1 gồm (19) và (18), trong Trường hợp 2 gồm (20) và
(17) ta được bất đẳng thức
{
}
{}
{}

0
0
0
() ()
1
r
i
r
i
r
i
x
SX SX x
x
+−
−≥

,
hay viết lại là
{}
{}
() () {}
0
''
ij ij 0
0
(21)
1
rr
r

i
r
jji
r
jN jN
i
x
xx xx x
x
+−
∈∈
−+ ≥

∑∑

Chú ý rằng bất đẳng thức (21) có dạng
{
}
0
ij 1
(),
r
r
jj i
jN
jj
xx
yjn
γ
γγ



=≤


ở đây
0
j
γ
≥ và
{}
00
r
i
x
γ
= không phụ thuộc vào cách chọn
ij
y . Vì vậy các số
ij
y nên
chọn sao cho
ij
()
j
y
γ
là nhỏ nhất, trong trường hợp đó sẽ cắt được phần đa diện L
r


nhiều nhất.
a) Từ (21) và
'r
ij ij ij 1
,,
r
x
xyjNjn=− ∈ ≤
ta có

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


()
{
}
{}
()
0
rr
ij ij ij ij
0
ij
rr
ij ij ij ij
khi 0
1
khi 0
r
i

r
i
j
x
yx yx
x
y
xy xy
γ


−>



=



−≥



Khi
r
ij
x
nguyên ta có thể đặt
r
ij ij

yx
=
và ta nhận được
ij
()0
jj
y
γ
γ
=
= , đó là cực
tiểu của
ij
()
j
y
γ
(vì
ij
()0
j
y
γ
≥ ).
Trường hợp
r
ij
x
không nguyên, khi đó
{}

{}
()
{
}
{}
{}
()
00
rr r
ij ij ij ij ij
00
min 0 1
11
rr
ii
rr
ii
xx
A
yxyx x
xx


=−−>=−

−−



(vì

{
}
rrr
ij ij ij ij ij
yxy x x

−=− −

nên A đạt cực tiểu khi ta chọn
r
ij ij
1yx

=
+

).

{
}
{
}
rr r
ij ij ij ij ij
min 0
B
xyxy x=−−≥=
(vì
{
}

rr r
ij ij ij
x
xx

=+

nên B đạt cực tiểu khi ta chọn
r
ij ij
yx


=


).
Như vậy khi tính đến điều kiện cực tiểu ta nhận được
{
}
{}
{}
()
{}
0
rr
ij ij
0
min 1 ,
1

r
i
j
r
i
x
x
x
x
γ




=−







Đối với hàm tuyến tính
{
}
{}
()
0
0
() 1

1
r
i
r
i
x
Z
xx
x
=


với (0 1)
x

≤ ta có:
{
}
{}
{}
{}
()
{}
0
0
0
00
(0)
1
(1) 0 1.

r
i
r
i
r
i
rr
ii
x
Z
x
x
Zx x
Z
=>

=
=<

Do đó ta có
{}
{
}
{}
0
0
khi
min ( ),
( ) khi .
r

i
r
i
x
xx
Zx x
Z
xxx



=

>



Áp dụng điều đó để tính hệ số của lát cắt ta nhận được biểu thức:

{}
{
}
{
}
{}
{}
{}
()
{}{ }
rr

ij ij 0
0
rr
ij ij 0 1
0
khi
1 khi ,
1
r
i
r
j
i
r
ir
r
i
xxx
x
x
xxjNjn
x
γ




=



>∈≤






b) Còn với
1
,1
r
jNjn∈≥+ thì
'r
ij ij
x
x
=
. Từ (21) ta có

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


{}
{}
()
rr
ij 1 ij
0
rr
ij 1 ij

0
khi , 0
khi , 0
1
r
j
i
r
i
xjnx
x
xjnx
x
γ

>≥


=

−><





Định lý đã được chứng minh xong.

2.3. Quy tắc xây dựng lát cắt đúng. Giả sử
(

)
,
r
XLC
không thoả mãn điều
kiện nguyên (10) và T
r
=
r
ij
x
là bảng đơn hình tương ứng. Chọn

{
}
{
}
10
min 1,2, , ; không nguyên
r
i
kii nx=∈

Nếu hàm mục tiêu x
0
cũng thoả mãn điều kiện nguyên thì chọn
{
}
{
}

10
min 0,1,2, , ; không nguyên
r
i
kii nx=∈
và xây dựng lát cắt đúng:

()()
1
10
0
r
nr
nr j j
jN
x
x
x
γγ
++
++


=
−+ − −


trong đó
0
,

j
γ
γ
tính theo (14) với i = k.

2.4. Tính hữu hạn của thuật toán Gomory thứ 2 chứng minh tương tự như chứng
minh tính hữu hạn của thuật toán Gomory thứ nhất. Khi đó đòi hỏi các điều kiện:
1) Hàm mục tiêu x
0
thoả mãn điều kiện nguyên, điều đó được tính đến khi chọn
dòng k để xây dựng lát cắt đúng.
2) Thực hiện một trong hai điều kiện:
- Hàm mục tiêu x
0
bị chặn dưới trên tập đa diện lồi L ≡ L
0

- Bài toán
()
0
,
N
L
C
có ít nhất một phương án
Nhờ thuật toán Gomory thứ 2 (khi n
1
= n) ta có thể giải bài toán qui hoạch tuyến
tính nguyên toàn phần, nhưng không có cơ sở để so sánh hiệu quả của hai phương pháp
2.5. Giải ví dụ bằng số

Giải bài toán quy hoạch tuyến tính nguyên bộ phận sau:
Max
3210
43 xxxx
+

=

4259
321

+
− xxx
18263
321


+ xxx
2757
321

+
+ xxx
31052
321

+
+
− xxx
0≥

j
x
, .3,2,1
=
j


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


21
, xx
nguyên
0
x nguyên.
Sau khi thêm các biến bù bài toán trở thành:
Max
3210
43 xxxx
+

=

3214
2594 xxxx
+

+

=


3215
26318 xxxx
+


=
3216
7572 xxxx
+
+
+

=

3217
10523 xxxx


+
=

0,,,,,,
7654321
≥xxxxxxx

210
, xxx , nguyên.
Vì bảng đơn hình ban đầu không l- chuẩn ta cần thêm ràng buộc phụ:
100

321
=≤++ gz xxx hay
3218
100 xxxx



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










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
và tiếp tục một bước đơn hình đối ngẫu từ vựng ta được bảng 3 và bảng 4
1 - x
1

-x
2
-x
3

x
0
0.00000 -3.00000 1.00000 -4.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
-4.00000 -9.00000 5.00000 -2.00000
x
5
18.00000 3.00000 6.00000 -2.00000
x
6
-2.00000 -7.00000 -5.00000 -7.00000
x
7
3.00000 -2.00000 5.00000 10.00000


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












Bảng 2








Bảng 3









Bảng 4
x
9
-0.38462 -0.69231* -0.23077 -1.46154

1 - x
1
-x
2
-x
8

x
0
400.00000 1.00000 5.00000 4.00000
x
1
0.00000 -1.00000 0.00000 -0.00001
x
2
0.00000 0.00000 -1.00000 -0.00001
x
3
100.00000 1.00000 1.00000 1.00000
x
4
196.00000 -7.00000 7.00000 2.00000
x
5

218.00000 5.00000 8.00000 2.00000
x
6
698.00000 0.00000 2.00000 7.00000
x
7
-997.00000 -12.00000* -5.00000 -10.00000
1 - x
7
-x
2
-x
8

x
0
316.91667 0.08333 4.58333 3.16667
x
1
83.08333 -0.08333 0.41667 0.83333
x
2
0.00000 0.00000 -1.00000 -0.00001
x
3
16.91667 0.08333 0.58333 0.16667
x
4
777.58333 -0.58333 9.91667 7.83333
x

5
-197.41667 0.41667 5.91667 -2.16667 *
x
6
698.00000 0.00000 2.00000 7.00000
x
7
0.00000 -1.00000 0.00000 0.00000
1 - x
7
-x
2
-x
5

x
0
28.38462 0.69231 13.23077 1.46154
x
1
7.15385 0.07692 2.69231 0.38462
x
2
0.00000 0.00000 -1.00000 -0.00001
x
3
1.73077 0.11538 1.03846 0.07692
x
4
63.84615 0.92308 31.30769 3.61538

x
5
0.00000 0.00000 0.00000 -1.00000
x
6
60.19231 1.34615 21.11538 3.23077
x
7
0.00000 -1.00000 0.00000 0.00000

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


Tám dòng đầu của bảng 4 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 ra lát cắt ở dòng x
9
theo quy tắc lát cắt đúng và ta được bảng
4. 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 5 là 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 5
x
10
-0.11111 -0.11111 -0.04167 -0.22222*


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 6 là bảng
đơn hình l- chuẩn và không chấp nhận được (do x
7
nhận giá trị âm).








Bảng 6
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 quy hoạch tuyến
tính phụ ta được bảng 7. Bảy dòng đầu của bảng 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 ra lắt cắt ở dòng x

11
theo quy tắc . Chọn dòng x
11
làm
dòng quay.
1 - x
9
-x
2
-x
5

x
0
28.00000 1.00000 13.00000 0.00000
x
1
7.11111 0.11111 2.66667 0.22222
x
2
0.00000 0.00000 -1.00000 -0.00000
x
3
1.66667 0.16667 1 -0.16667
x
4
63.33333 1.33333 31 1.66667
x
5
0.00000 0.00000 0.00000 -1.00000

x
6
59.44444 1.94444 20.66667 0.38889
x
7
0.55556 -1.44444 0.33333 2.11111
1 - x
9
-x
2
-x
10

x
0
28.00000 1.00000 13.00000 0.00000
x
1
7.00000 0.00000 2.625 1.00000
x
2
0.00000 0.00000 -1.00000 -0.00001
x
3
1.75000 0.25000 1.03125 -0.75000
x
4
62.50000 0.50000 30.6875 7.50000
x
5

0.50000 0.50000 0.1875 -4.50000
x
6
59.25000 1.75000 20.59375 1.75000
x
7
-0.50000 -2.50000* -0.0625 9.50000

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











Bảng 7
x
11
-0.80000 -0.40000* -0.1 -3.80000
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 8 là
bảng đơn hình l- chuẩn và không chấp nhận được (do x
5
nhận giá trị âm).









Bảng 8
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 quy hoạch tuyến
tính phụ ta được bảng 9 là 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
7
-x
2
-x
10

x
0
27.80000 0.40000 12.975 3.80000
x
1
7.00000 0.00000 2.625 1.00000

x
2
0.00000 0.00000 -1.00000 0.00000
x
3
1.70000 0.10000 1.025 0.20000
x
4
62.40000 0.20000 30.675 9.40000
x
5
0.40000 0.20000 0.175 -2.60000
x
6
58.90000 0.70000 20.55 8.40000
x
7
0.00000 -1.00000 0.00000 0.00000
1 - x
11
-x
2
-x
10

x
0
27.00000 1.00000 12.875 0.00000
x
1

7.00000 0.00000 2.625 1.00000
x
2
0.00000 0.00000 -1.00000 0.00000
x
3
1.50000 0.25000 1 -0.75000
x
4
62.00000 0.50000 30.625 7.50000
x
5
-0.0000001 0.50000 0.125 -4.50000*
x
6
57.50000 1.75000 20.375 1.75000
x
7
2.00000 -2.50000 0.25 9.50000
1 - x
11
-x
2
-x
5

x
0
27.00000 1.00000 12.875 0.00000
x

1
7.00000 0.11111 2.65278 0.22222
x
2
0.00000 0.00000 -1.00000 0.00000
x
3
1.50000 0.16667 0.97917 -0.16667
x
4
62.00000 1.33333 30.83333 1.66667
x
5
0.00000 0.00000 0 -1.00000
x
6
57.50000 1.94444 20.42361 0.38889
x
7
2.00000 -1.44444 0.51389 2.11111

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



Bảng 9

Vậy phương án tối ưu là (7, 0, 1.5, 62, 0, 57.5, 2) với trị tối ưu là x[ 0] = 27 .
2.6. 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 bộ phận, có

dạng:

max
1
0
→=

=
j
m
j
j
xcx
ij
m
j
ij
bxa ≤

=1
,
pi , ,1
=

0≥
j
x , m
j
, ,2,1
=


mnjDx
jj

=

1
n;
1
, ,2,1,
các b[i] có thể dương và âm, phương án xuất phát 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
=−−+=

=
+

., ,2,10 pmjx
j
+
=

mnjDx
jj

=

1
n;
1
, ,2,1,
• 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 ,

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



- x
0
=0 nếu x
0
đòi hỏi 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 xuất phát s 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
Các 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, n
1
, 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 trên thì vào số liệu sau được ghi ở tệp VDG2.CPP
7 3 100 2 0 3
0 -3 1 -4
0 -1 0 0
0 0 -1 0
0 0 0 -1
-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 IV.13 Quy hoạch rời rạc


-4 -9 5 -2
18 3 6 -2
-2 -7 -5 -7
3 -2 5 10
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,t4,t5;
int kgd,kgd2,blap,blap2,sb,cmin,x0,ss;
int m,n,n1,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);
f1=fopen(s1,"r");
fscanf(f1,"%d%d%lf%d%d%d",&n,&m,&gz,&n1,&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]) ;

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


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,gz,n1,x0,ss=%d %d %13.5lf %d %d%d",n,m,gz,n1,x0,ss);
if (tg==1){ printf("\nVao ten tep chua ket qua : ");
gets(s2);
f2=fopen(s2,"w");
fprintf(f2,"\nn,m,gz,n1,x0,ss=%d%d%13.5lf%d%d%d",n,m,gz,n1,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("\nBang1,ban dau,l-chuan,khong chap nhan duoc,chay DHDN");
if (tg==1)
fprintf(f2,"\nBang 1,ban dau,l- chuan,
khong chap nhan duoc,chay DHDN");
lc = n; 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++)
{ for (i=0; i<=n;i++)
{ if (s[i][cmin] > s[i][j]) {cmin=j; break;}
if (s[i][cmin] < s[i][j]) break;

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


} }

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); lc = n+1;
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; }
// 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<=n1;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++)

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

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


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; s[n+1][0]= -(s[le][0]- floor(s[le][0]));
for (j=1; j<=m; j++)
if (nc[j]<=n1) { // khi xj <= n1
if (ktnguyen(s[le][j])) s[n+1][j]=0;
else { if ((s[le][j]-floor(s[le][j]))<=fabs(s[n+1][0]))
s[n+1][j]=-(s[le][j]-floor(s[le][j]) );
else s[n+1][j]=-(fabs(s[n+1][0])/(1-fabs(s[n+1][0])))

*(1-(s[le][j]-floor(s[le][j])));
}
} // khi xj > n1
else { if (s[le][j]<0) s[n+1][j]=-(fabs(s[n+1][0])/(1-fabs(s[n+1][0])))
*(-s[le][j]);
else s[n+1][j]=-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]);

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


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);
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)
{ for (i=0; i<=n;i++)
{t4=s[i][cmin]/fabs(s[l][cmin]);t5=s[i][j]/fabs(s[l][j]);
if (t4 > t5) {cmin=j; break;}
if (t4 < t5) 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];

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


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];
}
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);

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


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();
if (kgd==1) return 1;
printf("\nCot quay=%d, Phan tu quay=%13lf",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 trên là:
x[ 0] = 27.00000

x[ 1] = 7.00000
x[ 2] = 0.00000
x[ 3] = 1.50000
x[ 4] = 62.00000
x[ 5] = 0.00000
x[ 6] = 57.50000
x[ 7] = 2.00000
Số lượng lát cắt: 3 lát cắt
Số bảng đơn hình đã lập : 9 bảng
3. THUẬT TOÁN DALTON VÀ LLEWELLYN
3.1.
Dalton cải tiến thuật toán Gomory thứ hai cho bài toán qui hoạch tuyến tính
rời rạc bộ phận sau:

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


{}
0
1
ij
1
12 11
12 1
Max (22)
1, , (23)
0 1, , (24)
, , , 1, , ; (25)
0 , 1, ,
j

j
n
jj
j
n
ji
j
j
j
jjjjq
jj jq
xcx
ax b i m
xjn
xA AA A j nnn
AA A j n
=
=
=
==
≥=
∈≡ = ≤
=<<< =




Nếu cần ta bổ sung bất đẳng thức

1

, 1, ,
j
jjq
x
Aj n≤=
(26)
vào điều kiện (23), khi đó phương án X của bài toán (L
0
,C) (22) – (24) thoả mãn điều
kiện
1
0 , 1, ,
j
jjq
x
Aj n

≤=.
3.2. Định lý 1. Giả sử
(
)
,
r
r
XLC X≡ là phương án tựa tối ưu của bài toán
(
)
,
r
L

C và
r
ij
r
Tx= là bảng đơn hình tương ứng,
1
0,1
1
r
ii i
in
A
xA
υ
υ
+


<<

Khi đó bất đẳng thức

0
r
jj
jN
x
γ
γ




(27)
hay viết lại là
0
(28)
0(29)
r
jj
jN
Zx
Z
γγ

=− +



là một lát cắt đúng, trong đó:
()
00
0
,1 0
(30)
0
(31)
0
r
ii
rr

ij ij
r
j
rr
ii
ij ij
r
ii
xA
xx
xA
xx
Ax
υ
υ
υ
γ
γ
+
=−



=


−<





Chứng minh định lý. Kiểm tra tính cắt:
00
0
r
rr
jj i i
jN
x
xA
υ
γγ

=< = −

(do 0
r
j
x
=
).
Kiểm tra tính đúng. Giả sử X là phương án của bài toán rời rạc, với i đã chọn, biểu
diễn x
i
qua các biến phi cơ sở như sau:

(
)
r
0ij

r
r
ii j
jN
xx xx

=+ −

(32)
Có 2 khả năng:

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


1)
,1ii
xA
υ
+
≥ (33)
2)
ii
xA
υ
≤ (34)
Ta đưa vào các ký hiệu:
(
)
{}
{

}
()
{}
{}
()
()
rr
ij ij
rr
ij ij
r
ij
r
ij
,0 ,0
,0 ,0
r
r
rr r
rr r
j
jN
j
jN
NjjNx jjNx
N jjN x jjNx
Sxx
Sxx

+


+


+

=∈−≤=∈ ≥
=∈−>=∈ <
=−
=−



Từ (32) ta có
0
(35)
0(36)
0(37)
r
ii
xx S S
S
S
−+

+
=++




Xét Trường hợp 1, tức là
,1ii
x
A
υ
+

. Từ (33) và (35) ta có
0,1
r
ii
x
SSA
υ
−+
+
++≥
,
suy ra
(
)
(
)
,1 0 ,1 0
(do 0)
rr
ii ii
SA xSA x S
υυ
+− −

++
≥−−≥− −≥
. T
iếp theo

0
0
,1 0
()
r
r
ii
ii
r
ii
xA
SxA
Ax
υ
υ
υ
+
+

≥−


(38)
Xét Trường hợp 2, tức là
ii

x
A
υ

. Từ (34) và (35) ta có
0
r
ii
x
SSA
υ
−+
+
+≤,
suy ra
(
)
0
r
ii
x
AS S
υ
+−
−+≤−, tiếp theo do 0S
+
≥ nên ta có

0
()

r
ii
xA S
υ

−≤− (39)


Trong cả 2 trường hợp, từ (36) và (37) ta có
0
,1 0
0 (40)
0(41)
r
ii
r
ii
xA
S
Ax
S
υ
υ
+
+




−≥



Đối với Trường hợp 1 hợp nhất (38) và (41), đối với Trường hợp 2 hợp nhất (39)
và (40), trong cả 2 trường hợp ta đều có
0
0
,1 0
()
r
r
ii
ii
r
ii
xA
SS xA
Ax
υ
υ
υ
+−
+

−≥ −


hay viết lại

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



()
0
00
,1 0
()
rr
r
rrr
ii
ij j ij j i i
r
jN jN
ii
xA
xx xx x A
Ax
υ
υ
υ
γ
+−
∈∈
+


+≥−=

∑∑


viết cách khác
0
() 0
r
jj
jN
ZX x
γγ

=− + ≥

là lát cắt đúng, trong đó
()
00
0
,1 0
,0
,0
r
ii
rr
ij ij
r
j
rr
ii
ij ij
r
ii
xA

xx
xA
xx
Ax
υ
υ
υ
γ
γ
+
=−



=


−<




Định lý đã được chứng minh xong.
3.3. Quy tắc xây dựng lát cắt đúng. Giả sử
(
)
,
r
XLC
không thoả mãn điều

kiện rời rạc và
0
r
ij
,
n
r
r
iQ jN
Tx
∈∈
= là bảng đơn hình tương ứng. Chọn

{
}
{
}
10
min 1,2, , ; không thoa (25)
r
i
kii nx=∈

và xây dựng lát cắt đúng:
()()
1
10
0
r
nr

nr j j
jN
x
x
x
γγ
++
++


=
−+ − −


trong đó
0
,
j
γ
γ
được tính theo (30), (31) với i = k.

3.4. Tính hữu hạn của thuật toán này được chứng minh giống thuật toán Gomory
thứ nhất, khi đó cần phải thoả mãn các điều kiện sau:
1) Hàm mục tiêu x
0
thoả mãn điều kiện rời rạc, điều này được tính đến khi chọn
dòng k để xây dựng lát cắt đúng.
2)Thực hiện một trong hai điều kiện:
- Hàm mục tiêu bị chặn dưới trên đa diện L

- Bài toán
()
0
,
D
L
C có ít nhất một phương án
Thuật toán Dalton cũng có thể dùng để giải bài toán qui hoạch nguyên toàn phần
hoặc bộ phận nhưng kém hiệu quả hơn thuật toán Gomory thứ nhất và thứ hai.
3.5. Giải ví dụ bằng số
Giải bài toán quy hoạch tính tuyến nguyên bộ phận rời rạc sau:

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


Max
210
xxx
+
=

124
21

+
− xx
124
21

− xx

}4,1,0{
1
∈x

}5,3,1,0{
2
∈x

0
x nguyên.
Ta thêm hai biến bù x
3
và x
4
, khi đó bài toán trên trở thành:
Max
210
xxx
+
=

213
412 xxx

+
=



0

x nguyên
}4,1,0{
1
∈x
}5,3,1,0{
2
∈x

43
, xx nguyên
Từ đây ta có bảng đơn hình xuất phát (Bảng 1), vì bảng đơn hình không là l-
chuẩn nên ta dùng đơn hình thường giải bài toán quy hoạch tuyến tính ta được bảng 2
(không là l- chuẩn).






Bảng 1 Bảng 2
Tiếp tục giải ta được bảng 3 (bảng l- chuẩn , chấp nhận được). Do x
2
vi phạm
điều kiện rời rạc nên sinh ra lát cắt ở dòng x
5
và chọn nó làm dòng quay. Tiếp tục giải
bài toán quy hoạch rời rạc ta được bảng 4 (l- chuẩn và chấp nhận được). Do x
1
không
thoả mãn điều kiện rời rạc nên sinh ra lát cắt ở dòng x

6
chọn nó làm dòng quay.
1 - x
4
- x
2
x
0
3 1/4 -5/4
x
1
3 1/4 -1/4
x
2
0 0 -1
x
3
15 1/4 15/4
*

x
4
0 -1 0
1 - x
1
- x
2
x
0
0 -1 -1

x
1
0 -1 0
x
2
0 0 -1
x
3
12 -1

4
x
4
12 4
*
-1
214
412 xxx
+

=

Bùi Thế Tâm IV.24 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 5 (
bảng đơn hình l- chuẩn và chấp nhận được). Vì x
1
không thoả mãn điều kiện rời rạc nên
sinh ra lát cắt ở dòng x
7






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 6
(bảng đơn hình l- chuẩn và không chấp nhận được).
1 - x
7
- x
6
x
0
6 0 1
x
1
1 1 0
x

2
5 -1 1
x
3
-7 5 -4
*

x
4
13 -5 1
Bảng 6
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 7
(bảng đơn hình l- chuẩn và chấp nhận được). Vì x
2
không thoả mãn điều kiện rời rạc
nên sinh ra lát cắt x
8
và chọn dòng x
8
làm dòng quay.
1 - x
4
- x
5
x
0
27/4 1/4 5/4
x
1
15/4 1/4 1/4

x
2
3 0 1
x
3
15/4 1/4 -15/4
x
4
0 -1 0

Bảng 4 (T
1
)
x
6
-3/4 -1/4 -5/4
*

1 - x
4
- x
3
x
0
8 1/3 1/3
x
1
4 4/15 1/15
x
2

4 1/15 4/15
x
3
0 0 -1
x
4
0 -1 0

Bảng 3 (T
0
)
x
5
-1 -1/15 -4/15
*

1 - x
4
- x
6
x
0
6 0 1
x
1
18/5 1/5 1/5
x
2
12/5 -1/5 4/5
x

3
6 1 -3
x
4
0 -1 0

Bảng 5 (T
2
)
x
7
-13/5 -1/5
*
-1/5

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


1 - x
7
- x
3
x
0
17/4 5/4 1/4
x
1
1 1 0
x
2

13/4 1/4 1/4
x
3
0 0 -1
x
4
45/4 -15/4 1/4

Bảng 7 (T
3
)
x
8
-1/4 -5/4 -1/4*
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 8
(bảng đơn hình l- chuẩn và chấp nhận được), có cột phương án là nguyên và các biến
thoả mãn điều kiện rời rạc. Quá trình lặp kết thúc.
1 - x
7
- x
8
x
0
4 0 1
x
1
1 1 0
x
2
3 -1 1

x
3
1 5 -4
x
4
11 -5 1
Bảng 8 (T
4
)
Vậy phương án tối ưu là (1, 3, 1, 11) với trị tối ưu hàm mục tiêu x[0]=4.
3.6. 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 bộ phận rời rạc,
có dạng:
Max
j
m
j
j
xcx

=
=
1
0

ij
m
j
ij
bxa =


=1
,
p
i , ,2,1
=

0≥
j
x ,
m
j
, ,2,1
=

j
x
}, ,,{
21
j
jqjj
j
AAAA ≡∈
, mnnj ≤
=
11
, ,2,1 ;
121
, ,2,1, 0 njAAA
j

jqjj
=
<
<
<
=

×