运算符与 Mosel 的不兼容类型
Incompatible types for operator with Mosel
我开始使用 Xpress Fico workbench。我试图以这种方式在 model
文件中定义一个简单模型:
model ModelName
options noimplicit
uses "mmxprs"
! uses "mminsight" ! uncomment this line for an Xpress Insight model
declarations
! indici
indexes = 1..4
contraints = 1..2
x: array(indexes) of mpvar
c: array(indexes) of integer
A: array(contraints, indexes) of real
B: array(contraints) of real
! Objective:linctr
profit: linctr
end-declarations
!profit:=250*x1+230*x2+110*x3+350*x4
c::[250, 230, 110, 350]
profit:=sum(i in indexes) c(i)*x(i)
! 2*x1+1.5*x2+0.5*x3+2.5*x4<=100
! 0.5*x1+0.25*x2+0.25*x3+x4<=50
A::[ 2, 1.5, 0.5, 2.5,
0.5, 0.25, 0.25, 1]
B::[ 100,
50]
forall(r in contraints) do
sum(c in indexes) A(r, c) * x(c) <= B(r)! body...
end-do
writeln("Begin running model")
maximise(profit)
writeln("profit: ", getobjval)
forall(i in indexes) do
writeln("x( ", i, ")", getsol(x(i)))
end-do
writeln("End running model")
end-model
当我尝试构建文件时收到以下错误
Mosel: E-101 at (33,21) of `studio/esL01_01.1.mos': Incompatible types for operator (`array of integer' in `range' not defined).
Mosel: E-151 at (33,31) of `studio/esL01_01.1.mos': Incompatible type for subscript 2 of `A'.
有什么解决这个问题的建议吗?
您的代码中有两个问题,
首先,您在总和中使用 c 作为迭代器,但它在上面被声明为数组。所以 Mosel 抱怨说你正在使用范围内的数组,这是你做不到的。在 Mosel 中,你不应该使用一个已经声明的变量作为迭代器。所以我把你的迭代器改成了 cc.
其次,您的目标是对 A(r, c) * x(c) 求和。你需要在它们两边加上括号,这样 Mosel 就知道你的总和在哪里结束。否则,它将假设您只对第一个元素 A(r, cc) 求和。
所以你的循环应该是这样的:
forall(r in contraints) do
sum(cc in indexes) (A(r, cc) * x(cc)) <= B(r)! body...
end-do
对先前答案的更正:Mosel 对运算符的评估应用标准优先规则(即,乘法优先于加法),因此从语言的角度来看,乘积项周围的括号不是必需的 - 尽管它们可能有助于提高可读性——所以你也可以这样写:
forall(r in contraints) do
sum(cc in indexes) A(r, cc) * x(cc) <= B(r)! body...
end-do
我开始使用 Xpress Fico workbench。我试图以这种方式在 model
文件中定义一个简单模型:
model ModelName
options noimplicit
uses "mmxprs"
! uses "mminsight" ! uncomment this line for an Xpress Insight model
declarations
! indici
indexes = 1..4
contraints = 1..2
x: array(indexes) of mpvar
c: array(indexes) of integer
A: array(contraints, indexes) of real
B: array(contraints) of real
! Objective:linctr
profit: linctr
end-declarations
!profit:=250*x1+230*x2+110*x3+350*x4
c::[250, 230, 110, 350]
profit:=sum(i in indexes) c(i)*x(i)
! 2*x1+1.5*x2+0.5*x3+2.5*x4<=100
! 0.5*x1+0.25*x2+0.25*x3+x4<=50
A::[ 2, 1.5, 0.5, 2.5,
0.5, 0.25, 0.25, 1]
B::[ 100,
50]
forall(r in contraints) do
sum(c in indexes) A(r, c) * x(c) <= B(r)! body...
end-do
writeln("Begin running model")
maximise(profit)
writeln("profit: ", getobjval)
forall(i in indexes) do
writeln("x( ", i, ")", getsol(x(i)))
end-do
writeln("End running model")
end-model
当我尝试构建文件时收到以下错误
Mosel: E-101 at (33,21) of `studio/esL01_01.1.mos': Incompatible types for operator (`array of integer' in `range' not defined).
Mosel: E-151 at (33,31) of `studio/esL01_01.1.mos': Incompatible type for subscript 2 of `A'.
有什么解决这个问题的建议吗?
您的代码中有两个问题,
首先,您在总和中使用 c 作为迭代器,但它在上面被声明为数组。所以 Mosel 抱怨说你正在使用范围内的数组,这是你做不到的。在 Mosel 中,你不应该使用一个已经声明的变量作为迭代器。所以我把你的迭代器改成了 cc.
其次,您的目标是对 A(r, c) * x(c) 求和。你需要在它们两边加上括号,这样 Mosel 就知道你的总和在哪里结束。否则,它将假设您只对第一个元素 A(r, cc) 求和。
所以你的循环应该是这样的:
forall(r in contraints) do
sum(cc in indexes) (A(r, cc) * x(cc)) <= B(r)! body...
end-do
对先前答案的更正:Mosel 对运算符的评估应用标准优先规则(即,乘法优先于加法),因此从语言的角度来看,乘积项周围的括号不是必需的 - 尽管它们可能有助于提高可读性——所以你也可以这样写:
forall(r in contraints) do
sum(cc in indexes) A(r, cc) * x(cc) <= B(r)! body...
end-do