【问题标题】:I defined d as a binary variable but the solution is continuous variable between 0 and 1 in xpress mosel我将 d 定义为二进制变量,但解是 xpress mosel 中 0 到 1 之间的连续变量
【发布时间】:2021-03-08 17:52:04
【问题描述】:

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

【问题讨论】:

  • 您看到的是所有变量的连续值还是仅部分变量的连续值?您不会将所有变量都定义为二进制:在将变量声明为二进制的语句中,索引范围从 1 到 7。在 d 的声明中,n_rn_c 的索引范围从 0 到 8 ,不过。

标签: mosel


【解决方案1】:

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

  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)

除非表明存在可行的解决方案,否则来自getsol() 的值可能不是二进制的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    相关资源
    最近更新 更多