找回密码
 注册
Simdroid-非首页
查看: 120|回复: 2

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

[复制链接]
发表于 2009-7-26 16:29:25 | 显示全部楼层 |阅读模式 来自 四川成都
基于遗传算法的有向图的边序列遍历算法Matlab源码
function [BESTX,BESTY,ALLX,ALLY,LC1,LC2]=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),:);
    [a,b,c,d]=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),:);
        [a,b,c,d]=CrossOver(A,B);
        newfarm(4*i-3,:)=a;%加入子代种群
        newfarm(4*i-2,:)=b;
        newfarm(4*i-1,:)=c;
        newfarm(4*i,:)=d;
    end
   
    FARM=[farm;newfarm];
   
%% 选择复制
    SER=randperm(5*N);
    FITNESS=zeros(1,5*N);
    fitness=zeros(1,N);
    for i=1:(5*N)
        x=FARM(i,:);
        [y,f]=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);
            [a,b,c,d]=CrossOver(A,B);
            farm(i,:)=a;
        end
    end
    disp(k);
    k=k+1;
end
发表于 2017-7-20 11:57:14 | 显示全部楼层 来自 广东深圳
Simdroid开发平台
谢谢楼主分享!!!!!
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-20 05:16 , Processed in 0.035465 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表