📄 wsngeneticprogram.m
字号:
clear all;
clc;
NIND=100; %个体数目(Number of individuals)
MAXGEN=100; %最大遗传代数(Maximum number of generations)
PRECI=11; %变量的二进制位数(Precision of variables)
GGAP=0.7; %代沟(Generation gap)
NVAR=2; %维数
NodeNum=3;%锚节点数目
NodeP=[0 1;8 1;5 8];%锚节点取值
AimNum=1;%目标节点数目
AimP=[1.2 2.4];%目标点.
for j=1:AimNum
for i=1:NodeNum
D(j,i)=roundn(sqrt(sum((NodeP(i,:)-AimP(j,:)).^2)),-1);%网络节点定位为已知条件(距离Di,各锚节点(信标节点)点坐标)
end
end
umax=10;%变量区间
umin=-10;%01区间
trace=zeros(2, MAXGEN); %寻优结果的初始值
FieldD=[REP([PRECI],[1,NVAR]);REP([umin;umax],[1,NVAR]);REP([0;0;1;1],[1,NVAR])];
Chrom=crtbp(NIND, NVAR*PRECI); %初始种群
gen=0; %代计数器
variable=bs2rv(Chrom, FieldD);
for s=1:NIND
F(s)=0;
for i=1:NodeNum
F(s)=abs(sqrt(sum((NodeP(i,:)-variable(s,:)).^2))-D(1,i))+F(s);% 最优函数,n个节点1,2,3,4....n误差求和,使最优函数最小
end
end
ObjV=F';
while gen<MAXGEN
FitnV=ranking(ObjV); %分配适应度值(Assign fitness values)
SelCh=select('sus', Chrom, FitnV, GGAP); %选择
SelCh=recombin('xovsp', SelCh, 0.6); %重组
SelCh=mut(SelCh,0.1); %变异
variable=bs2rv(SelCh, FieldD);
[k,l]=size(variable);
for s=1:k
FF(s)=0;
for i=1:NodeNum
FF(s)=abs(sqrt(sum((NodeP(i,:)-variable(s,:)).^2))-D(1,i))+FF(s);% 最优函数,n个节点1,2,3,4....n误差求和,使最优函数最小
end
end
ObjVSel=FF';
[Chrom ObjV]=REINS(Chrom, SelCh, 1, 1, ObjV, ObjVSel); %重插入子代的新种群
variable=bs2rv(Chrom, FieldD);
gen=gen+1; %代计数器增加
%输出最优解及其序号,并在目标函数图像中标出,Y为最优解,I为种群的序号
%YObjV=-ObjV
[Y, I]=min(ObjV);hold on;
plot(variable(I), Y, 'bo');
trace(1, gen)=min(ObjV); %遗传算法性能跟踪
trace(2, gen)=sum(ObjV)/length(ObjV);
time(gen)=gen;
result_J(gen)=Y;
end
variable=bs2rv(Chrom, FieldD); %最优个体的十进制转换
hold on, grid;
figure(1);
plot(variable,-ObjV,'b*');
figure(2);
plot(-trace(1,:));
hold on;
plot(-trace(2,:),'-.');grid
legend('解的变化','种群均值的变化')
result_a(1,:)=variable(I,:);
figure(3);
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:NodeNum
plot([result_a(a,1),NodeP(b,1)],[result_a(a,2),NodeP(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('最优值变化');%最优值的变化过程
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -