【问题标题】:Cumulative Sum of decision variable as budget constraint (pulp)作为预算约束的决策变量的累积和(纸浆)
【发布时间】:2020-08-28 10:21:44
【问题描述】:

我的程序没有按照自己的意愿接受约束

这是我的全部代码:

    import sys
!{sys.executable} -m pip install pulp
import pulp
import pandas as pd

dates = [d.strftime('%Y-%m-%d') for d in pd.date_range("2020-01-01","2020-12-31")]


days = range(367)
preise = range(367)
capacity = 100000

#Decision variable
volumes = pulp.LpVariable.dicts("volumes", days,
                                 lowBound=-2400, 
                                 upBound=1500, 
                                 cat=pulp.LpContinuous)

#Initialize Problem
storage = pulp.LpProblem("Storage Valuation", pulp.LpMaximize)

#Objective Function
storage += pulp.lpSum([volumes[(i)] * preise[(i)] 
                       for i in days]), "objective function"

for j in days:
    storage += sum(volumes) <= capacity, "capacity constraint {}".format(j)


storage.solve()
print("Status : ", pulp.LpStatus[storage.status])
print("Result : ", pulp.value(storage.objective))
data = []
for v in storage.variables():
    data.append({'wert': v.varValue})
result = pd.DataFrame (data)


result.insert(1, "Storage level", result['wert'].cumsum(), True)
result.insert(2, "Date", dates, True)

with pd.option_context('display.max_rows', None, 'display.max_columns', None):  
    print(result)

我的决策变量的累计总和每天都不允许超过一定的容量。

对于约束,我也尝试过类似的东西:

    for j in days:
    storage += pulp.lpSum([volumes[i][j] for i in days) <= capacity, "Capacity Limit {}".format(j)

我认为 lpSum 语句有问题。 也许我的程序需要一个计数变量之类的东西。如果是这样,我该如何实现?

谢谢!

【问题讨论】:

  • 欢迎来到 SO!您能以minimal reproducible example 的形式提出您的问题吗?包括玩具示例数据和其他人需要的所有其他内容都可以点击运行,并查看您遇到的问题。您的约束在哪些方面未按预期运行?

标签: python optimization constraints linear-programming pulp


【解决方案1】:

以下更改会产生结果(尽管我不太确定这是您需要的):

#days = range(367)
#preise = range(367)
days = range(366)
preise = range(366)

改变约束(限制累计和):

#for j in days:
#    storage += sum(volumes) <= capacity, "capacity constraint {}".format(j)    
for j in days:
    storage += pulp.lpSum([volumes[(i)] for i in range(j+1)]) <= capacity

不要遍历字典,变量的顺序是不能保证的。而是:

#for v in storage.variables():
#    data.append({'wert': v.varValue})
for j in days:
    data.append({'wert': volumes[(j)].varValue}) 

【讨论】:

  • 太棒了,现在真的很棒!!!只有一个问题,为什么它必须是 range(j+1) 而不仅仅是 range(j)?真的不明白这个。
  • 这是在累积和中包含第 j 个卷,例如在第 0 天,您希望在总和中包含第 0 天(范围结束不包括在内)。
猜你喜欢
  • 2020-09-16
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
相关资源
最近更新 更多