dijkstra算法matlab代码_蚁群算法+TSP问题+MATLAB代码

理论基础

fe30dc519e31fcaaeaa614494139a1a6.png

a011a01ff00c49130a98b0a6040c4eda.png

0372b9a073f12c25290ffddba868e4de.png

MATLAB代码

function [minLuJing,minLen] = yiQun(C)
%蚁群算法求解TSP问题
%输入城市间的横纵坐标C
%输出蚁群算法得到的较优值minLen及其遍历路径minLuJing
%测试环境:MATLAB2018b

%% 参数定义
n = size(C,1); %城市个数
m = floor(1.5*n); %蚂蚁个数
arfa = 1; %信息素的加权值
beta = 2; %能见度的加权值
rou = 0.5; %信息素的挥发率
dieDai = 200; %迭代次数

%% 城市之间距离
dC = zeros(n,n); 
for i = 1:n
    for j = i+1:n
        dC(i,j) = ((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^(1/2);
    end
end
dC = dC'+ dC + diag(diag(eps*ones(1,n)));

%% 初始化能见度矩阵
yita = 1 ./ dC; %能见度为两地距离的倒数
yita2 = yita.^beta; %加权之后

%% 初始化信息素矩阵
tao = 0;
for i = 1:n
    tao = tao + dC(i,n-i+1); %原文中是用贪心算法求初始值,这里偷懒随意找的一条简单路径
end
tao0 = m/tao; %初始信息素浓度太小:算法容易早熟,太大:信息素对路径指导作用会降低
tao = ones(n,n)*tao0;
tao = tao - diag(diag(tao));
tao2 = tao.^arfa; %加权之后

%% 迭代
for i = 1:dieDai
    %% 为每只蚂蚁随机分配出发城市
    chuFa = zeros(m,1);
    for k = 1:m
        chuFa(k) = floor(n * rand()) + 1;
    end
    
    %% 根据信息素浓度遍历
    bianLi = zeros(m,n); %遍历矩阵
    bianLi(:,1) = chuFa;
    for k = 1:m %m只蚂蚁 
        visited = zeros(n,1); %访问向量,若访问过,为1
        v = chuFa(k);
        visited(v) = 1;
        for r = 2:n %一只蚂蚁走过的路径
            Pab = zeros(n,1); %计算前往下个城市的概率
            for j = [1:v-1,v+1:n]
                if visited(j) == 1
                    Pab(j) = 0;
                else
                    Pab(j) = tao2(v,j) * yita2(v,j);
                end
            end
            Pab = Pab ./ sum(Pab);
            v = randsample(1:n,1,true,Pab');
            bianLi(k,r) = v;
            visited(v) = 1;
        end
    end
    
    %% 计算每只蚂蚁走过的路径长度
    bianLiLen = zeros(m,1);
    bianLi2 = [bianLi,chuFa]; %终点回到出发点
    for i = 1:m
        for j = 1:n
            bianLiLen(i) = bianLiLen(i) + dC(bianLi2(i,j),bianLi2(i,j+1));
        end
    end
    
    %% 信息素更新
    tao = (1-rou) .* tao;
    for i = 1:m
        for j = 1:n
            x = bianLi2(i,j);
            y = bianLi2(i,j+1);
            tao(x,y) = tao(x,y) + 1/bianLiLen(i);
        end
    end
    tao2 = tao .^arfa;
end

%% 取最小值为求得的最优解
[minLen,index] = sort(bianLiLen);
minLuJing = bianLi2(index(1),:);
minLen = minLen(1);
%yiQunTest.m
%调用蚁群算法
%测试环境:MATLAB2018b

%clear;
%C = [0,0;0,1;1,0;1,1]; %正方形
%[minLuJing,minLen] = yiQun(C);

clear;
C=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;3238 1229;
4196 1004;4312 790;4386 570;3007 1970;2562 1756;2788 1491;2381 1676;
1332 695;3715 1678;3918 2179;4061 2370;3780 2212;3676 2578;4029 2838;
4263 2931;3429 1908;3507 2367;3394 2643;3439 3201;2935 3240;3140 3550;
2545 2357;2778 2826;2370 2975];%31个省会坐标
[minLuJing,minLen] = yiQun(C);

参考理论

https://blog.csdn.net/qizijuesha/article/details/62055108​blog.csdn.net
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值