强化学习部分代码的注释分析
引言
对一些代码块进行注释。我直接复制过来的,不能运行的话别怪我。
多臂赌博机
代码来自链接。欢迎回到原来的链接学习。
%I thought what I'd do was I'd pretend I was one of those deaf-mutes,or should I ?
clear all;
epsilon=[0.5,0.2,0.1,0.02,0.005]; %epsilon概率进行探索(exploration),1-epsilon概率进行利用(exploitation)
m=5; 表示一共有5种情况
T=10000; 表示一共运行1万次
%决策机内存初始化
Avegain=zeros(m,5); % 每种情况,标记当下每一个摇臂的中奖概率
Testtime=zeros(m,5);% 每种情况下,标记每一个实验摇臂的实验次数
Reward=zeros(5,T);% 奖励
for k=1:m
for i=1:T
if rand(1)<=epsilon(k) %探索
num=unidrnd(5); %随机生成最大为5的正整数,随机选择摇臂
else %利用
a=findmax(Avegain(k,:)); % 自主建立函数,选择在当前情况下最大中奖概率的摇臂
num=a(2);%选择平均奖赏最大的摇臂。因为是自建函数,这个应该是返回摇臂的序号
end
r=Slotmachine5(num);% 自建函数,拉下摇杆,获得回报。
if i==1 %更新累计奖赏
Reward(k,i)=r;
else
Reward(k,i)=(Reward(k,i-1)*(i-1)+r)/i;
end
Avegain(k,num)=(Avegain(k,num)*Testtime(k,num)+r)/(Testtime(k,num)+1); %更新所选臂的平均奖赏
Testtime(k,num)=Testtime(k,num)+1; %更新所选臂的实验次数
end
end
result.Testtime=Testtime;
result.Avegain=Avegain;
result.Reward=Reward;
plot(1:10000,Reward);
xlabel('测试次数');
ylabel('平均累计奖赏');
legend('ε=0.5','ε=0.2','ε=0.1','ε=0.02','ε=0.005');
剩下的我相信大家都已经懂了。这就是相信的力量。
风场中的Q-learning
风场中的Q-learning源自网址:
%I thought what I'd do was I'd pretend I was one of those deaf-mutes, or should I?
clear all;
%风速初始化
Windyworld.windx=zeros(7,10);
Windyworld.windy=zeros(7,10);
Windyworld.windy(:,4:9)=Windyworld.windy(:,4:9)+1; % 定义风速向量(在4-9之间为x=0, y=1)
targetxy=[6,8]; %!!注意:第一个坐标为y坐标,第二个坐标为x坐标 终点坐标
alpha=0.5;
gamma=0.99;
Tloop=6000; %总学习循环次数
mark=zeros(1,Tloop); %记录是否成功
%迭代为二重时间循环
Q_func=zeros(7,10,4); %!!三维值函数矩阵:(z=1:+x)(z=2:-x)(z=3:+y)(z=4:-y) 初始化定义Q表格
Q_func(:,:,1)=0.2; %size(B),ndims(B)
Q_func(targetxy(1),targetxy(2),:)=0; %目标值的所有Q函数始终为0
for Ts=1:Tloop %Ts=study time
%单次运动初始化
rolexy=[4,1]; % 初始化出发
result(Ts).Q_func=zeros(7,10,4); %
result(Ts).trace=zeros(40,3);
result(Ts).trace(1,:)=([1,rolexy(1),rolexy(2)]);
for Tm=1:40
% 按照策略获得到达下一步的动作。这其中包括智能体选择动作的ε-greedy策略,函数名tcegreedy,Ts为训练次数,Q_func(rolexy(1),rolexy(2),:)为当下Q表格的内容;
act=tcegreedy(Ts,Q_func(rolexy(1),rolexy(2),:));
% 智能体在风的影响下运动,函数名movement;输入参数包括,选择的动作act,当下的位置rolexy以及风速运行的方位Windyworld
nextxy=movement(act,rolexy,Windyworld);
%TD算法进行策略值迭代
%计算reward
% 计算,如果到达目标则返回奖励;超出边界则返回惩罚,没有超出边界且没到达目标则返回0奖励
if nextxy(1)==targetxy(1)&&nextxy(2)==targetxy(2) %到达目标
reward=5;
else if nextxy(1)<1||nextxy(1)>7||nextxy(2)<1||nextxy(2)>10 %超出边界
reward=-1;
else
reward=0;
end %reward不考虑超出步数的问题
end
%计算下一步的策略函数最大值
%Qlearning方式进行Q函数更新,更新Q值中所用的s'状态下动作与实际在s'状态下做出动作不一定相同(因为e-greedy的存在)
if nextxy(1)<1||nextxy(1)>7||nextxy(2)<1||nextxy(2)>10 %超出边界
Q1=0;
else
Q1=max(Q_func(nextxy(1),nextxy(2),:));
end
Q_func(rolexy(1),rolexy(2),act)=(1-alpha)*Q_func(rolexy(1),rolexy(2),act)+alpha*(reward+gamma*Q1);
%更新坐标
rolexy=nextxy;
result(Ts).trace(Tm+1,:)=([Tm+1,rolexy(1),rolexy(2)]);
%判断是否跳出本episode
if rolexy(1)==targetxy(1)&&rolexy(2)==targetxy(2)
mark(Ts)=1; % 如果到达目标,则返回成功标记
break;
else if rolexy(1)<1||rolexy(1)>7||rolexy(2)<1||rolexy(2)>10
break; % 否则出界,直接退出
end
end
end
result(Ts).Q_func=Q_func;
end
Avegain=zeros(1,Tloop);
for i=1:Tloop
Avegain(i)=sum(mark(1:i))/i; % 返回不同时期的成功概率
end
原文地址:https://blog.csdn.net/qq_44493315/article/details/142730896
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!