跳转到主要内容

有条件的约束

回答

评论

5个评论

  • 丹Steffy
    Gurobi员工Gurobi员工

    你好,阿布,

    它看起来像python max函数将帮助你代表这个以更直接的方式。我假设\ \ texttt {harvestleadtime} \)和\ (\ texttt {purchaseleadtime} \)代表问题数据,不变量。你的逻辑分配一个最大的0和\ (\ texttt {t-harvestleadtime [j]} \),所以另一个构建和使用一个是使用以下,在的地方吗一个,当创建你的约束:

    马克斯(0,t-harvestleadtime [j])

    同样,在建设和使用的地方b在你的限制,您可以使用:

    马克斯(0,t-purchaseleadtime [j])

    最后一部分的逻辑替换\ (\ texttt {InventoryQty [j, t - 1]} \)零约束当t = 1,也许是因为t - 1的范围,在这种情况下。之间的一个替代办法是包括0期和集\ (\ texttt {InventoryQty [j, 0]} \)等于零(或其他库存数量有意义)开始对所有j值。当构建这些库存平衡约束,你可以建造周期t = 1,后来。

    最后,您可能想要仔细检查你的逻辑约束。就好像为代表的数量一个b大量的时间,直接把他们等同于决策变量和约束代表库存数量,所以单位似乎并不匹配。我希望这可以帮助。

    0
  • 所罗门的阿布
    Gurobi-versary
    好奇的
    健谈的人

    你好,丹,

    首先,谢谢你的详细的回复。

    我想我的定义一个b不正确,正确的片段:

    j的产生:
    t时间:
    如果t-harvestleadtime [j] > 0:
    一个= ProductionQty [j, t-harvestleadtime [j]]
    其他:
    一个= 0
    如果t-purchaseleadtime [j] > 0:
    b = PurchaseQty [j, t-purchaseleadtime [j]]
    其他:
    b = 0
    如果t > 1:
    c = InventoryQty [j, t - 1)
    其他:
    c = 0
    m.addConstr (一个+ b + (1-fractionlost[j])*c == ShippingQty[j,t] + InventoryQty[j,t], 'InvBalanceConstraint')

    所以我认为,MAX函数可能不会在这里工作。t和harvestleadtime都是整数,所以比较应该工作。

    例如,如果t > harvestleadtime,我想使用ProductionQty [j, t-harvestleadtime [j]]。否则,我想使用0,因此变量。这似乎可以像我这样的新手,而是告诉我,有一个更高效的方法。

    0
  • 丹Steffy
    Gurobi员工Gurobi员工

    你好,阿布,

    好的,谢谢你发送更新。避免定义的一种方法一个,b,c将左手边逐项,如下。

    j的产生:
    t时间:
    lh = 0
    如果t-harvestleadtime [j] > 0:
    lh + = ProductionQty [j, t-harvestleadtime [j]]
    如果t-purchaseleadtime [j] > 0:
    lh + = PurchaseQty [j, t-purchaseleadtime [j]]
    如果t > 1:
    lh + = (1-fractionlost [j]) * InventoryQty [j, t - 1]
    m.addConstr (lhs == ShippingQty[j,t] + InventoryQty[j,t], 'InvBalanceConstraint')

    经常有许多方法来建立模型。如果你有兴趣看到更多的例子如何构造模型我鼓励你去浏览一些Python示例。

    0
  • 所罗门的阿布
    Gurobi-versary
    好奇的
    健谈的人

    谢谢丹。我注意到你的建议也有3个if语句。只是出于好奇,这将是更有效的比我是怎样做到的呢?或者只是为了避免创建新的变量?

    0
  • 丹Steffy
    Gurobi员工Gurobi员工

    你好,阿布,

    我建议只是为了避免每次创建三个新的变量。它简化了代码/缩短一点,但我怀疑它会快得多。基于您的模型,似乎需要一些条件逻辑来确定哪些方面应该补充说,由于交货期可以有所不同。

    还有其他的方法可以缩短我的代码可以描述波纹管,但我不认为他们会让任何整体性能上的巨大差异。时间去建立一个模型通常是小相比时间才能解决。

    你可以做的一件事就是把addConstr方法的内部条件逻辑,它看起来像这样:

    j的产生:
    t时间:
    m.addConstr (
    (0如果t-harvestleadtime [j] < = 0其他ProductionQty [j, t-harvestleadtime [j]]) +
    (0如果t-purchaseleadtime [j] < = 0其他PurchaseQty [j, t-purchaseleadtime [j]]) +
    (0如果其他t < = 1 (1-fractionlost [j]) * InventoryQty [j, t - 1])
    = = ShippingQty [j, t] + InventoryQty [j, t])

    因为上述的所有逻辑调用addConstr内,你甚至可以调用addConstrs方法,如下:

    m.addConstrs (
    (0如果t-harvestleadtime [j] < = 0其他ProductionQty [j, t-harvestleadtime [j]]) +
    (0如果t-purchaseleadtime [j] < = 0其他PurchaseQty [j, t-purchaseleadtime [j]]) +
    (0如果其他t < = 1 (1-fractionlost [j]) * InventoryQty [j, t - 1])
    = = ShippingQty [j, t] + InventoryQty j [j, t]在生产t段)

    但是正如上面提到的,我不认为这些方案将使事情更快。

    0

登录留下你的评论。