📄 learning2.m
字号:
clear all;
clc;
format short
format compact
a=zeros(1,10000); %存放冲突,1代表发生冲突,0代表没发生冲突
gamma=0.95; % 折扣因子
state_new=1;
new=zeros(1,20);
m=1;
s=zeros(1,5);
afa=0.1; %learning parameter
q=rand(7,5); %横坐标是状态,纵坐标是动作
s1=[0 0 1 1 1];%0代表已占用,1代表未占用
s2=[0 0 0 1 1];
s3=[0 0 1 0 1];
s4=[0 0 1 1 0];
s5=[0 0 0 0 1];
s6=[0 0 0 1 0];
s7=[0 0 1 0 0];
s8=[s1;s2;s3;s4;s5;s6;s7];
state=1; %首先定义为状态1
k=1; %a数组的下标
for u=1:10000 %循环1万次,记录1万次数据
max=q(state,1);
for i=2:5 %找出state行最大列
if max<q(state,i)
max=q(state,i);
m=i;
end
end
if m==1 %找出最大列对应的动作
s=s8(state,1:5)&[0 1 1 1 1];
a(k)=1; %与授权用户冲突
r=-5;
end
if m==2
s=s8(state,1:5)&[1 1 0 1 1];
a(k)=0; %与授权用户冲突
r=1;
end
if m==4
s=s8(state,1:5)&[1 1 1 0 1];
a(k)=0; %与授权用户冲突
r=1;
end
if m==5
s=s8(state,1:5)&[1 1 1 1 0];
a(k)=0; %与授权用户冲突
r=1;
end
if s== s8(1,1:5)
state_new = 1;
elseif s==s8(2,1:5)
state_new = 2;
elseif s==s8(3,1:5)
state_new = 3;
elseif s==s8(4,1:5)
state_new = 4;
elseif s==s8(5,1:5)
state_new = 5;
elseif s==s8(6,1:5)
state_new = 6;
elseif s==s8(7,1:5)
state_new = 7;
else
state_new = 1;
end
new(k)=state_new;
k=k+1;
max_2=q(state_new,1);
for i=2:5 %找出state_new行最大列
if max_2<q(state_new,i)
max_2=q(state_new,i);
end
end
q(state,m)=(1-afa)*q(state,m)+afa*(r+gamma*max_2); %Q更新算法
state=state_new; %更新状态
end
sum=0;
b=zeros(1,20);
for n=1:20
for i=((n-1)*500+1):n*500
sum=sum+a(i);
end
b(n)=sum/500; %计算500次内发生的冲突次数,并赋给b
sum=0;
end
n=1:20;
plot(n,b(n),'*r')
axis([1 20 0 0.35])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -