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

📄 matlab版遗传算法程序解tsp难题1.txt

📁 MATLAB版遗传算法解TSP问题
💻 TXT
字号:
% 基于MATLAB的遗传算法程序用于解决TSP难题
 
% 传统遗传算法:

M=36;popsize=36;Pm=0.15;Pc=0.9;Po=0.75;T=5000;Samen=500;
tic;
Smax=zeros(1,T+1);
num=0;
V=initiate(popsize,M,D);
S=fitness(popsize,M,V,D);
Smax(1)=max(S);
for i=1:T
    C=0;i
    V1=cross(V,popsize,M,Pc);
    V1=mutate(V1,popsize,M,Pm);
    V1=opt(V1,popsize,M,Po,D);
    S1=fitness(popsize,M,V1,D);
    S1m=mean(S1);
    G=find(S>=S1m);
    Vp=V(G,:);
    W=[V1;Vp];
    a=size(W,1);
    for j=1:a
        if W(j,1)==0
            continue;
        end
        for k=j+1:a
            if W(k,:)==W(j,:)
                W(k,1)=0;
            end
        end
    end
    W(find(W(:,1)==0),:)=[];
    d=size(W,1);
    Sw=fitness(d,M,W,D);
    [Smax(i+1),k]=max(Sw);
    t=W(k,:);Sw(k)=[];
    if Smax(i+1)==Smax(i)
        num=num+1;
    else 
        num=0;
    end
    if num==Samen
        break;
    end
    P=Sw./sum(Sw);
    Q=cumsum(P);
    R=rand(1,popsize-1);
    for j=1:popsize-1
        for k=1:d-1
            if R(j)<=Q(k)
                A(j)=k;
                break;
            end
        end
    end
    V=[t;W(A,:)];
    S=fitness(popsize,M,V,D);
    SNmax=max(S);
    for j=1:popsize
        if S(j)>=0.8*SNmax
            C=C+1;
        end
    end
    if C/popsize>=1;
        Pm=5*Pm;
    end
end
time=toc;Smin=1./Smax(1:i+1);
plot(1:i+1,Smin);
disp('最佳路线为'),genebest=t,
disp('其总路程为'),1/Smax(i+1),
disp('共用时'),time
disp('进化代数'),i,
[SMin,k]=min(Smin)

% 并行遗传算法:

M=36;popsize=36;Pm=0.15;Pc=0.9;Po=0.75;T=5000;Samen=100;
tic;
Smax=zeros(1,T+1);
num=0;
V=initiate(popsize,M,D);
S=fitness(popsize,M,V,D);
Smax(1)=max(S);
for i=1:T
    C=0;
    Vc=cross(V,popsize,M,Pc);
    Sc=fitness(popsize,M,Vc,D);
    Smc=mean(Sc);Sc=[];
    Vm=mutate(V,popsize,M,Pm);
    Sm=fitness(popsize,M,Vm,D);
    Smm=mean(Sm);Sm=[];
    Vo=opt(V,popsize,M,Po,D);
    Vp=parent(V,S,Smc,Smm);
    W=[Vc;Vm;Vp;Vo];Vc=[];Vm=[];Vp=[];Vo=[];
    a=size(W,1);
    for j=1:a
        if W(j,1)==0
            continue;
        end
        for k=j+1:a
            if W(k,:)==W(j,:)
                W(k,1)=0;
            end
        end
    end
    W(find(W(:,1)==0),:)=[];
    d=size(W,1);
    Sw=fitness(d,M,W,D);
    [Smax(i+1),k]=max(Sw);
    t=W(k,:);Sw(k)=[];
    if Smax(i+1)==Smax(i)
        num=num+1;
    else num=0;
    end
    P=Sw./sum(Sw);
    Q=cumsum(P);P=[];
    R=rand(1,popsize-1);
    for j=1:popsize-1
        for k=1:d-1
            if R(j)<=Q(k)
                A(j)=k;
                break;
            end
        end
    end
    V=[t;W(A,:)];W=[];Q=[];R=[];
    S=fitness(popsize,M,V,D);SNmax=max(S);
    for j=1:popsize
        if S(j)>=0.8*SNmax
            C=C+1;
        end
    end
    if C/popsize>=1;
        Pm=5*Pm;
    end
end
time=toc;Smin=1./Smax(1:i+1);
plot(1:i+1,Smin);
disp('最佳路线为'),genebest=t,
disp('其总路程为'),Smin(i+1),
disp('共用时'),time
disp('进化代数'),i,
[SMin,k]=min(Smin)


% 贪婪算子初始化群体:

function V=initiate(popsize,M,D)
d=D;
for i=1:M
    d(i,i)=inf;
end
for t=1:popsize
    do=d;i=t;V(t,1)=t;
    for j=1:M-1
        [dmin,k]=min(do(i,:));
        do(1:M,i)=inf*ones(M,1);
        i=k;
        V(t,j+1)=k;
    end
end


% 杂交算子:

function Vc=cross(V,popsize,M,Pc)
R1=rand(1,popsize); % selectout font
a=find(R1<Pc);
b=size(a,2);
R2=randn(1,b);
for i=1:b-1
    for j=1:b-i
        if R2(j)<R2(j+1)
            t1=R2(j);R2(j)=R2(j+1);R2(j+1)=t1;
            t2=a(j);a(j)=a(j+1);a(j+1)=t2;
        end
    end
end 
R3=rand(floor(b/2),M);
[maxr,k1]=max(R3,[],2);
[minr,k2]=min(R3,[],2);
A=[k1,k2];
for i=1:floor(b/2)
    if A(i,2)<A(i,1)
        t1=A(i,1);A(i,1)=A(i,2);A(i,2)=t1;
    end
end % selectout end
Vc=V;
for i=1:floor(b/2)
    t3=Vc(a(2*i-1),[A(i,1):A(i,2)]);
    t4=Vc(a(2*i),A(i,1):A(i,2));
    if (A(i,2)==M)&(A(i,1)==1)
        continue;
    end
    C1=(A(i,1)~=1);C2=(A(i,2)~=M);
    t5=[C2*(A(i,2)+1:M),C1*(1:A(i,1)-1)];
    Vc1=[Vc(a(2*i),t5),t4];
    Vc12=[Vc(a(2*i-1),t5),t3];
    for j=1:A(i,2)-A(i,1)+1
        ao=find(Vc1==t3(j));
        a1=find(Vc12==t4(j));
        Vc1(ao)=[];
        Vc12(a1)=[];
    end 
    Vc(a(2*i-1),:)=[Vc1(M-A(i,2)+1:end),t3,Vc1(1:M-A(i,2))];
    Vc(a(2*i),:)=[Vc12(M-A(i,2)+1:end),t4,Vc12(1:M-A(i,2))];
end


% 变异算子:

function Vm=mutate(V,popsize,M,Pm)
R1=rand(popsize,M);
Vm=V;
for i=1:popsize
    a=find(R1(i,:)<Pm);
    b=size(a,2);
    if b==0
        continue;
    end
    if b==1
        Vm1=Vm(i,:);
        t=Vm1(a);
        Vm1(a)=[];
        R2=rand(1,M-1);
        [Rmax,k]=max(R2);
        Vm(i,:)=[Vm1(1:k-1),t,Vm1(k:M-1)];
    else
        R2=rand(1,b);
        for j=1:b-1
            for k=1:b-j
                if R2(k)<R2(k+1)
                    t1=R2(k);R2(k)=R2(k+1);R2(k+1)=t1;
                    t2=Vm(i,a(k));Vm(i,a(k))=Vm(i,a(k+1));Vm(i,a(k+1))=t2;
                end
            end
        end
    end
end


% 父代较优个体:

function Vp=parent(V,S,Smc,Smm)
Sp=Smc;
if Smm>Smc
    Sp=Smm;
end
a=find(S>=Sp);
Vp=V(a,:);

% 两点法局部优化算子:

function Vo=opt(V,popsize,M,Po,D)
R=rand(1,popsize);
a=find(R<Po);
b=size(a,2);
Vo=V;
for k=1:b
    for i=1:M-3
        for j=i+2:M-1
            if D(i,j)+D(i+1,j+1)<=D(i,i+1)+D(j,j+1)
                Vo(a(k),i+1:j)=Vo(a(k),j:-1:i+1);
            end
        end
    end
end


% 计算适应值:

function S=fitness(L,M,V,D)
S=zeros(1,L);
V1=[V(:,2:M),V(:,1)];
for i=1:L
    for j=1:M
        S(i)=S(i)+D(V(i,j),V1(i,j));
    end
end
S=1./S;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -