使用 LPproblem 类添加“每隔一天约束”

问题描述

我正在尝试使用 PuLP 模块优化商店时间表,并且我已经得到了预期的结果。 但是我只有一个问题,因为我需要向它添加一个新的约束

通过下面的代码,我将能够每天分发商店 基于以下约束

  • Store_demand 的总和不应超过一天的容量(1000 或更少)
  • 每家商店将根据其天数(Store_Days)进行分发 例如:“S2”应该在三天内被释放

现在,当商店只有三天时,我需要添加一个新约束。 “每隔一天”条件以获得一天的差距

EX:"S2" 商店

  • 如果它是在周六安排的,那么其他日子将是周一和周三
  • 如果它是在星期日安排的,那么其他日子将是周二和周四
capacity =  1000
days_list=["SAT","SUN","MON","TUE","WED","THU"]
no_days_list = range(1,7)
store = ["S1","S2","S3","S4"]
Store_demand = {
        "S1":400,"S2":300,"S3":250,"S4":200,}
Store_Days = {
        "S1":6,"S2":3,"S3":3,"S4":1,}

prob = LpProblem("schedule",LpMaximize)
storeVars = LpVariable.dicts("Days",(no_days_list,Store),1,LpInteger)
   for d in no_days_list:
        prob += pulp.lpSum([Store_demand[s] * storeVars[d][s] for s in Store]) <= capacity
   for s in Store:
        prob += pulp.lpSum(storeVars[d][s] for d in no_days_list) == store_Days[s]

    prob.solve()

    for vi in prob.variables():
        if vi.varValue == 1:
         print(" On "+days_list[int(vi.name.split("_")[1])-1]+" Pharmacy code: "+vi.name.split("_")[2])

请指教。

-----------------更新----------------


rob = LpProblem("schedule",LpInteger)
   for d in no_days_list:
        prob += pulp.lpSum([Store_demand[s] * storeVars[d][s] for s in Store]) <= capacity
   for s in Store:
        prob += pulp.lpSum(storeVars[d][s] for d in no_days_list) == store_Days[s]
          if store_Days[s] == 3:
                prob += pulp.lpSum([ storeVars[d][s]  + storeVars[d][s] for d in no_days_list])  <= 1
  prob.solve()

解决方法

您可以通过为三天内开业的所有商店添加额外的限制来实现这一点。以下约束表示商店不能连续两天开业:

for s in Store:
    if Store_Days[s] == 3:
        for d in range(1,6):
            prob += storeVars[d][s] + storeVars[d+1][s] <= 1