问题描述
我正在尝试在 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,1,0 ]
! Neighbours in the grid.
N:: [ 0,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
解决方法
由于您在 Constraint3
中创建两个变量的乘积,因此您的问题不再是线性的,而是二次的(因此是非线性的)。这意味着您必须使用 mmnl
(非线性)Mosel 模块。放置
uses "mmnl"
在您的模型顶部应该这样做。它支持决策变量的乘法。
请注意,由于其中包含二次项,您的 Constraint3
将不再属于 linctr
类型。现在将是 nlctr
,您必须在声明中对其进行调整。