离散型遗传算法求解组合优化matlab实现

问题描述: 103个50维的节点中,选出n个节点进行组合,使其获得较好的适应度值

注意点:首先在原始数据文件(txt)中,将相应的节点进行编号,编成1-103,放在第一列,之后再将编号映射到相应的真实节点上。

需要数据文件的小伙伴,可以到:https://download.csdn.net/download/qq_37188465/10314985 下载

%%%实现个体的交叉变异matlab代码:

*****************************************************************************************************************

%从桥梁传感器103*50模态数据中,共103个点中,选出zh个点进行组合,每一个个体的每一维是离散的,因此
%为103条记录进行编号
function ga_main(zh)
%导入模态文件
format long
file=’C:\Users\my_pc_2017_1_2\Desktop\node_trans.txt’;
mt=load(file);
m=mt;
[rows,cols]=size(mt);%获得模态矩阵的行和列,第一列表示为节点编的编号,方便找到对应的节点,第二列表示实际节
%定义目标函数,目标函数为r=obj_val()
%节点组合个数
n=zh;
%遗传代数
ge=100;
%种群规模
gm=50;
%种群代沟
gg=0.7;
%种群变异概率
gb=0.0125;
%交叉概率
gj=0.7;
%重插入概率
gc=1;
%寻优结果的初始
%设置初始化随机数发生器
rand(‘state’,sum(clock));
for k=1:gm %通过改良圈算法选取初始种群
    cl=randperm(103,103);%生成20个1-103的随机且不重复的数据,即生成初始解
  %保存种群所有的组合
  J(k,1:103)=cl;
end
 %disp(J);
 %计算初始种群的适应度值
 j1=J(:,1:n);
 objvalue=obj_val(j1,m);
 J=J/103;%把整数序列转换成[0,1]区间上的实数,即转换成染色体编码
 for k=1:ge%该层循环进行遗传算法的操作
     A=J;%交配产生子代A的初始染色体
     if rand<gj
     c=randperm(gm);%产生下面交叉操作的染色体对
    % disp(c);
     for i=1:2:gm
         F=1+floor((n-1)*rand(1));%产生交叉操作的的地址
         temp=A(c(i),[F:n]);%中间变量的保存值
         A(c(i),[F:n])=A(c(i+1),[F:n]);%交叉操作
         A(c(i+1),F:n)=temp;
     end
     end
      B=[];
      if rand<gb
     by=[];%为了防止下面产生空地址,这里先初始化
     while ~length(by)
         by=find(rand(1,gm)<0.1);%产生变异操作的地址
     end
     B=A(by,:);%产生变异操作的初始染色体
     for j=1:length(by)
         bw=sort(1+floor((n-1)*rand(1,3)));%产生变异操作的3个地址
         B(j,:)=B(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:end]);%交换位置
     end
      end
     G=[J;A;B];%父代和子代种群和在一起
     %disp(G);
     [SG,ind1]=sort(G,2);%把染色体翻译成1…20的序列ind1,此处需要修改
     num=size(G,1);
     long=zeros(1,num);
     g1=ind1(:,1:n);
     %fprintf(‘交叉变异后的种群:\n’);
     %disp(g1);
     objvalue=obj_val(g1,m);
     long=objvalue;
     [slong,ind2]=sort(long);%对路径长度从小到大排序
     J=G(ind2((end+1)-gm:end),:);%精选前m个较大的组合对应的染色体
 end
 [SG1,ind3]=sort(J,2);
  fprintf(‘最终的索引:\n’);
 disp(ind3);
 path=ind3(gm,:),
 path=path(:,1:n),
 objvalue=obj_val(path,m);
 pp=zeros(1,n);
 for k1=1:n
  pp(k1)=m(path(k1),2);
 end
 fprintf(‘最终的桥梁节点组合:\n’);
 pp=sort(pp);
 max=objvalue;
 disp(pp)
end

********************************************************************************************************************************

%%计算适应度值

*******************************************************************************************************************************

%定义最佳组合节点的适应度求解函数
function [objvalue] =obj_val(obj,m)%obj表示传进来的目标矩阵,m表示总共的节点数据,输出为适应度值
     [rows,cols]=size(obj);
     [rs,cs]=size(m);
     %将对应节点的模态值放进一个矩阵里
     val=zeros(rows);
     for i=1:rows
         sum2=0;%保存
         for j=1:cols %获得一个个体对应的目标模态矩阵
             temp(j,:)=m(obj(i,j),3:end);% 
         end
       %获得存储个体对应的模态矩阵的行数和列数
       [rt,ct]=size(temp);
   %计算目标模态矩阵的累积和
   for k1=1:ct
       for k2=1:ct
          sum2=sum2+abs(temp(:,k1)’*temp(:,k2));
       end  
   end
      a(i)=sum2;
     end
      objvalue=a,

end

********************************************************************************************************************************

主函数部分

*******************************************************************************************************************************

%改变n的个数,指定生成的目标节点个数
clc;
clear;
n=10;%需要组合的节点的个数
for i=1:10
fprintf(‘节点个数=%d时第%d次试验结果为\n’,n,i);
    ga_main(n)%调用遗传算法,求得目标节点

end

***************************************************************************************************************************************

    原文作者:遗传算法
    原文地址: https://blog.csdn.net/qq_37188465/article/details/79737921
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞