[英]How do I add constraint to pyomo with a range inequality
我正在研究一個約束優化問題,我正在使用 pyomo 和 abc 求解器,我正在嘗試添加一個具有范圍的約束。
到目前為止我寫的代碼是
# Initialize model
model = ConcreteModel()
# binary variables representing if a worker is scheduled somewhere
model.works = Var(((worker, day, shift) for worker in workers for day in date for shift in days_shifts[day]),
within=Binary, initialize=0)
# binary variables representing if a worker is necessary
model.needed = Var(workers, within=Binary, initialize=0)
def obj_rule(m):
c = len(workers)
return sum(m.needed[worker] for worker in workers)
model.obj = Objective(rule=obj_rule, sense=minimize)
# Create a set of constraints
model.constraints = ConstraintList()
for day in date:
for shift in days_shifts[day]:
model.constraints.add(33 == sum(model.works[worker, day, shift] for worker in workers))
# Constraint: no more than 52 hours worked
for worker in workers:
model.constraints.add(
52 >= sum(12 * model.works[worker, day, shift] for day in date for shift in days_shifts[day]))
我試圖補充的限制條件是,最少輪班時間應為 8 小時,而最長輪班時間應為 12 小時。 一周的總工作時間不應超過 52 小時。 我正在關注以下文章以優化班次分配。
最后一個約束確保 12 小時輪班,我不確定如何為 8 小時輪班添加約束。
我對 pyomo 和優化問題很陌生。
移位的長度是給定的,即模型參數還是您希望模型決定的,即決策變量?
根據情況,您需要分別定義一個參數或一個變量,按 [day, shift] 進行索引以表示這一點。 例如,如果我們稱此為shift_len[day, shift]
,那么您的約束將變為:
for worker in workers:
model.constraints.add(
52 >= sum(shift_len[day, shift] * model.works[worker, day, shift] for day in date for shift in days_shifts[day]))
請注意,如果它是一個決策變量,那么由於兩個變量的乘積,您的模型將變為非線性(不過,仍有一些方法可以使乘積線性化)。 如果它是一個參數,那么您的模型將保持線性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.