modeling - 如何在 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
解决方案
由于您正在创建 中的两个变量的乘积Constraint3
,因此您的问题不再是线性的,而是现在是二次的(因此是非线性的)。这意味着您必须使用mmnl
(非线性)Mosel 模块。推杆
uses "mmnl"
在您的模型顶部应该这样做。它支持决策变量的乘法。
请注意,由于其中的二次项,您Constraint3
的类型将不再是linctr
. 现在将是nlctr
,您必须在声明中进行调整。
推荐阅读
- python - tkinter 按钮破坏框架并从列表中删除索引
- php - 如何在 HTML 中迭代 PHP 数组
- kubernetes - 将 Atlassian Confluence 迁移到 Kuberntes
- caching - 没有缓存标头的浏览器如何处理预加载?
- python - Python - 获取两个日期之间的平均值
- spring-boot - 同一用户的Spring Boot Stomp WebSocket多个会话
- macos - 来自 mac CLI 的 Forticlient VPN
- javascript - 为什么 for-each 有效,但 for...of... 无效?
- python - 无法在 Google Cloud 中为存储桶添加生命周期规则
- arrays - 在反应钩子中使用一组图像在图像网格和图像滑块之间切换