首页 > 解决方案 > 我将 d 定义为二进制变量,但解是 xpress mosel 中 0 和 1 之间的连续变量

问题描述

我试图为整数编程建模,但即使我将 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

标签: mosel

解决方案


您的问题可能是不可行的,在这种情况下,您会得到不可行的值。尝试添加此代码

  case getprobstat of
    XPRS_OPT: status:="Optimum found"
    XPRS_UNF: status:="Unfinished"
    XPRS_INF: status:="Infeasible"
    XPRS_UNB: status:="Unbounded"
    XPRS_OTH: status:="Failed"
    else status:="???"
  end-case
  writeln("Problem status: ", status)

除非这表明可行的解决方案可用,否则 from 的值getsol()可能不是二进制的。


推荐阅读