【问题标题】:How Can I declare constraints in Xpress IVE?如何在 Xpress IVE 中声明约束?
【发布时间】:2021-07-28 13:32:59
【问题描述】:

我正在尝试在 Xpress IVE 中编写模型,但是我得到了 error101:运算符类型不兼容('mpvar' * 'mpvar' 未定义)。错误。

我试图写这个约束,但我做不到。 字符串上的两个连续字符必须定位到相邻的 网格的节点。

我认为,我的模型是正确的,我的所有决策变量都是正确的。

谁能帮我解决这个问题? 这是我的代码:

grid := 16
length := 8
!sample declarations section
declarations
    ! Declaring S and N array for the input
    S: array(1..length) of integer
    N: array(1..grid,1..grid) of integer
    ! Declaring decision variables
    X: array(1..length, 1..grid) of mpvar
    V: array(1..grid) of mpvar
    C: array(1..grid,1..grid) of mpvar
    W: real
    constraint1, constraint2,constraint3: linctr
end-declarations

! Decision Variable Declaration
forall(i in 1..length, k in 1..grid) X(i,k) is_binary
forall(k in 1..grid) V(k) is_binary
forall(l in 1..grid) V(l) is_binary
forall(k in 1..grid, l in 1..grid) C(k,l) is_binary

!Input String
S:: [ 1, 0, 0, 1, 0, 1, 1, 0 ]
! Neighbours in the grid. 
N:: [ 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
     1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
     0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0,
     0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0,
     0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0,
     0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
     0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0,
     0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0,
     0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1,
     0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1,
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0]

! Finding consecutive 1's in the string
forall(i in 1..length-1) do
    if S(i) = 1 and S(i+1) = 1
    then W := W + 1
    end-if
end-do

! Declaring Constraints
! Constraint 1
forall(k in 1..grid) constraint1 := sum(i in 1..length) X(i,k) <= 1

! Constraint 2
forall(i in 1..length) constraint2 := sum(k in 1..grid) X(i,k) = 1

!Constraint 3
forall( i in 1..length - 1 ) constraint3 := (sum(j in 1..grid)(sum(k in 1..grid) N(k,j) * X(i,k) * X(i + 1,j))) = 1

【问题讨论】:

    标签: modeling mixed-integer-programming integer-programming mosel xpress-optimizer


    【解决方案1】:

    由于您要在Constraint3 中创建两个变量的乘积,因此您的问题不再是线性的,而是二次的(因此是非线性的)。这意味着您必须使用mmnl(非线性)Mosel 模块。放

    uses "mmnl"
    

    在您的模型顶部应该这样做。它可以实现决策变量的乘法。

    请注意,由于其中包含二次项,您的 Constraint3 将不再是 linctr 类型。现在它将是nlctr,您必须在声明中进行调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多