【问题标题】:How to avoid very small values for continuous decision variables in CPLEX OPL如何避免 CPLEX OPL 中连续决策变量的值非常小
【发布时间】:2021-09-27 03:36:15
【问题描述】:

我有一些连续变量(决策变量)。运行优化时,一些变量会得到非常小的十进制数的解,例如 0.00000123 等。我不希望变量采用这样的值,但我想让它们具有 0 值。因此,我设置了如下约束。

in declaration part :  dvar float+ Xbdt[Pitblocks][DumpBlocks][TimePeriods]   

in constraints part :

forall(b in PitBlocks,d in DumpBlocks,t in TimePeriods)
          {
        //NonNegative :       
    (Xbdt[b][d][t] == 0) || (Xbdt[b][d][t] >= 100) ;
      }

但这些限制产生了数十万个二进制文件,无法解决。

我想避免 Xbdt 的任何值介于 0+ 和 100 之间,允许 0。有没有其他方法可以做到这一点。

【问题讨论】:

    标签: cplex opl


    【解决方案1】:

    如果您只想避免像您提到的那样非常小的值 (~1e-6),您可以忽略它们并将它们四舍五入为零。如果您真的想要可以为零或> = 100的变量,那么您正在谈论“半连续”变量。参见例如: https://www.ibm.com/support/pages/modeling-semi-continuous-variables-opl

    请注意,CPLEX 本身支持这些类型的变量,但我认为 OPL 中没有对这些变量的任何直接支持。如果您通过其他 API 之一(例如 C#、Java)工作,那么您可以直接使用它们,例如,如果您通过 OPL 接口之一使用 OPL,或者通过 Concert API 甚至 C 库接口直接使用 CPLEX .

    【讨论】:

    • 感谢您的回复蒂姆,半连续变量将二进制变量的数量增加了很多倍。圆形可能是一种选择。我以前从未使用过 Round ...不太确定在这种情况下如何使用它 - 无论是在约束中(有几个约束)还是您在编写结果时的意思?我需要在约束中使用它,因为 Xbdt 的值会影响其他决策变量以及它是 0 还是 > 0 的整体解决方案。如果可以请进一步澄清 round 选项。
    • 同意使用半连续变量可能会添加许多二进制变量,但如果您确实需要使用它们,这可能是不可避免的。就四舍五入而言,我的意思是对输出值进行四舍五入。我不知道有什么方法可以直接在不引入额外二进制或整数变量的 CPLEX 约束和变量中进行舍入。另一种方法是像您已经完成的那样进行求解,然后在解中查找接近于零的变量,然后使用强制这些接近于零的变量真正为零的附加约束来重新求解问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多