📄 genetic_others.m
字号:
%Generic Algorithm for function f(x1,x2) optimum
clear all;
clc;
close all;
%Parameters
Size=100;%种群数量
G=100; %迭代次数
CodeL=10;%编码长度
NodeNum=7;%锚节点数目
NodeP=[0 1;1 3;2 1;3 4.2;4 3;1.2 3.9;3.4 2.8];%锚节点取值
AimNum=5;%目标节点数目
AimP=[1.2 2.4;2.5 1.4;0.4 3;2.5 3.2;3.6 3.5];%目标点,验证用.
%for j=1:AimNum
% for i=1:NodeNum
% D(j,i)=roundn(sqrt(sum((NodeP(i,:)-AimP(j,:)).^2)),-1);%网络节点定位为已知条件(距离Di,各锚节点(信标节点)点坐标)
% end
%end
%D=[sqrt(2) sqrt(2) sqrt(2)];%与各锚节点的距离
D=[1.8,0.6,1.6,2.5,2.9,1.5,2.2;2.5,2.2,0.6,2.8,2.2,2.8,1.7;...
2,0.6,2.6,2.9,3.6,1.2,3;3.3,1.5,2.3,1.1,1.5,1.5,1;...
4.4, 2.6,3,0.9,0.6,2.4,0.7];
umax=10;%变量区间
umin=-10;%01区间
%Main Program
for a=1:AimNum
E=round(rand(Size,2*CodeL));%初始编码,round四舍五入,rand(Size,2*CodeL)产生80*20矩阵,元素(0,1)随机取,服从均匀分布
for k=1:G
time(k)=k;
for s=1:Size
m=E(s,:);%取矩阵的第s行
y1=0;y2=0;%两个变量在零一区间的初始值
%Uncoding
m1=m(1:CodeL);%取前10个元素,解码生成y1
for i=1:CodeL
y1=y1+m1(i)*2^(i-1);
end
x1=(umax-umin)*y1/1023+umin;%将解码出来的结果转换到区间内
m2=m((CodeL+1):(2*CodeL));% 取另外十个元素,解码生成y2
for i=1:CodeL
y2=y2+m2(i)*2^(i-1);
end
x2=(umax-umin)*y2/1023+umin;%将解码出来的结果转换到区间内
for i=1:NodeNum
F1(i)=sum((NodeP(i,:)-[x1,x2]).^2);% 求到信标节点距离
end
[F2 Idx]=sort(F1);%从小到大排列
Idx_r(a,:)=Idx(1:3);
F(s)=0;
for i=1:3
F(s)=abs(sqrt(sum((NodeP(Idx(i),:)-[x1,x2]).^2))-D(a,Idx(i)))+F(s);% 最优函数,n个节点1,2,3,4....n误差求和,使最优函数最小
end
F(s)=1./F(s);%见第70行
end
Ji=1./F;
%****** Step 1 : Evaluate BestJ ******
BestJ(k)=min(Ji);
fi=F; %Fitness Function
[Oderfi,Indexfi]=sort(fi); %Arranging fi bigger to small,从大到小排序
Bestfi=Oderfi(Size); %Let Bestfi=max(fi)
BestS=E(Indexfi(Size),:); %Let BestS=E(m)初始样本中最优样本, m is the Indexfi belong to max(fi)
bfi(k)=Bestfi;%将每次循环的最优值存到数组中
%****** Step 2 : Select and Reproduct Operation******选择复制
fi_sum=sum(fi);%所有的值求和
fi_Size=(Oderfi/fi_sum)*Size;%oderfi是排序之后的数组,求数组之中每个元素所占的比例(占的比例大,值大,说明更优)
fi_S=floor(fi_Size); %Selecting Bigger fi value,floor函数的作用是取比每个元素小的整数。左边最近的整数(数轴)
kk=1;
for i=1:Size
for j=1:fi_S(i) %选择复制
TempE(kk,:)=E(Indexfi(i),:); %fi_S=floor(fi_Size)这个数组元素是零则不选择复制,是一就选择复制(占的比例比较大就是一,占的比例比较小就是零)
kk=kk+1; %kk是用于复制的
end
end
%************ Step 3 : Crossover Operation ************
pc=0.60; %交叉概率
n=ceil(20*rand);%ceil(20*随机数)20位随机选择一位,ceil取比它大得最近的整数
for i=1:2:(Size-1)
temp=rand;
if pc>temp %Crossover Condition交叉概率大于随机数,则交叉
for j=n:1:20%从第n位到第20位交叉
TempE(i,j)=E(i+1,j);
TempE(i+1,j)=E(i,j);%1:2:(size-1)每次交叉都交叉两个,循环后样本变成100个
end
end
end
TempE(Size,:)=BestS;%保存最优样本
E=TempE;%把TempE存到E中(更新)
%************ Step 4: Mutation Operation **************变异
%pm=0.001;
%pm=0.001-[1:1:Size]*(0.001)/Size; %Bigger fi, smaller Pm
%pm=0.0; %No mutation
pm=0.1; %Big mutation变异概率非零
for i=1:1:Size%样本数
for j=1:1:2*CodeL%两个数。位数CodeL*2
temp=rand;%产生随机数
if pm>temp %随机变异 %Mutation Condition
if TempE(i,j)==0%1变成0,0变成1
TempE(i,j)=1;
else
TempE(i,j)=0;
end
end
end
end
%Guarantee TempPop(30,:) is the code belong to the best individual(max(fi))
TempE(Size,:)=BestS;%最优结果保存
E=TempE;%更新,下次循环用这个E
% Err=sqrt(sum(([x1,x2]-AimP(a,:)).^2));%论文中的误差公式
Error=0;
for i=1:3
Error=sqrt(sum(([x1,x2]-NodeP(i,:)).^2))+Error;%论文中的误差公式到三点距离之和
end
Err(a,k)=Error;
end
result_a(a,:)=[x1,x2];%每次循环找到的点,每次找到一个就存一个
result_J(a,:)=BestJ;%同上,最优值
end
%figure(1);%第一张图
subplot(1,2,1);
hold on;
for i=1:NodeNum
plot(NodeP(i,1),NodeP(i,2),'xblack');
s1=num2str(NodeP(i,1));
s2=num2str(NodeP(i,2));
s=[' ','(',s1,',',s2,')'];
text(NodeP(i,1),NodeP(i,2),(s),'Color','black');
end
for a=1:AimNum
plot(result_a(a,1),result_a(a,2),'or');
result_a(a,1)=result_a(a,1)*100;
result_a(a,2)=result_a(a,2)*100;
s1=fix(result_a(a,1));
s2=fix(result_a(a,2));
s1=s1*0.01;
s2=s2*0.01;
result_a(a,1)=result_a(a,1)*0.01;
result_a(a,2)=result_a(a,2)*0.01;
%s1=roundn(result_a(a,1),-2);
%s2=roundn(result_a(a,2),-2);%保留两位小数
s=[' A',num2str(a),'(',num2str(s1),',',num2str(s2),')'];%坐标数值型转化成字符型
text(result_a(a,1),result_a(a,2),(s),'verticalAlignment', 'bottom','Color','r');%规定坐标的颜色和位置 ,text在图中标注
plot(AimP(a,1),AimP(a,2),'x');
AimP(a,1)=AimP(a,1)*1000;
AimP(a,2)=AimP(a,2)*1000;
s1=fix(AimP(a,1));
s2=fix(AimP(a,2));
s1=s1*0.001;
s2=s2*0.001;
AimP(a,1)=AimP(a,1)*0.001;
AimP(a,2)=AimP(a,2)*0.001;
%s1=roundn(AimP(a,1),-3);
%s2=roundn(AimP(a,2),-3);
s=['','(',num2str(s1),',',num2str(s2),')'];
text(AimP(a,1),AimP(a,2),(s),'verticalAlignment', 'top','Color','b');
end
title('红色坐标为程序运算所得目标点');
color=['b','r','g','y','m'];
for a=1:AimNum
for b=1:3
plot([result_a(a,1),NodeP(Idx_r(a,b),1)],[result_a(a,2),NodeP(Idx_r(a,b),2)],color(a));
end
end
subplot(1,2,2);
hold on;
for a=1:AimNum
%subplot(AimNum,1,a);% 一幅图分成若干个子图子图。选定图
s=['o',color(a)];
plot(time,result_J(a,:),s);%画图。绘制
end
xlabel('Times');title('最优值变化');%三个最优值的变化过程
%figure(3)
%for a=1:AimNum
% subplot(AimNum,1,a);
% plot(time,Err(a,:),'*');
% s=['误差:A',num2str(a)];
% xlabel('迭代次数');ylabel(s);%三个误差的变化过程,横纵坐标标注
%end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -