独家原创!基于梯度Q学习机制的电力市场竞价模型程序代码!

本文介绍了如何使用Matlab、Yalmip和Cplex平台建立电力市场策略竞价模型,结合深度Q网络算法解决信息不完全博弈问题,模拟市场主体的最优报价决策。文章详细探讨了强化学习在电力市场环境中的应用,特别是DQN和DDQN算法,以及如何通过这些算法训练智能体以最大化收益。
摘要由CSDN通过智能技术生成

适用平台:Matlab+Yalmip+Cplex

程序建立了发电侧和购电侧的策略性竞价模型,并采用基于深度Q网络算法的神经网络模型进行训练,以求取对各市场主体最优的竞价策略,借鉴不完全信息博弈的思想,对市场参与者未知全局信息环境下的发电商和售电商进行竞价行为模拟推演,考虑成员报价策略对市场总体运行情况的影响。程序算例丰富、注释清晰、干货满满,可扩展性和创新性很高!下面对文章和程序做简要介绍!

程序创新点:

为了模拟信息壁垒的电力市场环境中竞争对手众多的情况下,市场主体最大化自身收益的有限理性报价行为,基于数值驱动的强化学习等机器学习算法越来越多地被采用,程序提出了一种基于深度Q网络算法求解市场成员纳什均衡策略解的思路。

强化学习算法:

强化学习属于机器学习算法的一种,它是智能体以“试错”的方式进行学习,通过与环境进行交互获得的奖赏指导行为,目标是使智能体获得最大的奖赏。由于外部环境提供的信息很少,智能体必须靠自身的经历进行学习。通过这种方式,智能体在行动-评价的环境中获得知识,改进行动方案以适应环境。在未知信息的电力市场环境下,强化学习算法可以用来模拟发电商和购电商的最优报价策略。

几乎所有的强化学习问题都可以建模为Markov决策过程(Markov decision process,MDP),MDP即为智能体(Agent)采取行动(Action),与环境(Environment)发生交互从而获得奖励(Reward)并改变环境的状态(State)的循环过程,框架如下图所示。MDP的策略完全取决于当前状态,即智能体只根据当前的状态来决定动作。

市场成员在电力市场的竞价行为可以认为是典型的马尔科夫决策过程,马尔科夫决策过程包括以下几个要素:

(1)智能体Agent:每个市场成员可以认为是一个智能体,智能体会根据投标的策略以及反馈的结果不断学习,最终能够学习到一个比较好的竞价策略;

(2)环境 Environment:整个电力市场可以认为是外部的环境,而ISO是环境的反馈者,ISO根据所有市场成员提交的竞价曲线进行出清,并向市场成员反馈出清结果;

(3)状态State:在计算市场成员的报价系数时,基于前一次竞价的历史数据,将前一次的出清电价作为输入状态;

(4)动作Action:将发电商的报价比例系数ki或售电商的报价比例系数dj作为智能体的动作ai;

(5)奖励Reward:市场成员进行策略性报价的目的是提高收益,因此考虑将出清计算得到各主体的收益来表征对应智能体的奖励。

深度Q网络算法

目前使用强化学习算法来模拟市场主体交易行为的文献多基于Q-learning 算法,然而Q-learning算法使用表格来存储Q(s,a)的状态-动作值函数对,由于将状态离散化,在处理状态较多的情况时,容易出现“维度灾难”的问题,在现实情况中几乎不可行,因此有人将Q-learning与深度神经网络相结合,提出了Nature Deep Q-Network,即原始的DQN,DQN的Q值更新公式与Q-learning完全相同,但DQN放弃了采用Q值表存储Q值的方式,而利用神经网络实现动作价值函数近似:

式中:θ为DQN的训练参数,包括神经网络的权重ω和偏置b。

DQN包括两个神经网络:Online Network和Target Network,Online Network的网络参数记为θ,Target Network的网络参数记为θ’。Online Network 用于输出公式中的Qn(s,a|θ),即发电商和售电商决策所需的Q值,Target Network用于输出maxQn(sn+1,a’|θ’),主要用于更新Q值。在训练DQN时,将样本数据传到优化器中,将目标Q值作为训练的标签,因此DQN梯度下降的目标是使得Online Network输出的Qn(s,a|θ)趋近目标Q值,训练的损失函数可以写为:

在Nature DQN中,Online Network和Target Network的结构和参数完全相同,唯一的区别是参数更新的频率不同,Online Network每一次训练都会更新参数,而Target Network每隔一段时间拷贝Online Network的参数,避免目标Q值和当前的Q值相关性较大。DQN相比Q-learning的另一个改进之处是采用Experience Replay memory(经验池)来解决样本数据之间的相关性问题。强化学习按顺序采集样本,样本之间具有连续性,Q-learning每次得到结果就更新Q值,受样本分布影响,效果不好。DQN每次把发电商和售电商报价的相关数据,包括当前状态、报价系数、奖励和新的状态四个信息(st,at,rt,st+1)储存到经验池存起来,当样本数据存到一定程度,就每次随机拿出一些历史数据来训练,对Online Network进行梯度下降。

Nature DQN在计算maxQn(sn+1,a’|θ’)时,存在过度估计的问题,为了减小误差,程序采用了改进的 DDQN(Deep Q-Network)算法,DDQN算法的改进之处是先使用Online Network输出 maxQn(sn+1,a’|θ)对应的动作 argmaxQn(sn+1,a’|θ),然后使用Target Network计算 Qn(sn+1,argmaxQn(sn+1,a’|θ)|θ’),而DQN算法是直接使用Target Network计算maxQn(sn+1,a’|θ’)。发电商和售电商采用的DDQN的框架如下图所示。

程序结果:

部分程序:

 %% 代理商模型
    actions(k,:) = agent_sim(i,bat_soc_init,env_params,agent_params,energy_data);
    actions_la(k,:) = agent_sim2(i,bat_soc_init,env_params,agent_params,energy_data,tetha);​
 ​%% 静态代理商模型
    bid_q_s = static_sim(i,bat_soc_init,'predicted',env_params,energy_data);
%   oracle_actions(k,:) = bid_q_o;​
    bid_q_op = oracle_sim(i,bat_soc_init,'predicted',env_params,energy_data);​
 ​%% 代理商的实际能源使用量
    [performance,bat_storage(k,:)] = evaluate_actions(i,bat_soc_init,bat_eff,env_params,energy_data,actions(k,:));
    performance_measures_agent.reward(k,:) = performance.reward;
    performance_measures_agent.wastage(k,:) = performance.wastage;
    performance_measures_agent.bat_charge_cost(k,:) = performance.bat_charge_cost;
    performance_measures_agent.cost(k,:) = performance.actual_cost;
    num_charge_cycles = num_charge_cycles + performance.charge_cycles;​
​​   %% 训练模型
    state = [demand_norm_a(i,:); solar_norm_a(i,:); bat_storage(k,:)/bat_cap; acp_a(i,:)/max_acp; (1:NBlocks)/NBlocks; actions(k,:)/max_bid_q]';
    [~,qnext_sa(1:end-1)] = greedy_nn(state(2:end,1:end-1),agent_params.target_weights,env_params);​
    agent_params = ann_train(state,agent_params,reward,q_sa,qnext_sa,gamma);
    td_error(k) = sum(abs(reward + gamma*qnext_sa - q_sa),1);​
        agent_params.target_weights = agent_params.weights;
​%% 线性化的实际能量使用
​[performance,bat_storage_la(k,:)] = evaluate_actions(i,bat_soc_init,bat_eff_la,env_params,energy_data,actions_la(k,:));
performance_measures_agent_la.reward(k,:) = performance.reward2;​ performance_measures_agent_la.wastage(k,:) = performance.wastage;
​performance_measures_agent_la.bat_charge_cost(k,:) = performance.bat_charge_cost;
​performance_measures_agent_la.cost(k,:) = performance.actual_cost;
​num_charge_cycles_la = num_charge_cycles_la + performance.charge_cycles;
​%% 训练线性模型
    reward = performance_measures_agent_la.reward(k,:)';​
 ​[~,qnext_sa(j)] = greedy(demand_norm_a(i,j+1),solar_norm_a(i,j+1),bat_storage_la(k,j+1)/bat_cap,min_bid_q,max_bid_q, acp_a(i,j+1)/max_acp, (j+1)/NBlocks,tetha);
 ​present_state = basisExpansion(demand_norm_a(i,j), solar_norm_a(i,j), bat_storage_la(k,j)/bat_cap, actions_la(k,j)/max_bid_q, acp_a(i,j)/max_acp, j/NBlocks);
 ​tetha = tetha + alpha*(reward(j) + gamma*qnext_sa(j) - q_sa(j))*present_state';
% ​%% 没有蓄电池
% ​netdemand = (demand_a(i,:)-solar_a(i,:));
% ​idx = find(acp_a(i,:)<grid_rate);
% ​cost_without_battery(k,idx) = netdemand(idx).*acp_a(i,idx);
% ​cost_without_battery(k,idx) = netdemand(idx).*grid_rate;
% ​cost_without_battery(k,:) = netdemand*grid_rate;

部分内容源自网络,侵权联系删除!

欢迎感兴趣的小伙伴关注并私信获取完整版代码,小编会不定期更新高质量的学习资料、文章和程序代码,为您的科研加油助力!

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值