1. 程式人生 > >拓撲排序的 +Leapms 線性規劃模型

拓撲排序的 +Leapms 線性規劃模型

left clas lena sum gin 排序 一個 rec 進行

知識點

拓撲排序

拓撲排序的+Leapms模型

無圈有向圖

一個圖G(V,E), 如果邊有向且不存在回路,則為無圈有向圖。在無圈有向圖上可以定義拓撲排序。下圖是一個無圈有向圖的例子。

技術分享圖片

拓撲排序

給定一個無圈有向圖G(V,E),對其頂點集合V中的元素進行排序,使得對任何兩個頂點v1,v2,如果(v1,v2)是圖上的一條邊,則在排序中v1優先於v2.

拓撲排序的+Leapms模型

對圖G(V,E)中的邊的表示可以用其起始邊和終止邊表示,對第k條邊,其起始定點使用函數alpha[k]表示,其終止頂點用beta[k]表示。

設m是圖中的邊數,n是圖中的頂點數。設x[i]是頂點i的次序數(拓撲排序中允許並列次序,例如並列第2等等)。

於是對任意一條邊,其終止頂點的次序數一定至少比其起始頂點的次序數大至少1。於是有約束:

x[bata[k]]>=x[alpha[k]]+1 | k=1,...,m

希望至少從1開始編號次序數,於是有另外的約束:

x[i]>=1|i=1,...,n

為了對次序數進行緊湊編號,模型的目標設為極小化所有次序數的和:

min sum{i=1,...,n}x[i]

完整的+Leapms模型為:

min sum{i=1,...,n}x[i]
subject to
	x[bata[k]]>=x[alpha[k]]+1 | k=1,...,m
	x[i]>=1|i=1,...,n

where
	m,n are integers
	e is a set
	alpha[k],bata[k] are integers| k=1,...,m
	x[i] is a variable of nonnegative number| i=1,...,n

data_relation
	m=_$(e)/2
	alpha[k]=e[2k-1]  | k=1,...,m
	bata[k]=e[2k] | k=1,...,m
	n=0
	n=max(n,alpha[k]) | k=1,...,m
	n=max(n,bata[k]) | k=1,...,m

data
    e={
	(1 2)
	(1 3)
	(1 4)
	(2 3)
	(2 5)
	(3 5)
	(3 6)
	(4 6)
	(4 7)
	(5 6)
	(5 8)
	(6 8)
	(6 9)
	(7 6)
	(7 10)
	(8 9)
	(8 11)
	(9 11)
	(10 9)
	(10 11)
    }

求解過程:

+Leapms>load
 Current directory is "ROOT".
 .........
        toposort.leap
 .........
please input the filename:toposort
================================================================
1:  // x[i] 是 i點的拓撲排序層次
2:
3:  min sum{i=1,...,n}x[i]
4:  subject to
5:      x[bata[k]]>=x[alpha[k]]+1 | k=1,...,m
6:      x[i]>=1|i=1,...,n
7:
8:  where
9:      m,n are integers
10:     e is a set
11:     alpha[k],bata[k] are integers| k=1,...,m
12:     x[i] is a variable of nonnegative number| i=1,...,n
13:
14:  data_relation
15:     m=_$(e)/2
16:     alpha[k]=e[2k-1]  | k=1,...,m
17:     bata[k]=e[2k] | k=1,...,m
18:     n=0
19:     n=max(n,alpha[k]) | k=1,...,m
20:     n=max(n,bata[k]) | k=1,...,m
21:
22:  data
23:      e={
24:     (1 2)
25:     (1 3)
26:     1 4
27:     2 3
28:     2 5
29:     3 5
30:     3 6
31:     4 6
32:     4 7
33:     5 6
34:     5 8
35:     6 8
36:     6 9
37:     7 6
38:     7 10
39:     8 9
40:     8 11
41:     9 11
42:     10 9
43:     10 11
44:      }
================================================================
>>end of the file.
Parsing model:
1D
2R
3V
4O
5C
6S
7End.
..................................
number of variables=11
number of constraints=31
..................................
+Leapms>mip
relexed_solution=45; number_of_nodes_branched=0; memindex=(2,2)
The Problem is solved to optimal as an MIP.
找到整數規劃的最優解.非零變量值和最優目標值如下:
  .........
    x1* =1
    x2* =2
    x3* =3
    x4* =2
    x5* =4
    x6* =5
    x7* =3
    x8* =6
    x9* =7
    x10* =4
    x11* =8
  .........
    Objective*=45
  .........
+Leapms>

標記在圖上

技術分享圖片

拓撲排序的用途

拓撲排序在算法設計上有廣泛的用途,例如在制造資源管理中的Gozinto圖的計算等。

對上述圖如果有向邊表示次序關系,則可刪除任何起始頂點和終止頂點次序數相差大於2的邊得到更加簡化的圖,且不改變次序邏輯:

技術分享圖片

技術分享圖片

拓撲排序的 +Leapms 線性規劃模型