【发布时间】:2022-02-11 00:47:22
【问题描述】:
我正在尝试使用线性规划确定连接到电网的电池可以获得的最大收入。电池可以在两个市场赚取收入,能源市场和频率市场。当我在目标函数中包含二元约束时,我的模型抛出错误(TypeError: 非常量表达式不能相乘)。
我的目标函数是:
- N 是优化的时间范围
- 是时间 t 的能源价格
- 是时间t分配的放电和充电功率
- 是时间t的频率价格
- 是时间t分配的频率功率
在每个时间段 t,电池应仅在一个市场(能量或频率)中有效。所以需要一个看起来像这样的约束:
其中 是激活活动x 的二进制变量。
好的,这就是我想要实现的目标。我正在努力在纸浆中创建这样的限制,如果另一个市场的价值更高(满足所有其他限制),则基本上会关闭对其中一个市场的参与。在我的电池类中,我为每个电源活动以及它们的开/关状态创建了决策变量。
self.charge = \
pulp.LpVariable.dicts(
"charging_power",
('c_t_' + str(i) for i in range(0,time_horizon)),
lowBound=0, upBound=max_charge_power_capacity,
cat='Continuous')
self.discharge = \
pulp.LpVariable.dicts(
"discharging_power",
('d_t_' + str(i) for i in range(0,time_horizon)),
lowBound=0, upBound=max_discharge_power_capacity,
cat='Continuous')
self.freq = \
pulp.LpVariable.dicts(
"freq_power",
('f_t_' + str(i) for i in range(0,time_horizon)),
lowBound=0, upBound=max_freq_power_capacity,
cat='Continuous')
self.charge_status = \
pulp.LpVariable.dicts(
"charge_status",
('c_status_t_' + str(i) for i in range(0,time_horizon)),
cat='Binary')
self.discharge_status = \
pulp.LpVariable.dicts(
"discharge_status",
('d_status_t_' + str(i) for i in range(0,time_horizon)),
cat='Binary')
self.freq_status = \
pulp.LpVariable.dicts(
"freq_status",
('ds3_status_t_' + str(i) for i in range(0,time_horizon)),
cat='Binary')
在我的目标函数中,我包含了这些二进制变量。
self.model = pulp.LpProblem("Max Profit", pulp.LpMaximize)
self.model +=\
pulp.lpSum(
[self.charge['c_t_' + str(i)]*-1*prices[i] *
self.charge_status['c_status_t_' + str(i)] for i in range(0,self.time_horizon)]
+ [self.discharge['d_t_' + str(i)]*prices[i] *
self.discharge_status['d_status_t_' + str(i)] for i in range(0,self.time_horizon)]
+ [self.freq['f_t_' + str(i)]*freq_prices[i] *
self.freq_status['freq_status_t_' + str(i)] for i in range(0,self.time_horizon)]
)
对于这些二元变量的约束,我设置如下:
for hour_of_sim in range(1,self.time_horizon+1):
self.model += \
pulp.lpSum([self.charge_status['c_status_t_' + str(i)] for i in range(0,self.time_horizon)] +\
[self.discharge_status['d_status_t_' + str(i)] for i in range(0,self.time_horizon)] +\
[self.freq_status['freq_status_t_' + str(i)] for i in range(0,self.time_horizon)]
) <= 1
当我尝试解决时,我得到一个
TypeError: 非常数表达式不能相乘
关于目标函数。不喜欢我的二进制变量,如果它们被删除就会运行。一定有另一种设置方法让我无法理解?
【问题讨论】:
-
一般情况下不能乘以变量。您需要在模型时对其进行线性化。谷歌对一些连续变量和一些二进制变量的乘积进行线性化。
标签: python optimization linear-programming pulp