簡體   English   中英

如何使用范圍不等式向 pyomo 添加約束

[英]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 小時。 我正在關注以下文章以優化班次分配。

https://towardsdatascience.com/modeling-and-optimization-of-a-weekly-workforce-with-python-and-pyomo-29484ba065bb

最后一個約束確保 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM