我试图为整数编程建模,但即使我将 d 和 v 声明为二进制变量,它也给了我 0 到 1 之间的连续变量。有人可以看看吗?提前致谢
declarations
!Ranges
row = 1..7
column = 1..7
colors = 1..7
n_r = 0..8
n_c = 0..8
!Variables
d: array(n_r,n_c,colors) of mpvar
v: array(colors) of mpvar
votes :array(1..7, 1..7) of integer
obj:linctr
end-declarations
forall(i in 1..7, j in 1..7, k in 1..7) d(i,j,k) is_binary
forall(k in 1..7) v(k) is_binary
initialisations from "votes.dat"
votes
end-initialisations
forall(j in 0..8, k in 1..7) do
d(0,j,k) = 0
d(8,j,k) = 0
end-do
forall( i in 0..8, k in 1..7) do
d(i,0,k) = 0
d(i,8,k) = 0
end-do
forall(i in 1..7, j in 1..7, k in 1..7) do
d(i,j,k) <= d(i+1,j,k) + d(i-1,j,k) + d(i,j+1,k) + d(i,j-1,k)
end-do
forall(i in 1..6, j in 1..7, k in 1..7) do
d(i,j,k) +d(i+1,j,k)-1 <= d(i-1,j,k) +d(i,j+1,k) +d(i+1,j+1,k)+d(i+2,j,k) + d(i+1,j-1,k) + d(i,j-1,k)
end-do
forall(i in 1..7, j in 1..6, k in 1..7) do
d(i,j,k) + d(i,j+1,k)-1 <= d(i,j+2,k) + d(i+1,j+1,k) + d(i+1,j,k) +d(i,j-1,k) + d(i-1,j,k) + d(i-1, j+1,k)
end-do
forall(i in 1..6, j in 2..6, k in 1..7) do
d(i,j,k) + d(i,j+1,k)+ d(i,j-1,k) -2 <= d(i-1,j,k) - d(i+1,j,k) - d(i+1,j+1,k) - d(i-1,j+1,k) -d(i+2,j+2,k) - d(i-1,j-1,k) - d(i+1, j-1,k) - d(i, j-2, k)
end-do
forall(i in 2..6, j in 1..7, k in 1..7) do
d(i,j,k) + d(i-1, j, k) + d(i+1,j,k)-2 <= d(i, j+1,k) - d(i,j-1,k) - d(i+1,j+1,k) - d( i+1, j-1,k) - d(i+2,j,k) - d(i-1,j+1,k) -d(i-1,j-1,k) - d(i-2, j,k)
end-do
forall(k in 1..7) do
sum(i in 1..7, j in 1..7) d(i,j,k) * votes(i,j) - 4*v(k) <= 3
end-do
forall(k in 1..7) do
sum(i in 1..7, j in 1..7) d(i,j,k) * votes(i,j) - 4 * v(k) >= 0
end-do
forall(k in 1..7) sum(i in 1..7, j in 1..7) d(i,j,k) = 7
forall(i in 1..7, j in 1..7) sum (k in 1..7) d(i,j,k) = 1
obj:= sum(k in 1..7) v(k)
maximize(obj)
write(getsol(obj))
writeln(" ")
forall(k in 1..7)do
forall(j in 1..7)do
forall(i in 1..7)do
write(getsol(d(i,j,k)), " ")
end-do
end-do
writeln(" ")
end-do
end-model