aiwa 发表于 2009-7-26 16:29:25

【原创】基于遗传算法的有向图的边序列遍历算法Matlab源码

基于遗传算法的有向图的边序列遍历算法Matlab源码
function =MYGA(K,N,Pm,VA,VB,P,D)
%% 此函数实现遗传算法,用于用于有向图的边遍历序列的优化
% GreenSim团队原创作品,转载请注明
% Email:greensim@163.com
% GreenSim团队主页:http://blog.sina.com.cn/greensim
% 欢迎访问GreenSim——算法仿真团队→http://blog.sina.com.cn/greensim
%% 输入参数列表
% K         迭代次数
% N         种群规模,要求是偶数
% Pm      变异概率
% VA      对偶图各边的起点在原图中对应的节点标号
% VB      对偶图各边的终点在原图中对应的节点标号
% P         对偶图各边对应的最短路径,细胞结构
% D         原图的邻接矩阵
%% 输出参数列表
% BESTX    K×1细胞结构,每一个元素是M×1向量,记录每一代的最优个体
% BESTY    K×1矩阵,记录每一代的最优个体的评价函数值
% ALLX   K×1细胞结构,每一个元素是M×N矩阵,记录全部个体
% ALLY   K×N矩阵,记录全部个体的评价函数值
%% 第一步:
M=length(VA);%决策变量的个数
%种群初始化,每一行是一个样本
farm=zeros(N,M);
for i=1:N
    x=randperm(M);
    farm(i,:)=x;
end
%输出变量初始化
ALLX=cell(K,1);%细胞结构,每一个元素是N×M矩阵,记录每一代的种群
ALLY=zeros(K,N);%K×N矩阵,记录每一代评价函数值
BESTX=cell(K,1);%细胞结构,每一个元素是1×M向量,记录每一代的最优个体
BESTY=zeros(K,1);%K×1矩阵,记录每一代的最优个体的评价函数值
k=1;%迭代计数器初始化
LC1=zeros(1,K);
LC2=zeros(1,K);
%% 第二步:迭代过程
while k<=K
%% 以下是交叉过程
    newfarm=zeros(4*N,M);
    Ser=randperm(N);%两两随机配对的配对表
    A=farm(Ser(1),:);
    B=farm(Ser(N),:);
    =CrossOver(A,B);
    newfarm(4*N-3,:)=a;%加入子代种群
    newfarm(4*N-2,:)=b;
    newfarm(4*N-1,:)=c;
    newfarm(4*N,:)=d;
   
    for i=1:(N-1)
      A=farm(Ser(i),:);
      B=farm(Ser(i+1),:);
      =CrossOver(A,B);
      newfarm(4*i-3,:)=a;%加入子代种群
      newfarm(4*i-2,:)=b;
      newfarm(4*i-1,:)=c;
      newfarm(4*i,:)=d;
    end
   
    FARM=;
   
%% 选择复制
    SER=randperm(5*N);
    FITNESS=zeros(1,5*N);
    fitness=zeros(1,N);
    for i=1:(5*N)
      x=FARM(i,:);
      =FIT1(x,VA,VB,P,D);
      FITNESS(i)=f;
    end
   
    for i=1:N
      f1=FITNESS(SER(5*i-4));
      f2=FITNESS(SER(5*i-3));
      f3=FITNESS(SER(5*i-2));
      f4=FITNESS(SER(5*i-1));
      f5=FITNESS(SER(5*i));
      if f1<=f2&&f1<=f3&&f1<=f4&&f1<=f5
            farm(i,:)=FARM(SER(5*i-4),:);
            fitness(i)=FITNESS(SER(5*i-4));
      elseif f2<=f1&&f2<=f3&&f2<=f4&&f2<=f5
            farm(i,:)=FARM(SER(5*i-3),:);
            fitness(i)=FITNESS(SER(5*i-3));
      elseif f3<=f1&&f3<=f2&&f3<=f4&&f3<=f5
            farm(i,:)=FARM(SER(5*i-2),:);
            fitness(i)=FITNESS(SER(5*i-2));
      elseif f4<=f1&&f4<=f2&&f4<=f3&&f4<=f5
            farm(i,:)=FARM(SER(5*i-1),:);
            fitness(i)=FITNESS(SER(5*i-1));
      else
            farm(i,:)=FARM(SER(5*i),:);
            fitness(i)=FITNESS(SER(5*i));
      end
    end
   
    %% 记录最佳个体和收敛曲线
    X=farm;
    Y=fitness;
    ALLX{k}=X;
    ALLY(k,:)=Y;
    minY=min(Y);
    meanY=mean(Y);
    pos=find(Y==minY);
    BESTX{k}=X(pos(1),:);
    BESTY(k)=minY;
    LC1(k)=minY;
    LC2(k)=meanY;
    %% 变异
    for i=1:N
      if Pm>rand&&pos(1)~=i
            A=farm(i,:);
            B=randperm(M);
            =CrossOver(A,B);
            farm(i,:)=a;
      end
    end
    disp(k);
    k=k+1;
end

小星星 发表于 2017-7-20 11:57:14

谢谢楼主分享!!!!!

玄天帝 发表于 2019-5-15 09:17:43

学习一下
页: [1]
查看完整版本: 【原创】基于遗传算法的有向图的边序列遍历算法Matlab源码