我有一个二进制变量形式的cplex约束,将一个> =的数字乘以另一个数字。 第二个数字计算起来很复杂,我想我需要一种方法来计算它,有可能在cplex中编写这样的约束:
k*y[i] > method(parameter1,parameter2)
在该方法中,我需要访问二进制变量值。 非常感谢您的答复。
答案 0 :(得分:1)
让我尝试这个oulipo挑战。 编写一个有效的OPL模型,其中包含您编写的内容。
可以
float k=1.2;
dvar boolean y[1..1];
int parameter1=1;
int parameter2=2;
dvar boolean x;
dexpr float method[i in 1..10,j in 1..10]=x*(i+j);
subject to
{
forall(i in 1..1)
k*y[i] >= method[parameter1,parameter2];
}
帮助?
致谢
PS:
您以后的评论:
float k=1.2;
dvar boolean y[1..1];
int parameter1=1;
int parameter2=2;
dvar boolean x;
float methodresults[i in 1..10,j in 1..10]; //=x*(i+j);
range r=1..10;
execute
{
function method(i,j)
{
return i+j;
}
for(var i in r) for (var j in r) methodresults[i][j]=method(i,j);
}
subject to
{
forall(i in 1..1)
k*y[i] >= x*methodresults[parameter1,parameter2];
}
答案 1 :(得分:0)
如果在.mod
文件中使用脚本,则可以在execute
块[1]中定义函数。这些块定义了用ILOG脚本[2]编写的预处理或后处理指令。这是https://www.ibm.com/support/knowledgecenter/SSSA5P_12.9.0/ilog.odms.ide.help/OPL_Studio/opllangref/topics/opl_langref_script_struct_statements_function.html文档中的一个简单示例。
execute {
function add(a, b) {
return a+b
}
writeln(add(1,2));
}