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

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

时间:2024-03-15 15:59:15浏览次数:36  
标签:bat Network la 梯度 agent 竞价 params performance 程序代码

适用平台: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;

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

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

标签:bat,Network,la,梯度,agent,竞价,params,performance,程序代码
From: https://blog.csdn.net/weixin_48747334/article/details/136616852

相关文章

  • EI期刊复现:面向配电网韧性提升的移动储能预布局与动态调度策略程序代码!
    适用平台:Matlab+Yalmip+Cplex/Gurobi/Mosek程序提出一种多源协同的两阶段配电网韧性提升策略。在灾前考虑光伏出力不确定性与网络重构,以移动储能配置成本与负荷削减风险成本最小为目标对储能的配置数量与位置进行预布局;在灾后通过多源协同运行与移动储能的动态调度最小化负荷......
  • 深度学习4:感知器-三种激活函数及梯度下降算法
    文章目录1.感知器定义2.激活函数2.1常用的激活函数(1)三种激活函数的值域比较(2)三种函数对于定义域比较(3)PyTorch中的三种激活函数代码3求最优权重和偏置项(w,b)的方法3.1梯度下降算法(一元函数)实例3.2随机梯度下降算法(多元函数,单个样本)实例3.3批量梯度下降算法(......
  • 通达信竞价绝杀排序指标公式
    {通达信竞价绝杀排序指标公式}{指标介绍:1.黄金甲信号稳定的创业板票(主力净额大于1500万,占比大于8%,流通市值小于80亿);2.情绪周期里面的三板以上的主板票(主力净额大于1500万,占比大于8%,流通市值小于150亿);3.昨日涨停的创业板票,今日高开(主力净额大于800万,占比大于8%,流通市值......
  • 通达信绝地反击釜底抽薪竞价选股公式 枭雄竞价 抓首板 抓连扳 开盘绿开反核低吸 绿盘
    {股票指标}枭雄竞价之绝地反击:专门选昨日未涨停今天绿开的个股,绿盘低吸。每天出信号最多不超过3只,信号全天不变。枭雄竞价之釜底抽薪:专门选昨日涨停(不限几连板)今天绿开的个股,绿盘低吸。每天出信号最多不超过3只,信号全天不变。竞价指标要用到竞价量等未来函数,这些是竞价要用......
  • 对梯度下降法中参数更新是减去学习率与偏导数之积而不是学习率与偏导数的倒数之积的理
    这是我在对比softmax回归和线性回归偏导时的一个疑问,看到知乎上有一个人同样的问题,问题链接为:https://www.zhihu.com/question/263929081。原回答里,我非常认可的一个回答是:我的理解是这两种看法都是正确的,分别衍生出不同的优化方法。首先是除以梯度,这是利用了泰勒展开式,从导数......
  • 神经网络梯度消失原因
    个人学习使用,内容来源于网络,侵权删主要原因就是反向传播链式求导某项小于1(如使用sigmoid激活函数,其求导之后值\(\leq0.25\)),越深层次网络导数连乘越多,从而导致梯度消失,反之某项大于1会导致梯度爆炸,因此初始\(W\)过大会导致梯度爆炸。如图所示,当\(\sigma\)激活函数的值太小,经过......
  • 通达信【竞价强弱排序】竞价绝杀用于全A股 主做一进二模式 竞价直接结束战斗 短期内的
    {股票指标} 弄明白竞价是怎么回事,避免小白入坑,竞价不适合每一个人,不喜者请绕道竞价公式函数不能回测,请注意,不喜者请绕道集合竞价抓涨停的公式,每天的胜率都不一样哦,但是朋友们要注意第二天是不是能不能冲高走也是一个非常重要的参考因素,而不是当天涨停了就好了 第一点,竞......
  • 深度学习-卷积神经网络-经典的卷积神经网络-梯度消失-44
    目录1.什么是梯度消失1.什么是梯度消失在梯度下降中,随着算法反向反馈到前面几层,梯度会越来越小,最终,没有变化,这时或许还没有收敛到比较好的解,这就是梯度消失问题,梯度爆炸或者消失!!!1,神经网络损失函数非凸的损失函数,逐步的减小步长,或者叫动态调整学习率2,梯度爆炸的解决,使用梯度......
  • 使用lanczos算法进行的预处理共轭梯度算法(Preconditioned Conjugate Gradients Metho
    构造预处理矩阵M(对称正定)下图来自:预处理共轭梯度法(1)......
  • 预处理共轭梯度算法(Preconditioned Conjugate Gradients Method)
    预处理共轭梯度算法(PreconditionedConjugateGradientsMethod)给出百度百科上的解释:预处理共轭梯度法预处理共轭梯度法是。不必预先估计参数等特点。共轭梯度法近年来在求解大型稀疏方程组中取得了较好的成效。理论上普通的共扼梯度法对于对称超正定方程,只要迭代步数达到......