在 CPLEX 中,基于分段的逐步示例结果

问题描述 投票:0回答:1

我是一名使用 CPLEX 学习优化的学生。 我创建了一个简单的逐步示例,但我对结果有一些疑问。

dvar float x;
dvar float y;

dexpr float z= piecewise {0->0; 10->0; 0->10; 5->10; 0->20; 5->20; 0} (1,10) x;
dexpr float goal = y+z;

minimize goal;

subject to {

9<=x;
x<=18;
4<=y;
y<=10;
}

在上面的公式中,我预计 x 和 y 分别为 9 和 4,解得到的预期结果为 14。 (当 x 为 9 时,z 变为 10,因此 y+z=4+10=14。) 但是,为什么决策变量将 x 显示为 10,而目标显示为 19?

非常感谢您的回复。谢谢你。

cplex piecewise
1个回答
0
投票

你的分段是不连续的,这意味着对于 10,结果是 10 或 15

dvar float x;
dvar float y;

dvar float z;
dvar float goal;

pwlFunction f=piecewise {0->0; 10->0; 0->10; 5->10; 0->20; 5->20; 0} (1,10);

minimize goal;

subject to {
  
   z== f(x);
 goal== y+z;

9<=x;
x<=18;
4<=y;
y<=10;

}

execute
{
  writeln(z);
  writeln(f(x));
}

为了删除此选择,您可以做的是写入

(x==10) => (z==15);

然后

dvar float x;
dvar float y;

dvar float z;
dvar float goal;

pwlFunction f=piecewise {0->0; 10->0; 0->10; 5->10; 0->20; 5->20; 0} (1,10);

minimize goal;

subject to {
  
   z== f(x);
 goal== y+z;

9<=x;
x<=18;
4<=y;
y<=10;

(x==10) => (z==15);

}

execute
{
  writeln(z);
  writeln(f(x));
}

给予

10
10

你得到x=9

© www.soinside.com 2019 - 2024. All rights reserved.