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

📄 wsngeneticprogram.m

📁 基于matlab遗传算法工具箱的无线传感器网络定位仿真程序
💻 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 + -