语法格式
派生集合的名字(父集合1,父集合2,。。。)【/元素列表/】【:属性列表】
直接罗列法
e.g.
factory/A1..A3/;
shop/B1..B4/;
link(factory,shop)
/A1 B1,A1 B2,
A2 B3, A2 B4,
A3 B1/;
元素过滤法
e.g.
factory/A1..A3/;
shop/B1..B4/;
link(factory,shop)| &1 #le# &2;
最短路径问题的整数规划
题目
数学建模
变量
决策变量
xij = 1 表示源点到终点的最短路经过弧(i,j)
xij = 0 表示不经过弧(i,j)
u = {A,B,C,D,E,F,G} 表示所有点
λ
=
{
(
A
,
B
)
,
(
A
,
C
)
.
.
}
\lambda = \{(A,B),(A,C)..\}
λ={(A,B),(A,C)..} 表示所有路
约束条件
如果经过i,那么有进有出;否则无进无出
必须有一条从A出去的路
必须有一条到G的路
m
i
n
z
=
∑
w
i
j
∗
x
i
j
s
.
t
.
{
∑
x
i
j
=
∑
x
j
i
∑
x
A
i
=
1
∑
x
i
G
=
1
x
∈
{
0
,
1
}
(
i
,
j
)
∈
λ
min z = \sum wij * xij\\ s.t.\left\{ \begin{matrix} \sum x_{ij} = \sum x_{ji}\\ \sum x_{Ai} = 1\\ \sum x_{iG} = 1\\ x \in \{0,1\} (i,j) \in \lambda \end{matrix} \right.
minz=∑wij∗xijs.t.⎩
⎨
⎧∑xij=∑xji∑xAi=1∑xiG=1x∈{0,1}(i,j)∈λ
lingo建模
完整代码
model:
sets:
city/1 2 3 4 5 6 7/;
link(city,city)/
1 2,1 3,
2 4,2 5,2 6,
3 4,
3 5,3 6,
4 7,
5 7,
6 7/:w,x;
endsets
data:
w =
2 4
3 5 1
2 3 6
4
3
5;
enddata
min = @sum(link(i,j): w(i,j) * x(i,j));
@for(city(i)| i #NE# 1 #AND# i #NE# 7:
@sum(link(i,j):x(i,j))
=
@sum(link(k,i):x(k,i))
);
@sum(link(i,j)|i #EQ# 1:x(i,j)) = 1;
@sum(link(i,j)|j #EQ# 7:x(i,j)) = 1;
@for(link(i,j):@bin(x(i,j)));
end
网络最大流
题目
数学模型
变量
决策变量 fij 是达到最大流时,弧(i,j)的实际流量,小于等于wij
决策变量 fmax 是最大流量,=起点流出的所有 = 终点流入的所有
m
a
x
z
=
f
m
a
x
s
.
t
.
{
∑
f
i
j
−
∑
f
j
i
=
{
f
m
a
x
,
i
=
1
−
f
m
a
x
,
i
=
7
0
,
i
≠
1
,
7
0
≤
f
i
j
≤
w
i
j
max z = fmax\\ s.t. \left\{ \begin{matrix} \sum fij - \sum fji =\left\{ \begin{matrix} fmax,i = 1\\ -fmax,i = 7\\ 0,i\neq 1,7\\ \end{matrix} \right.\\ 0 \leq fij \leq wij \end{matrix} \right.
maxz=fmaxs.t.⎩
⎨
⎧∑fij−∑fji=⎩
⎨
⎧fmax,i=1−fmax,i=70,i=1,70≤fij≤wij
lingo 建模
完整代码
model:
sets:
city/1 2 3 4 5 6 7/;
road(city,city)/
1 2, 1 3, 1 4,
2 3, 2 5,
3 4, 3 5, 3 6,
4 6,
5 6, 5 7 ,
6 7/: w,f;
endsets
data:
w =
8 10 12
3 6
4 7 4
8
9 8
10;
enddata
max = fmax;
! @size is to calculate the sizi of city,in this example,it returns 7;
N = @size(city);
@sum(road(i,j)|i #eq# 1:f(i,j)) = fmax;
@sum(road(i,j)|j #eq# N:f(i,j)) = fmax;
@for(city(i)|
i #gt# 1 #and# i #lt# N:
@sum(road(i,j):f(i,j))
=
@sum(road(j,i):f(j,i))
);
@for(road(i,j):f(i,j) <= w(i,j));
end