首页 > 解决方案 > 如何在 Xpress IVE 中声明约束?

问题描述

我正在尝试在 Xpress IVE 中编写模型,但是出现 错误 101:运算符的不兼容类型('mpvar' * 'mpvar' not defined)。错误。

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

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

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

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

标签: modelingmixed-integer-programminginteger-programmingmoselxpress-optimizer

解决方案


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

uses "mmnl"

在您的模型顶部应该这样做。它支持决策变量的乘法。

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


推荐阅读