You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CPLEX分段阶梯函数示例结果与预期不符,请求解答

问题原因分析与修正

你的核心问题是**piecewise函数的定义完全不符合CPLEX的语法规则**,导致z的实际取值和你的预期完全相反,最终求解结果偏离预期。

具体错误点

  1. 断点顺序与重复定义混乱
    CPLEX要求piecewise函数的断点必须按自变量x的递增顺序排列,且每个x值只能对应一个函数值。你写的{0->0; 10->0; 0->10; 5->10; 0->20; 5->20; 0}是重复、无序的x映射,CPLEX会自动去重并按x升序排序,最终解析出的分段逻辑和你预期的完全不同。

  2. 分段类型参数错误
    你使用了(1,10)作为分段类型参数,这表示分段线性函数,且当x超出断点范围时,会以斜率10进行线性延伸。但你想要的是分段常数函数,应该使用(2, 0)(第二个参数0表示x超出最后一个断点时,延续最后一个分段的常数值)。

  3. 映射值与预期颠倒
    你预期x∈[0,10)时z=10,但错误的定义导致CPLEX解析出的z函数在x=9时取值远大于10,而x=10时z的取值大幅降低,因此求解器会选择x=10来最小化目标值y+z。

修正后的代码

假设你想要的分段逻辑是:

  • x ∈ [0, 10) → z=10
  • x ∈ [10, 20) → z=5
  • x ≥ 20 → z=0

修正后的代码如下:

dvar float x;
dvar float y;

// 正确的分段常数函数定义
dexpr float z = piecewise {0->10; 10->5; 20->0} (2, 0) x;
dexpr float goal = y + z;

minimize goal;

subject to {
    9 <= x <= 18;
    4 <= y <= 10;
}

运行修正后的代码,求解器会得到你预期的结果:x=9、y=4,目标值为14。

内容的提问来源于stack exchange,提问作者이상환

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:43:13