基于DDPG算法的发电公司竞价策略代码逐逐段解读说明

张开发
2026/4/5 20:06:57 15 分钟阅读

分享文章

基于DDPG算法的发电公司竞价策略代码逐逐段解读说明
python代码基于DDPG深度确定性梯度策略算法的售电公司竞价策略研究 关键词DDPG 算法 深度强化学习 电力市场 发电商 竞价 说明文档完美复现英文文档可找我看文档 主要内容 代码主要研究的是多个售电公司的竞标以及报价策略属于电力市场范畴目前常用博弈论方法寻求电力市场均衡但是此类方法局限于信息完备的简单市场环境难以直观地反映竞争性的市场环境因此本代码通过深度确定性梯度策略算法DDPG对发电公司的售价进行建模解决了传统的RL算法局限于低维离散状态空间和行为空间收敛性不稳的问题实验表明该方法比传统的RL算法具有更高的精度即使在不完全信息环境下也能收敛到完全信息的纳什均衡。 此外该方法通过定量调整发电商的耐心参数可以直观地反映不同的默契合谋程度是分析市场策略的有效手段。 目前深度强化学习非常火热很容易出成果非常适合在本代码的基础上稍微加点东西即可形成自己的成果非常适合深度强化学习方向的人学习 这段代码包含了三个程序我们分别来进行详细分析。 程序一 python import numpy as np from market.three_bus import market_clearing from algorithm.VRE import RothErevAgents import matplotlib.pyplot as plt n_agents 2 action_space np.arange(0, 3.1, 0.2) n_steps 10000 a_real np.array([15.0, 18.0]) strategic_variables np.zeros((n_steps, n_agents)) multi_agents RothErevAgents(n_agents, action_space) for step in range(n_steps): action multi_agents.select_action() alpha action * a_real nodal_price, profit market_clearing(alpha) strategic_variables[step] alpha multi_agents.learn(profit) if (step 1) % 1000 0: print(Step:, step 1, a1: %.2f % alpha[0], a2: %.2f % alpha[1], r1: %.3f % profit[0], r2: %.3f % profit[1]) C np.array([[0.36, 0.58, 0.75], [0.92, 0.28, 0.29]]) plt.plot(strategic_variables[:, 0], lw0.5, CC[0], alpha0.5, labelr$\alpha_{1t}$) plt.plot(strategic_variables[:, 1], lw0.5, CC[1], alpha0.5, labelr$\alpha_{2t}$) plt.plot([0, 10000], [20.29, 20.29], --, CC[0], labelr$\alpha_{1t}^\ast$) plt.plot([0, 10000], [22.98, 22.98], --, CC[1], labelr$\alpha_{2t}^\ast$) plt.xlabel(r$t$) plt.ylabel(r$\alpha_{gt}$ (\$/MHh)) plt.title(VRE (3-Bus System)) plt.legend() plt.savefig(VRE.png, dpi600) plt.show() 这段代码主要是使用了RothErevAgents算法来进行市场交易的仿真。程序首先导入了一些必要的库然后定义了一些变量包括代理数量n_agents、动作空间action_space、仿真步数n_steps和真实的动作值a_real。接下来创建了一个RothErevAgents对象multi_agents该对象使用Roth-Erev算法来选择动作。 在每个步骤中程序通过调用multi_agents.select_action()来选择动作。然后根据选择的动作和真实的动作值计算alpha值。接着使用market_clearing函数计算节点价格和利润。将alpha值存储在strategic_variables数组中并使用multi_agents.learn()函数来更新代理的策略。 在每1000个步骤后程序会打印出当前步骤数、alpha值和利润。最后程序使用matplotlib库绘制了两个alpha值随时间变化的图形并保存为图片。 程序二和程序三的结构与程序一类似只是使用了不同的算法QLearning和DDPG和模型ANet2和CNet2。它们的功能和工作方式与程序一类似只是算法和模型的不同。一、核心算法模块DDPG.py1.1 DDPG类初始化class DDPG(object): def __init__(self, a_dim, s_dim, a_bound,): self.a_dim, self.s_dim, self.a_bound a_dim, s_dim, a_bound[1] self.memory np.zeros((MEMORY_CAPACITY, s_dim * 2 a_dim 1), dtypenp.float32) self.pointer 0 self.sess tf.Session() self.actor_eval self._build_actor_net(actor_eval, trainableTrue) self.actor_target self._build_actor_net(actor_target, trainableFalse) self.critic_eval self._build_critic_net(critic_eval, trainableTrue) self.critic_target self._build_critic_net(critic_target, trainableFalse)该部分初始化DDPG算法的核心组件定义动作维度adim、状态维度sdim和动作边界a_bound创建经验回放缓冲区memory用于存储智能体与环境的交互数据构建Actor-Critic架构的四个神经网络评估网络actoreval、criticeval和目标网络actortarget、critictarget评估网络用于实时决策和参数更新目标网络用于计算目标Q值提高训练稳定性1.2 神经网络构建def _build_actor_net(self, name, trainable): with tf.variable_scope(name): s tf.placeholder(tf.float32, [None, self.s_dim], s) x tf.layers.dense(s, 30, activationtf.nn.relu, namel1, trainabletrainable) a tf.layers.dense(x, self.a_dim, activationtf.nn.tanh, namea, trainabletrainable) return tf.multiply(a, self.a_bound, namescaled_a), s def _build_critic_net(self, name, trainable): with tf.variable_scope(name): s tf.placeholder(tf.float32, [None, self.s_dim], s) a tf.placeholder(tf.float32, [None, self.a_dim], a) w1_s tf.get_variable(w1_s, [self.s_dim, 30], trainabletrainable) w1_a tf.get_variable(w1_a, [self.a_dim, 30], trainabletrainable) b1 tf.get_variable(b1, [1, 30], trainabletrainable) x tf.nn.relu(tf.matmul(s, w1_s) tf.matmul(a, w1_a) b1) q tf.layers.dense(x, 1, trainabletrainable) return q, s, aActor网络输入状态s通过全连接层30个神经元和ReLU激活函数输出经过tanh激活并缩放的动作值Critic网络联合输入状态s和动作a通过全连接层计算Q值评估当前动作的价值采用分开的权重参数确保网络独立性支持不同的训练策略1.3 动作选择与经验存储def choose_action(self, s): return self.sess.run(self.actor_eval[0], {self.actor_eval[1]: s[np.newaxis, :]})[0] def store_transition(self, s, a, r, s_): transition np.hstack((s, a, [r], s_)) index self.pointer % MEMORY_CAPACITY self.memory[index, :] transition self.pointer 1choose_action根据当前状态s通过Actor评估网络生成动作storetransition将状态(s)、动作(a)、奖励(r)和下一状态(s)存储到经验回放缓冲区采用循环缓冲区机制当存储满时自动覆盖最早的经验数据1.4 学习过程def learn(self): self.sess.run(self.soft_replace) indices np.random.choice(MEMORY_CAPACITY, sizeBATCH_SIZE) bt self.memory[indices, :] bs bt[:, :self.s_dim] ba bt[:, self.s_dim:self.s_dimself.a_dim] br bt[:, -self.s_dim-1:-self.s_dim] bs_ bt[:, -self.s_dim:] a_ self.sess.run(self.actor_target[0], {self.actor_target[1]: bs_}) q_ self.sess.run(self.critic_target[0], {self.critic_target[1]: bs_, self.critic_target[2]: a_}) q_target br GAMMA * q_ self.sess.run(self.critic_train, {self.critic_eval[1]: bs, self.critic_eval[2]: ba, self.critic_eval[3]: q_target}) a_loss -self.sess.run(self.critic_eval[0], {self.critic_eval[1]: bs, self.critic_eval[2]: self.sess.run(self.actor_eval[0], {self.actor_eval[1]: bs})}) self.sess.run(self.actor_train, {self.actor_eval[1]: bs})学习过程实现软更新目标网络参数通过预定义的soft_replace操作从经验缓冲区随机采样批量数据BATCH_SIZE分离状态、动作、奖励和下一状态数据计算目标Q值基于下一状态的目标动作和目标Q值结合奖励和折扣因子训练Critic网络最小化预测Q值与目标Q值的均方误差训练Actor网络通过策略梯度上升最大化Critic评估的Q值二、电力系统模型three_bus.py2.1 市场出清函数def market_clearing(alpha1, alpha2): # 发电公司成本参数 a1 15.0; a2 18.0 beta1 0.05; beta2 0.06 pmax1 100; pmax2 100 pmin1 0; pmin2 0 # 负荷参数 D1 80; D2 70 fd1 0.03; fd2 0.04 # 线路参数 Fmax 25 # 线路1-2传输容量限制 # 构建二次规划问题 P matrix([[2*beta1, 0., 0., 0.], [0., 2*beta2, 0., 0.], [0., 0., 2*fd1, 0.], [0., 0., 0., 2*fd2]]) q matrix([-alpha1, -alpha2, D1/fd1, D2/fd2]) # 约束条件 G matrix([[1., 0., -1., 0.], [-1., 0., 1., 0.], [0., 1., 0., -1.], [0., -1., 0., 1.], [1., 1., -1., -1.], [-1., -1., 1., 1.]]) h matrix([Fmax, Fmax, Fmax, Fmax, 0., 0.]) # 变量上下限 A matrix([[1., 0., 0., 0.], [0., 1., 0., 0.]]) b matrix([pmax1, pmax2]) Aeq matrix([[0., 0., 1., 0.], [0., 0., 0., 1.]]) beq matrix([0., 0.]) # 求解 sol solvers.qp(P, q, G, h, A, b) result sol[x] # 计算节点电价和利润 lambda1 alpha1 - 2*beta1*result[0] 2*fd1*result[2] lambda2 alpha2 - 2*beta2*result[1] 2*fd2*result[3] profit1 (lambda1 - (a1 beta1*result[0])) * result[0] profit2 (lambda2 - (a2 beta2*result[1])) * result[1] return lambda1, lambda2, profit1, profit2该函数实现3节点电力系统的市场出清过程定义发电公司参数成本系数a1,a2,beta1,beta2、出力上下限pmax,pmin定义负荷参数基础需求D1,D2、需求弹性系数fd1,fd2设置线路传输容量限制Fmax25MW构建二次规划模型目标函数为社会福利最大化添加功率平衡、线路潮流、出力限制等约束条件使用cvxopt求解器求解优化问题计算节点电价和各发电公司利润返回节点电价和利润作为环境反馈三、主运行程序run_DDPG_3-bus.py3.1 初始化设置import numpy as np import matplotlib.pyplot as plt from DDPG import DDPG from three_bus import market_clearing # 参数设置 MAX_EPISODES 10000 MAX_EP_STEPS 1 a_dim 1 s_dim 2 a_bound [-1, 1] # 初始化DDPG智能体 agent1 DDPG(a_dim, s_dim, a_bound) agent2 DDPG(a_dim, s_dim, a_bound) # 存储结果 alpha1_history [] alpha2_history [] profit1_history [] profit2_history []主程序初始化设置训练参数最大 episode 数10000、每个 episode 的步数1定义动作维度1和状态维度2对应两个节点电价创建两个DDPG智能体分别代表两家发电公司初始化历史记录列表存储竞价参数和利润变化3.2 训练过程for i in range(MAX_EPISODES): # 初始状态节点电价 s np.array([20.0, 25.0]) # 初始节点电价 # 探索噪声 var max(0.02, 1 - i/MAX_EPISODES) # 选择动作 a1 agent1.choose_action(s) a2 agent2.choose_action(s) a1 np.clip(np.random.normal(a1, var), -1, 1) a2 np.clip(np.random.normal(a2, var), -1, 1) # 动作映射到实际竞价参数 alpha1 (a1 1) * 15 * 1.5 # 映射到0-45范围 alpha2 (a2 1) * 18 * 1.5 # 映射到0-54范围 # 市场出清 lambda1, lambda2, profit1, profit2 market_clearing(alpha1, alpha2) s_ np.array([lambda1, lambda2]) # 奖励 r1 profit1 / 1000.0 r2 profit2 / 1000.0 # 存储经验 agent1.store_transition(s, a1, r1, s_) agent2.store_transition(s, a2, r2, s_) # 学习 if i MEMORY_CAPACITY: agent1.learn() agent2.learn() # 记录历史 alpha1_history.append(alpha1) alpha2_history.append(alpha2) profit1_history.append(profit1) profit2_history.append(profit2) # 打印信息 if i % 1000 0: print(Episode:, i, alpha1:, alpha1, alpha2:, alpha2, profit1:, profit1, profit2:, profit2, var:, var)训练循环实现初始化状态为初始节点电价动态调整探索噪声随训练进程衰减智能体选择动作并添加探索噪声将动作映射到实际竞价参数范围alpha1:0-45, alpha2:0-54调用市场出清函数获取新状态节点电价和奖励利润存储经验并在缓冲区满后开始学习记录历史数据并定期打印训练进度3.3 结果可视化# 绘制竞价参数曲线 plt.figure() plt.plot(alpha1_history, labelGenerator 1 alpha) plt.plot(alpha2_history, labelGenerator 2 alpha) plt.axhline(y20.29, colorr, linestyle--, labelNash Equilibrium G1) plt.axhline(y22.98, colorg, linestyle--, labelNash Equilibrium G2) plt.xlabel(Episode) plt.ylabel(Alpha) plt.legend() plt.title(DDPG Bidding Strategy in 3-bus System) plt.savefig(DDPG_3_bus.png) plt.show()可视化部分绘制两家发电公司的竞价参数变化曲线添加理论纳什均衡值作为参考线设置图表标题、坐标轴标签和图例保存图表并显示四、其他辅助模块4.1 QLearning.py实现Q学习算法作为对比算法采用表格存储状态-动作价值通过ε-贪婪策略选择动作主要包括QLearningTable类维护Q表和学习参数实现choose_action和learn方法适用于离散状态和动作空间4.2 thirty_bus.py实现IEEE 30节点系统的市场出清模型包含6家发电公司和20个负荷节点结构与3节点系统类似但包含更多节点和线路约束发电公司和负荷参数更复杂潮流计算更复杂4.3 VRE.py实现变分Roth-Erev学习算法基于历史经验更新动作选择概率主要特点通过策略概率分布选择动作动作价值随历史奖励动态更新适用于探索不同的学习机制五、程序整体逻辑总结该程序实现了基于DDPG算法的发电公司竞价策略学习系统整体逻辑如下发电公司智能体通过DDPG算法学习竞价参数α电力市场环境threebus.py或thirtybus.py根据竞价参数进行市场出清计算节点电价和发电公司利润将利润作为奖励反馈给智能体智能体通过经验回放和 Actor-Critic 架构更新策略经过多轮迭代智能体逐渐收敛到最优竞价策略通过与理论纳什均衡和其他算法Q-Learning、VRE对比验证DDPG算法的有效性程序设计遵循模块化原则各模块功能清晰可扩展性强支持不同电力系统拓扑和学习算法的对比实验。python代码基于DDPG深度确定性梯度策略算法的售电公司竞价策略研究 关键词DDPG 算法 深度强化学习 电力市场 发电商 竞价 说明文档完美复现英文文档可找我看文档 主要内容 代码主要研究的是多个售电公司的竞标以及报价策略属于电力市场范畴目前常用博弈论方法寻求电力市场均衡但是此类方法局限于信息完备的简单市场环境难以直观地反映竞争性的市场环境因此本代码通过深度确定性梯度策略算法DDPG对发电公司的售价进行建模解决了传统的RL算法局限于低维离散状态空间和行为空间收敛性不稳的问题实验表明该方法比传统的RL算法具有更高的精度即使在不完全信息环境下也能收敛到完全信息的纳什均衡。 此外该方法通过定量调整发电商的耐心参数可以直观地反映不同的默契合谋程度是分析市场策略的有效手段。 目前深度强化学习非常火热很容易出成果非常适合在本代码的基础上稍微加点东西即可形成自己的成果非常适合深度强化学习方向的人学习 这段代码包含了三个程序我们分别来进行详细分析。 程序一 python import numpy as np from market.three_bus import market_clearing from algorithm.VRE import RothErevAgents import matplotlib.pyplot as plt n_agents 2 action_space np.arange(0, 3.1, 0.2) n_steps 10000 a_real np.array([15.0, 18.0]) strategic_variables np.zeros((n_steps, n_agents)) multi_agents RothErevAgents(n_agents, action_space) for step in range(n_steps): action multi_agents.select_action() alpha action * a_real nodal_price, profit market_clearing(alpha) strategic_variables[step] alpha multi_agents.learn(profit) if (step 1) % 1000 0: print(Step:, step 1, a1: %.2f % alpha[0], a2: %.2f % alpha[1], r1: %.3f % profit[0], r2: %.3f % profit[1]) C np.array([[0.36, 0.58, 0.75], [0.92, 0.28, 0.29]]) plt.plot(strategic_variables[:, 0], lw0.5, CC[0], alpha0.5, labelr$\alpha_{1t}$) plt.plot(strategic_variables[:, 1], lw0.5, CC[1], alpha0.5, labelr$\alpha_{2t}$) plt.plot([0, 10000], [20.29, 20.29], --, CC[0], labelr$\alpha_{1t}^\ast$) plt.plot([0, 10000], [22.98, 22.98], --, CC[1], labelr$\alpha_{2t}^\ast$) plt.xlabel(r$t$) plt.ylabel(r$\alpha_{gt}$ (\$/MHh)) plt.title(VRE (3-Bus System)) plt.legend() plt.savefig(VRE.png, dpi600) plt.show() 这段代码主要是使用了RothErevAgents算法来进行市场交易的仿真。程序首先导入了一些必要的库然后定义了一些变量包括代理数量n_agents、动作空间action_space、仿真步数n_steps和真实的动作值a_real。接下来创建了一个RothErevAgents对象multi_agents该对象使用Roth-Erev算法来选择动作。 在每个步骤中程序通过调用multi_agents.select_action()来选择动作。然后根据选择的动作和真实的动作值计算alpha值。接着使用market_clearing函数计算节点价格和利润。将alpha值存储在strategic_variables数组中并使用multi_agents.learn()函数来更新代理的策略。 在每1000个步骤后程序会打印出当前步骤数、alpha值和利润。最后程序使用matplotlib库绘制了两个alpha值随时间变化的图形并保存为图片。 程序二和程序三的结构与程序一类似只是使用了不同的算法QLearning和DDPG和模型ANet2和CNet2。它们的功能和工作方式与程序一类似只是算法和模型的不同。

更多文章