【问题标题】:how I can seperate negative and positive variables?如何区分负变量和正变量?
【发布时间】:2019-05-08 23:03:56
【问题描述】:

让我有一个变量 UT[i,j,k,r],其定义为 2 个其他变量的总和。

UT[i,j,k,r]= U[i,j,k,r]+D[i,j,k,r]

现在我想为正的 UT[i,j,k,r] 编写一些约束!我能做什么?

我尝试了很多方法:我定义了一个二进制变量,如果 UT 为正则为 1,否则为 0,但这并没有解决我的问题,因为将它们相乘很复杂。有什么方法可以存储 UT 为正的索引吗?

【问题讨论】:

  • 有一些关于如何根据另一个决策变量here激活/停用约束的讨论; 4er 关于如何在 AMPL 中轻松做到这一点的评论可能特别有帮助。
  • 我在 AMPL 用户论坛上回答了这个问题,所以我将在此处以适合 ​​Stack Exchange 的形式发布。

标签: optimization linear-programming ampl glpk


【解决方案1】:

假设BT[i,j,k,r] 是您的二进制变量。然后,如果您使用 CPLEX、Gurobi 或 Xpress 作为求解器,您可以像这样编写“指标约束”:

BT[i,j,k,r] = 1 ==> *your constraint*

这是最简单的方法。或者,对于任何求解器,如果您的约束是线性的,则可以将指标约束转换为等效的线性约束,而无需将二进制变量乘以任何其他变量。 (如果您的约束是非线性的,那么也可能存在转换。)要了解此类转换是如何完成的,请参阅@LarrySnyder610 对if condition in ampl 的回答。

【讨论】:

    【解决方案2】:

    一种选择是将UT分成两部分:UTplus和UTminus,两者均>= 0。然后定义UT = UTplus - UTminus。

    现在您需要添加一个约束,表示两者中最多有一个可以为非零。有几种选择:

    1. 您可以按照您的建议和 4er 解释的方式使用指标约束。使用二进制辅助变量来指示如果该变量为 1,则 UTminus 必须为零,如果辅助变量为 0,则 UTplus 必须为零。如果您可以推导出 UTplus 和 UTminus 的上限 M,那么您也可以添加约束 UTplus <= M*binaryUTminus <= M*(1 - binary)。如果 M 不太大,这可能会带来更好的性能。
    2. 您可以使用包含 UTplus 和 UTminus 的 SOS 约束(变量中的每个索引都需要一个 SOS)。这也强制两者中的最多一个可以是非零的,但不会引入任何新变量。这是否比指标或大 M 更有效还有待测试。
    3. 如果 UTplus 和 UTminus 在目标函数中都具有正系数(用于最小化),那么在任何最优解中,两者中的一个都有可能自动为零。这取决于变量 UT 在您的模型中究竟代表什么。看看你的模型,看看你是否可以证明这个属性。那么你就不需要任何额外的约束或变量了。

    【讨论】:

      猜你喜欢
      • 2017-02-07
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      相关资源
      最近更新 更多