蚁群优化算法matlab实现

主函数:

clear
clc
m=5;%种群规模
[pop,pheromone]=initialization(m)%分别求出初始矩阵与信息素
antfirstcity=firstcity(m)%每只蚂蚁随机选择出发的城市
antcity=selectcity(pop,m,pheromone,antfirstcity)%每只蚂蚁每一步选择的城市
newpheromone=newpheromones(m,antcity,pop,pheromone)%更新信息素

函数initialization:

function [pop,pheromone]=initialization(m)
pop=[inf,3,1,2;3,inf,5,4;1,5,inf,2;2,4,2,inf];
newpop=pop;
f=ones(1,5);
c=0;
n=2;
i=1;
while n<5
    [min_newpop,index]=min(newpop,[],2);
    j=index(i);
    c=c+min_newpop(i);
    f(n)=j;
    newpop(i,:)=inf;
    newpop(:,i)=inf;
    i=j;
    n=n+1;
end
c=c+pop(i,1);
pheromone=m/c;
pheromone=ones(4,4)*pheromone;

函数firstcity:

function antfirstcity=firstcity(m)
city=['A','B','C','D'];
antfirstcity=char(zeros(1,m));
for i=1:m
    ran=rand();
    if ran<0.25
        antfirstcity(i)=city(1);
    elseif ran<0.5
        antfirstcity(i)=city(2);
    elseif ran<0.75
        antfirstcity(i)=city(3);
    else
        antfirstcity(i)=city(4);
    end
end

函数selectcity:

function antcity=selectcity(pop,m,pheromone,antfirstcity)
antcity=char(zeros(m,5));
antcity(:,1)=antfirstcity;
antcity(:,5)=antfirstcity;
for i=1:m
    city=['A','B','C','D'];
    newcity=city;
    for j=2:4
        for n=1:6-j
            if newcity(n) == antfirstcity(i)
                newcity(n)=[];
                break
            end
        end
        x=antfirstcity(i)-'A'+1;
        y(1:5-j)=newcity(1:5-j)-'A'+1;
        p1=zeros(1,5-j);
        for v=1:5-j
            p1(v)=pheromone(x,y(v))*(1/pop(x,y(v)))^2;
        end
        p=p1/sum(p1);
        q=rand();
        if j==2
            if q<p(1)
                antcity(i,2)=newcity(1);
                antfirstcity(i)=newcity(1);
            elseif q<p(2)
                antcity(i,2)=newcity(2);
                antfirstcity(i)=newcity(2);
            else
                antcity(i,2)=newcity(3);
                antfirstcity(i)=newcity(3);
            end
        elseif j==3
            if q<p(1)
                antcity(i,3)=newcity(1);
                antfirstcity(i)=newcity(1);
            else
                antcity(i,3)=newcity(2);
                antfirstcity(i)=newcity(2);
            end
        else
            antcity(i,4)=newcity(1);
            antfirstcity(i)=newcity(1);
        end
    end
end

函数newpheromones:

function newpheromone=newpheromones(m,antcity,pop,pheromone)
num=zeros(m,5);
num(:)=antcity(:)-'A'+1;
c=zeros(m,1);
for r=1:m
    for t=1:4
        c(r)=c(r)+pop(num(r,t),num(r,t+1));
    end
end

for mm=1:4
    for nn=1:4
        sumnum=0;
        for i=1:m
            for j=1:4
                if num(i,j)==mm
                    if num(i,j+1)-num(i,j)==nn-mm ;
                        sumnum=sumnum+1/c(i);
                    end
                end
            end
        end
        newpheromone(mm,nn)=0.5*pheromone(mm,nn)+sumnum;
    end
end
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值