有条件的约束
回答你好,
我相当新的代码/ Gurobi -我想写下面的约束,和我看起来不优。有下面的写作方式不用一个,b和c吗?
j的产生:
t时间:
如果t-harvestleadtime [j] > 0:
一个= t-harvestleadtime [j]
其他:
一个= 0
如果t-purchaseleadtime [j] > 0:
b = 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')
提前谢谢!
-
你好,阿布,
它看起来像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 -
你好,丹,
首先,谢谢你的详细的回复。
我想我的定义一个和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 -
你好,阿布,
好的,谢谢你发送更新。避免定义的一种方法一个,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 -
谢谢丹。我注意到你的建议也有3个if语句。只是出于好奇,这将是更有效的比我是怎样做到的呢?或者只是为了避免创建新的变量?
0 -
你好,阿布,
我建议只是为了避免每次创建三个新的变量。它简化了代码/缩短一点,但我怀疑它会快得多。基于您的模型,似乎需要一些条件逻辑来确定哪些方面应该补充说,由于交货期可以有所不同。
还有其他的方法可以缩短我的代码可以描述波纹管,但我不认为他们会让任何整体性能上的巨大差异。时间去建立一个模型通常是小相比时间才能解决。
你可以做的一件事就是把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
请登录留下你的评论。
评论
5个评论