?? learning4.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 %找出最大列對應的動作
e=unidrnd (10);
if mod(e,6)==0
f=unidrnd(4);
switch f
case 1
s=s8(state,1:5)&[1 0 1 1 1];
case 2
s=s8(state,1:5)&[1 1 0 1 1];
case 3
s=s8(state,1:5)&[1 1 1 0 1];
case 4
s=s8(state,1:5)&[1 1 1 1 0];
end
else
s=s8(state,1:5)&[0 1 1 1 1];%將數組的第一列變為0,即分配頻點1,滿足條件后有90%的機會執行
end
end
if m==2
e=unidrnd (10);
if mod(e,6)==0
f=unidrnd(4);
switch f
case 1
s=s8(state,1:5)&[0 1 1 1 1];
case 2
s=s8(state,1:5)&[1 1 0 1 1];
case 3
s=s8(state,1:5)&[1 1 1 0 1];
case 4
s=s8(state,1:5)&[1 1 1 1 0];
end
else
s=s8(state,1:5)&[1 0 1 1 1];%將數組的第一列變為0,即分配頻點1,滿足條件后有90%的機會執行
end
end
if m==3
e=unidrnd (10);
if mod(e,6)==0
f=unidrnd(4);
switch f
case 1
s=s8(state,1:5)&[0 1 1 1 1];
case 2
s=s8(state,1:5)&[1 0 1 1 1];
case 3
s=s8(state,1:5)&[1 1 1 0 1];
case 4
s=s8(state,1:5)&[1 1 1 1 0];
end
else
s=s8(state,1:5)&[1 1 0 1 1];%將數組的第一列變為0,即分配頻點1,滿足條件后有90%的機會執行
end
end
if m==4
e=unidrnd (10);
if mod(e,6)==0
f=unidrnd(4);
switch f
case 1
s=s8(state,1:5)&[0 1 1 1 1];
case 2
s=s8(state,1:5)&[1 0 1 1 1];
case 3
s=s8(state,1:5)&[1 1 0 1 1];
case 4
s=s8(state,1:5)&[1 1 1 1 0];
end
else
s=s8(state,1:5)&[1 1 1 0 1];%將數組的第一列變為0,即分配頻點1,滿足條件后有90%的機會執行
end
end
if m==5
e=unidrnd (10);
if mod(e,6)==0
f=unidrnd(4);
switch f
case 1
s=s8(state,1:5)&[0 1 1 1 1];
case 2
s=s8(state,1:5)&[1 0 1 1 1];
case 3
s=s8(state,1:5)&[1 1 0 1 1];
case 4
s=s8(state,1:5)&[1 1 1 0 1];
end
else
s=s8(state,1:5)&[1 1 1 1 0]; %將數組的第一列變為0,即分配頻點1,滿足條件后有90%的機會執行
end
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
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 0.35])
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -