问题描述
我正在尝试使用 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