⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 learning4.m

📁 强化学习的q学习算法,能够通过此算法
💻 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 + -