决策变量的累积和作为预算约束(纸浆)
Cumulative Sum of decision variable as budget constraint (pulp)
我的程序没有按要求接受我的约束。
这是我的全部代码:
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 语句有问题。
也许我的程序需要类似计数变量的东西。如果是这样,我该如何实施?
谢谢!
以下更改给出了结果(虽然我不太确定这是你需要的):
#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})
我的程序没有按要求接受我的约束。
这是我的全部代码:
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 语句有问题。 也许我的程序需要类似计数变量的东西。如果是这样,我该如何实施?
谢谢!
以下更改给出了结果(虽然我不太确定这是你需要的):
#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})