Cplex +Python下的虚拟电厂智能调度实例(附代码)

本文参考阿里_MindOpt_求解器_优化_决策智能智能调度案例,该案例使用阿里MindOPT进行求解,本文使用Cplex求解器进行求解。


本文为单用户场景,多用户场景见(多用户)Cplex +Python下的虚拟电厂智能调度实例(附代码)_椰吉酒的博客-CSDN博客


一、问题描述

虚拟电厂场景下,光储荷经济性调度。针对单个用户、单个光伏和单个储能设备的虚拟电厂场景,在满足用户用电需求的情况下,短周期(4个小时)的经济最优目标。

二、数学模型

变量

充电变量: X=\left ( x_{t} \right )\in \left [ 0,\alpha \right ]

放电变量:Y=\left ( y_{t} \right )\in \left [ -\alpha ,0 \right ]

储能设备能量状态:S=\left ( s_{t} \right )\in \left [ 0,1 \right ]

以上三个变量为continuous_var_list连续变量列表

参数

负荷: load

功率:power

电价:price

充电效率:charge_efficiency

放电效率:discharge_efficiency

储能单次充放电限制:nominal_power

目标函数

最小化经济性最优目标:

minimize\: \; Cost=\sum_{t=1}^{T}\left ( load\left ( t \right )-power\left ( t \right ) +x\left ( t \right )+y\left ( t \right )\right )\times price\left ( t \right )\div costbase

其中costbase为不使用储能的情况下的花费:

costbase = \sum_{t=1}^{T}\left ( load\left ( t \right )-power\left ( t \right ) \right )\times price\left ( t \right )

约束条件

储能能量状态:

储能初始状态为0:s_{0}=0

储能状态更新:s_{t}=s_{t-1}+c_{1}\cdot x_{t}+\frac{y_{t}}{c_{2}}

三、Python代码

from docplex.mp.model import Model
import random

# 设置随机种子,保证运行结果一致
random.seed(0)
# 4个时间段
time = 4
# 5个状态
time1 = 5

# 用户负荷
load = [round(random.uniform(0, 1), 2) for _ in range(time)]
# 用户功率
power = [round(random.uniform(0, 1), 2) for _ in range(time)]
# 每个时间段的电价
price = [0.54, 0.22, 0.32, 0.24]

# 充放电效率
charge_efficiency = 0.91
discharge_efficiency = 0.95
# 储能单次充放电限制
nominal_power = 0.8

model = Model(name="abc")
# 创建连续变量列表,充电变量x,放电变量y,储能设备能量状态soc
x = model.continuous_var_list(time, lb=0, ub=nominal_power, name="x")
y = model.continuous_var_list(time, lb=-nominal_power, ub=0, name="y")
soc = model.continuous_var_list(time1, lb=0, ub=1, name="soc")
# 不使用储能情况下的花费
cost_base = sum(((load[t] - power[t]) * price[t]) for t in range(time))
# 总花费
total_cost = model.sum(((load[t] - power[t] + x[t] + y[t]) * price[t] / cost_base) for t in range(time))
# 求解最小值
model.minimize(total_cost)

# 初始状态约束
model.add_constraint(soc[0] == 0)

# 电池状态更新约束
for t in range(time):
    model.add_constraint(soc[t + 1] == soc[t] + x[t] * charge_efficiency + y[t] / discharge_efficiency)

model.solve()

print("-----------------Display---------------")
print("Charging(+) / Discharging (-) Solution:")
for t in range(time):
    print('Time{}:Solution:'.format(t),x[t].solution_value+y[t].solution_value)

for t in range(time1):
    print('Time{}:State-of-Charge {}'.format(t,soc[t].solution_value))

print("-----------------Evaluation Metrics---------------")
print("Cost={}".format(total_cost.solution_value))

四、求解结果

结果:

时段1:不进行储能操作

时段2:充电80%

时段3:放电69.1%

时段4:不进行储能操作

最终目标Cost为0.65,即使用最优储能调度方案电费为不使用储能电费的65%,节省35%电费。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
连锁店货物派送问题是一个经典的车辆路径问题。假设有 N 个连锁店需要配送货物,其中第 i 个连锁店需要配送的货物量为 d[i],每个配送员工作时间为 T,每辆车的容量为 C。现在有 M 辆车可用,每辆车的行驶距离不能超过 L。问如何安排配送方案,使得配送员的工作时间得到充分利用,同时保证所有的货物能够得到配送,并且最小化配送的总成本。 其中,总成本包括每辆车行驶的距离以及配送员的工资等费用。 下面是一个Cplex+VRP的代码示例: ```python from docplex.mp.model import Model import math # 定义距离函数,计算连锁店之间的距离 def distance(x1, y1, x2, y2): return math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2) # 连锁店货物派送问题 def chain_stores_delivery(num_stores, num_vehicles, capacity, max_distance, work_time, demands, x, y): mdl = Model('Chain Stores Delivery') # 定义变量 x_vars = mdl.binary_var_matrix(num_stores, num_vehicles, 'x') u_vars = mdl.continuous_var_list(num_stores, lb=0.0, name='u') # 定义目标函数 cost = mdl.sum(distance(x[i], y[i], x[j], y[j]) * x_vars[i, k, j] for i in range(num_stores) for j in range(num_stores) for k in range(num_vehicles)) mdl.minimize(cost) # 定义约束条件 # 每个连锁店只能被一个车辆服务 for i in range(num_stores): mdl.add_constraint(mdl.sum(x_vars[i, k, j] for k in range(num_vehicles) for j in range(num_stores)) == 1) # 每个车辆的容量不能超过限制 for k in range(num_vehicles): mdl.add_constraint(mdl.sum(demands[i] * x_vars[i, k, j] for i in range(num_stores) for j in range(num_stores)) <= capacity) # 每个车辆的行驶距离不能超过限制 for k in range(num_vehicles): mdl.add_constraint(mdl.sum(distance(x[i], y[i], x[j], y[j]) * x_vars[i, k, j] for i in range(num_stores) for j in range(num_stores)) <= max_distance) # 每个连锁店的需求必须得到满足 for i in range(num_stores): for k in range(num_vehicles): mdl.add_constraint(demands[i] * x_vars[i, k, j] <= u_vars[j]) # 每个配送员的工作时间不能超过限制 for k in range(num_vehicles): mdl.add_constraint(mdl.sum(distance(x[i], y[i], x[j], y[j]) * x_vars[i, k, j] for i in range(num_stores) for j in range(num_stores)) <= work_time) # 求解模型 mdl.solve() # 输出结果 if mdl.solution is not None: print('Total cost: ', mdl.solution.objective_value) for k in range(num_vehicles): print('Vehicle ', k + 1) print('Route: ', end='') for i in range(num_stores): for j in range(num_stores): if x_vars[i, k, j].solution_value > 0.9: print(i + 1, '->', j + 1, '->', end='') print('') else: print('No solution found') # 测试数据 num_stores = 4 num_vehicles = 2 capacity = 15 max_distance = 50 work_time = 8 demands = [10, 5, 8, 7] x = [0, 10, 20, 30] y = [0, 20, 10, 30] # 求解问题 chain_stores_delivery(num_stores, num_vehicles, capacity, max_distance, work_time, demands, x, y) ``` 以上代码是一个简单的示例,您可以根据实际情况进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值