📄 learning1.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=zeros(4,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=[s1;s2;s3;s4];
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 %找出最大列对应的动作
e=unidrnd (20);
if mod(e,6)==0
f=unidrnd(4);
switch f
case 1
s=s5(state,1:5)&[1 0 1 1 1];
case 2
s=s5(state,1:5)&[1 1 0 1 1];
case 3
s=s5(state,1:5)&[1 1 1 0 1];
case 4
s=s5(state,1:5)&[1 1 1 1 0];
end
else
s=s5(state,1:5)&[0 1 1 1 1];%将数组的第一列变为0,即分配频点1,满足条件后有90%的机会执行
end
end
if m==2
e=unidrnd (20);
if mod(e,6)==0
f=unidrnd(4);
switch f
case 1
s=s5(state,1:5)&[0 1 1 1 1];
case 2
s=s5(state,1:5)&[1 1 0 1 1];
case 3
s=s5(state,1:5)&[1 1 1 0 1];
case 4
s=s5(state,1:5)&[1 1 1 1 0];
end
else
s=s5(state,1:5)&[1 0 1 1 1];%将数组的第一列变为0,即分配频点1,满足条件后有90%的机会执行
end
end
if m==3
e=unidrnd (20);
if mod(e,6)==0
f=unidrnd(4);
switch f
case 1
s=s5(state,1:5)&[0 1 1 1 1];
case 2
s=s5(state,1:5)&[1 0 1 1 1];
case 3
s=s5(state,1:5)&[1 1 1 0 1];
case 4
s=s5(state,1:5)&[1 1 1 1 0];
end
else
s=s5(state,1:5)&[1 1 0 1 1];%将数组的第一列变为0,即分配频点1,满足条件后有90%的机会执行
end
end
if m==4
e=unidrnd (20);
if mod(e,6)==0
f=unidrnd(4);
switch f
case 1
s=s5(state,1:5)&[0 1 1 1 1];
case 2
s=s5(state,1:5)&[1 0 1 1 1];
case 3
s=s5(state,1:5)&[1 1 0 1 1];
case 4
s=s5(state,1:5)&[1 1 1 1 0];
end
else
s=s5(state,1:5)&[1 1 1 0 1];%将数组的第一列变为0,即分配频点1,满足条件后有90%的机会执行
end
end
if m==5
e=unidrnd (20);
if mod(e,6)==0
f=unidrnd(4);
switch f
case 1
s=s5(state,1:5)&[0 1 1 1 1];
case 2
s=s5(state,1:5)&[1 0 1 1 1];
case 3
s=s5(state,1:5)&[1 1 0 1 1];
case 4
s=s5(state,1:5)&[1 1 1 0 1];
end
else
s=s5(state,1:5)&[1 1 1 1 0]; %将数组的第一列变为0,即分配频点1,满足条件后有90%的机会执行
end
end
if s== s5(1,1:5)
state_new = 1;
elseif s==s5(2,1:5)
state_new = 2;
elseif s==s5(3,1:5)
state_new = 3;
elseif s==s5(4,1:5)
state_new = 4;
else
state_new = 1;
end
if state_new == state
a(k)=1;
r=-5;
else
a(k)=0;
r=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 1])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -