?? maea_main_1.m
字號:
% 該算法中進化代數設定為Tmax,完成則終止,而不用誤差作為終止條件
%%%%% 初始化智能體網格L %%%%%
% 網格規模Lsize*Lsize,維數dim
clc
clear all
Lsize=input('請輸入智能體網格行列數目(整數)以確定其規模: ');
num=input('請輸入參與負荷分配的機組數目(整數): ');
global code
code=input('請輸入編碼位數: ');
dim=code*num;
Tmax=20;%設置進化代數
L=rand(Lsize,Lsize,dim);
for i=1:Lsize
for j=1:Lsize
for k=1:dim
if L(i,j,k)<=0.5
L(i,j,k)=0;
else
L(i,j,k)=1;
end
end
end
end
clear i;
clear j;
clear k;
for T=1:Tmax
%%%%% 競爭行為 %%%%%
% 設定參數:競爭感知范圍Rs,本次參考點坐標I、J
Rs=1;
for I=1:Lsize
for J=1:Lsize
% 計算參考點的目標函數值
for i=1:dim
A(i)=L(I,J,i);
end
RefTag=MAEA_Result(A);
clear i;
% 循環求取競爭鄰域坐標
for i=(I-Rs):(I+Rs)
for j=(J-Rs):(J+Rs)
if i<1
i=i+Lsize;
end
if i>Lsize
i=i-Lsize;
end
if j<1
j=j+Lsize;
end
if j>Lsize
j=j-Lsize;
end
for k=1:dim
B(k)=L(i,j,k);
end
% 計算某一競爭鄰域元素的目標函數值
NeibTag=MAEA_Result(B);
% 比較參考點與該競爭鄰域元素的目標值大小,確定大能量智能體的坐標
if RefTag<NeibTag
RefTag=NeibTag;
imax=i;% 能量較大智能體的i坐標
jmax=j;% 能量較大智能體的j坐標
else
imax=I;
jmax=J;
end
end
end
clear i;
clear j;
clear k;
% 競爭行為的子代的產生
if imax~=I|jmax~=J
for i=1:dim
C(i)=L(I,J,i);% 參考點第三維向量
end
for j=1:dim
D(j)=L(imax,jmax,j);% 最大競爭鄰域智能體第三維向量
end
% 引入參數Dh,確定采用何種競爭方式
Dh=0.5;
HD=0;% 向量C和D的海明距離
for h=1:dim
if C(h)~=D(h)
HD=HD+1;
end
end
if HD/dim>Dh
% 第一種競爭方式
for k=1:dim
Rdm1=randint;
if C(k)==D(k)
L(I,J,k)=L(imax,jmax,k);
elseif Rdm1==0
L(I,J,k)=L(imax,jmax,k);
else
L(I,J,k)=1-L(imax,jmax,k);
end
end
else
% 第二種競爭方式
for l=1:dim
Rdm2=rand;
if Rdm2>1/dim
L(I,J,l)=L(imax,jmax,l);
else
L(I,J,l)=1-L(imax,jmax,l);
end
end
end
else
for m=1:dim
L(I,J,m)=L(I,J,m);
end
end
end
end
clear h;
clear i;
clear j;
clear k;
clear l;
clear m;
clear imax;
clear jmax;
%%%%% 自學習行為 %%%%%
% 構造總學習表
LL=zeros(dim*(dim+1)/2,2);
h=0;
for i=1:dim
for j=i:dim
h=h+1;
LL(h,1)=i;
LL(h,2)=j;
end
end
clear h;
clear i;
clear j;
% 設定參數:自學習感知范圍LRs,本次參考點坐標LI、LJ
LRs=2;
for LI=1:Lsize
for LJ=1:Lsize
% 計算參考點的目標函數值
for i=1:dim
E(i)=L(LI,LJ,i);
end
LRefTag=MAEA_Result(E);
clear i;
% 循環求取自學習鄰域目標函數值
LNeibTag=zeros(1,(1+2*LRs)^2);% 自學習鄰域目標函數值向量
h=0;
for i=(LI-LRs):(LI+LRs)
for j=(LJ-LRs):(LJ+LRs)
h=h+1;
if i<1
i=i+Lsize;
end
if i>Lsize
i=i-Lsize;
end
if j<1
j=j+Lsize;
end
if j>Lsize
j=j-Lsize;
end
% 計算某一自學習鄰域元素的目標函數值
for k=1:dim
F(k)=L(i,j,k);
end
LNeibTag(h)=MAEA_Result(F);
end
end
clear h;
clear i;
clear j;
clear k;
h=0;
for i=1:(1+2*LRs)^2
if LRefTag>=LNeibTag(i)
h=h+1;
end
end
if h==(1+2*LRs)^2% 判斷參考點是否可以獲得自學習機會
j=0;
x=0;% 隨機選擇行的存儲變量
y=0;% 迭加變量,用于判斷是否遍歷整個總學習表
while 1
y=y+1;
if y==dim*(dim+1)/2+1
Learning=1;% 第一種自學習方法的自學習布爾標值位
break;
end
while 1
if j~=x
break;
end
j=randint(1,1,[1,dim*(dim+1)/2]);% 隨機選擇一行
end
x=j;% 存儲本次循環所選擇的j行,用于和下次比較
% 第一種自學習方式
New=zeros(1,dim);% 初始化新智能體New
for k=1:dim
if k<LL(j,1)|k>LL(j,2)
New(k)=L(LI,LJ,k);
else
New(k)=1-L(LI,LJ,k);
end
end
% 計算新智能體New的目標函數值
NewTag=MAEA_Result(New);
if NewTag>LRefTag
Learning=0;% 第一種自學習方法的自學習布爾標值位
break;
end
end
clear h;
clear i;
clear j;
clear k;
clear x;
clear y;
switch Learning
case 0
for i=1:dim
L(LI,LJ,i)=New(i);
end
case 1
% 隨機產生1:n整數的一個排列
for h=1:dim
G(h)=h;
end
for j=dim:-1:2
k=randint(1,1,[1,j]);
l=G(j);G(j)=G(k);G(k)=l;
end
clear h;
clear i;
clear j;
clear k;
clear l;
j=0;
x=0;% 隨機選擇行的存儲變量
y=0;% 迭加變量,用于判斷是否遍歷整個總學習表
while 1
y=y+1;
if y==dim*(dim+1)/2+1
Learning1=1;% 第二種自學習方法的自學習布爾標值位
break;
end
while 1
if j~=x
break;
end
j=randint(1,1,[1,dim*(dim+1)/2]);% 隨機選擇一行
end
x=j;% 存儲本次循環所選擇的j行,用于和下次比較
% 第二種自學習方式
Newer=zeros(1,dim);% 初始化新智能體Newer
for k=1:dim
if k<LL(j,1)|k>LL(j,2)
Newer(G(k))=L(LI,LJ,G(k));
else
Newer(G(k))=1-L(LI,LJ,G(k));
end
end
% 計算新智能體Newer的目標函數值
NewerTag=MAEA_Result(Newer);
if NewerTag>LRefTag
Learning1=0;% 第二種自學習方法的自學習布爾標值位
break;
end
end
clear h;
clear i;
clear j;
clear k;
clear x;
clear y;
switch Learning1
case 0
for i=1:dim
L(LI,LJ,i)=Newer(i);
end
otherwise
for j=1:dim
L(LI,LJ,j)=L(LI,LJ,j);
end
end
end
else
for k=1:dim
L(LI,LJ,k)=L(LI,LJ,k);
end
end
end
end
clear j;
clear k;
m=0;
for h=1:Lsize
for k=1:Lsize
for j=1:dim
H(j)=L(h,k,j);
end
m=m+1;
% 最終網格目標值向量
LTTag(m)=MAEA_Result(H);
end
end
LTTag_max=LTTag(1);
for n=1:m
if LTTag(n)>LTTag_max
LTTag_max=LTTag(n);
end
end
LTag_max(T)=LTTag_max;% 當前代進化完成時的最優個體
abso(T)=abs(LTag_max(T));% 當前最優個體與最優值的誤差絕對值
end
figure(1);
subplot(211);
plot(LTag_max);
title('最優值隨進化代數的變化趨勢');
xlabel('進化代數');
ylabel('最優值');
subplot(212);
plot(abso);
title('當前解與最優值的誤差');
xlabel('進化代數');
ylabel('誤差');
clear h;
clear i;
clear j;
clear k;
clear m;
clear n;
for i=1:dim
K(i)=L(1,1,i);
end
[Tag_final,x1max,x2max]=MAEA_Result(K);
for h=1:Lsize
for k=1:Lsize
for j=1:dim
M(j)=L(h,k,j);
end
[Tag,x1,x2]=MAEA_Result(M);
if Tag>Tag_final
Tag_final=Tag;
x1max=x1;
x2max=x2;
end
end
end
disp('函數全局最優值為: ');
disp(Tag_final)
disp('最優值個體分別為: ');
disp('x1=');
disp(x1max)
disp('x2=');
disp(x2max)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -