题目
数学模型
思路
目标:使消防站的数量最小
每个地区可以选择建与不建,用01变量
约束条件
变量
决策变量 xi = {0,1} 0 表示第i个地区不建,1表示第i个地区建
rij 表示第i个城市建站能否在10分钟内到j,能1,不能0
m
i
n
z
=
∑
x
i
s
.
t
.
{
∑
i
x
i
∗
r
i
j
>
=
1
x
i
∈
{
0
,
1
}
min z = \sum xi\\ s.t.\left\{ \begin{matrix} \sum_i xi * rij >= 1\\ xi \in \{0,1\} \end{matrix} \right.
minz=∑xis.t.{∑ixi∗rij>=1xi∈{0,1}
完整代码
model:
sets:
area/1..8/:x;
link(area,area):r,dis;
endsets
data:
!r = 1 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0
0 1 1 0 1 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 1 1 0
0 0 0 0 0 0 1 1
0 0 0 0 0 0 1 1;
dis = 7 12 18 20 24 26 25 28
14 5 8 15 16 18 18 18
19 9 4 14 10 22 16 13
14 15 15 10 18 15 14 18
20 18 12 20 9 25 14 12
18 21 20 16 20 6 10 15
22 18 20 15 16 15 5 9
30 22 15 20 14 18 8 6;
enddata
! use calc to calculate the matrix r;
calc:
@for(area(i):
@for(area(j):
r(i,j) = @if(dis(i,j) #le# 10,1,0)
)
);
endcalc
min = @sum(area(i): x(i));
@for(area(i):
@sum(area(j):x(j) * r(j,i)) >= 1 ) ;
@for(area(i):@bin(x(i)));
end
end