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

📄 genetic_others.m

📁 无线传感器遗传定位算法MATLAB源码。欢迎交流学习。
💻 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 + -