【Matlab】智能优化算法_蚁群优化算法ACO

news2025/2/4 21:49:38

【Matlab】智能优化算法_蚁群优化算法ACO

  • 1.背景介绍
  • 2.废话不多说,直接上代码
  • 3.文件结构
  • 4.详细代码及注释
    • 4.1 ACO.m
    • 4.2 createColony.m
    • 4.3 createGraph.m
    • 4.4 drawBestTour.m
    • 4.5 drawGraph.m
    • 4.6 drawPhromone.m
    • 4.7 ACO.mfitnessFunction.m
    • 4.8 rouletteWheel.m
    • 4.9 updatePhromone.m
  • 5.运行结果
  • 6.参考文献

1.背景介绍

自然界的蚁群在寻找食物的过程中,通过一种叫费洛蒙的物质,实现了相互的间接通信,协同寻找从蚁巢到食物源的最短路径。

通过对这些群体的智能行为进行抽象建模,研究者提出了蚁群优化(ant colony optimization, aco),为解决优化问题,特别是组合优化问题提供了强有力的方法。

蚂蚁通常是随机选择道路来寻找食物,但它们会感知地面上的信息素浓度,并倾向于向信息素浓度高的方向移动。费洛蒙是蚂蚁自己放出的,实现蚁群内间接通信的物质。短路径上的蚂蚁往返时间较短,单位时间内经过这条路径的蚂蚁较多,因此费洛蒙的积累速度比长路径快。因此,跟随的蚂蚁在交叉路口时,会感知先走的蚂蚁留下的信息,选择较短的路前进。这个积极的反馈使更多的蚂蚁沿着房子和食物之间最短的路径移动。由于其他道路上的费洛蒙会随着时间的推移蒸发,所有的蚂蚁最终都会走上最佳的道路。

在这里插入图片描述

2.废话不多说,直接上代码

3.文件结构

在这里插入图片描述

ACO.m							% 蚁群优化算法
createColony.m					% 初始化领地
createGraph.m					% 初始化图
drawBestTour.m					% 绘制最佳路线
drawGraph.m						% 绘制图形
drawPhromone.m					% 绘制Phromone
fitnessFunction.m				% 适应度函数
rouletteWheel.m					% 轮盘规则
updatePhromone.m				% 更新Phromone

4.详细代码及注释

4.1 ACO.m

clear all
close all
clc

%% Problem preparation 

% Create the graph 
[ graph ]  = createGraph();

% Draw the graph 
figure 
 
subplot(1,3,1)
drawGraph( graph); 


%% ACO algorithm 

%% Initial parameters of ACO 
maxIter = 500;
antNo = 50;

tau0 = 10 * 1 / (  graph.n * mean( graph.edges(:)  )  );  % Initial phromone concentration

tau = tau0 * ones( graph.n , graph.n); % Phromone matirx 
eta = 1./ graph.edges;  % desirability of each edge 

rho = 0.5; % Evaporation rate 
alpha = 1;  % Phromone exponential parameters 
beta = 1;  % Desirability exponetial paramter


%% Main loop of ACO 

bestFitness = inf;
bestTour = [];
for t = 1 : maxIter
    % Create Ants 
    
    colony = [];
    colony = createColony( graph, colony , antNo, tau, eta, alpha,  beta);
    
    
    % Calculate the fitness values of all ants 
    for i = 1 : antNo 
        colony.ant(i).fitness = fitnessFunction(colony.ant(i).tour , graph );
    end
    
    % Find the best ant (queen)
    allAntsFitness = [ colony.ant(:).fitness ];
    [ minVal , minIndex ] = min( allAntsFitness );
    if minVal < bestFitness 
        bestFitness = colony.ant(minIndex).fitness;
        bestTour = colony.ant(minIndex).tour;
    end
    
    colony.queen.tour = bestTour;
    colony.queen.fitness = bestFitness;
        
    % Update phromone matrix 
    tau = updatePhromone( tau , colony );  
    
    % Evaporation 
    tau  = ( 1 - rho ) .* tau;
    
    % Display the results 
    
    outmsg = [ 'Iteration #' , num2str(t) , ' Shortest length = ' , num2str(colony.queen.fitness)  ];
    disp(outmsg)
    subplot(1,3,1)
    title(['Iteration #' , num2str(t) ])
    % Visualize best tour and phromone concentration
    subplot(1,3,2)
    cla
    drawBestTour( colony, graph );
    
    
    subplot(1,3,3)
    cla
    drawPhromone( tau , graph );
   
   drawnow
end

4.2 createColony.m

function [ colony ] = createColony( graph, colony , antNo, tau, eta, alpha,  beta)

nodeNo = graph.n;

for i = 1 : antNo
    
    initial_node = randi( [1 , nodeNo] ); % select a random node 
    colony.ant(i).tour(1) = initial_node;
    
    for j = 2 : nodeNo % to choose the rest of nodes 
               currentNode =  colony.ant(i).tour(end);
               
               P_allNodes = tau( currentNode , :  ) .^ alpha .* eta( currentNode , :  )  .^ beta;
               P_allNodes(colony.ant(i).tour) = 0 ;  % assing 0 to all the nodes visited so far
               P = P_allNodes ./ sum(P_allNodes);
               
               nextNode = rouletteWheel(P); 
               colony.ant(i).tour = [  colony.ant(i).tour , nextNode ];
    end
    
    % complete the tour 
    colony.ant(i).tour = [ colony.ant(i).tour , colony.ant(i).tour(1)];
end

end

4.3 createGraph.m

function [ graph ]  = createGraph()
% To create the graph and calculate the distances between each nodes 
% x = [ 0.09 , 0.16 , 0.84 , 0.70 ];
% y = [0.17,   0.52,  0.92, 0.16];
% 
 
% 14 nodes
x = [16.47000,16.47000,20.09000,22.39000,25.23000,22,20.47000,17.20000,16.30000,14.05000,16.53000,21.52000,19.41000,20.09000];
 y = [96.10000,94.44000,92.54000,93.37000,97.24000,96.05000,97.02000,96.29000,97.38000,98.12000,97.38000,95.59000,97.13000,94.55000]

 
%     % 50 nodes
%   nodes = [7,9,2,0,0,1,7,1,2,51,42,31,5,12,36,52,27,17,13,57,62,42,16,8,7,27,30,43,58,58,37,38,46,61,62,63,32,45,59,5,10,21,5,30,39,32,25,25,48,56;52,49,64,26,30,47,63,62,33,21,41,32,25,42,16,41,23,33,13,58,42,57,57,52,38,68,48,67,48,27,69,46,10,33,63,69,22,35,15,6,17,10,64,15,10,39,32,55,28,37]
%   x = nodes(1,:);
%   y = nodes(2,:);

%  % 100 nodes
%  
%  nodes = [1380,2848,3510,457,3888,984,2721,1286,2716,738,1251,2728,3815,3683,1247,123,1234,252,611,2576,928,53,1807,274,2574,178,2678,1795,3384,3520,1256,1424,3913,3085,2573,463,3875,298,3479,2542,3955,1323,3447,2936,1621,3373,1393,3874,938,3022,2482,3854,376,2519,2945,953,2628,2097,890,2139,2421,2290,1115,2588,327,241,1917,2991,2573,19,3911,872,2863,929,839,3893,2178,3822,378,1178,2599,3416,2961,611,3113,2597,2586,161,1429,742,1625,1187,1787,22,3640,3756,776,1724,198,3950;939,96,1671,334,666,965,1482,525,1432,1325,1832,1698,169,1533,1945,862,1946,1240,673,1676,1700,857,1711,1420,946,24,1825,962,1498,1079,61,1728,192,1528,1969,1670,598,1513,821,236,1743,280,1830,337,1830,1646,1368,1318,955,474,1183,923,825,135,1622,268,1479,981,1846,1806,1007,1810,1052,302,265,341,687,792,599,674,1673,1559,558,1766,620,102,1619,899,1048,100,901,143,1605,1384,885,1830,1286,906,134,1025,1651,706,1009,987,43,882,392,1642,1810,1558]
%  x = nodes(1,:);
%   y = nodes(2,:);
  

  
  
graph.n = length(x); 

for i = 1 : graph.n
    graph.node(i).x = x(i);
    graph.node(i).y = y(i);
end

graph.edges = zeros(  graph.n , graph.n );

for i = 1 : graph.n
    for j = 1: graph.n
        x1 = graph.node(i).x ;
        x2 = graph.node(j).x;
        y1 = graph.node(i).y;
        y2 = graph.node(j).y;
        
        graph.edges(i,j) = sqrt(  (x1 - x2) ^2 + (y1 - y2)^2  ); 
        
    end
end


end

4.4 drawBestTour.m

function [ ] = drawBestTour(colony , graph)

queenTour = colony.queen.tour;
hold on
for i = 1 : length(queenTour) - 1
    
    currentNode = queenTour(i);
    nextNode =  queenTour(i+1);
    
    x1 = graph.node(currentNode).x;
    y1 = graph.node(currentNode).y;
    
    x2 = graph.node(nextNode).x;
    y2 = graph.node(nextNode).y;
    
    X = [x1 , x2];
    Y = [y1, y2];
    plot (X, Y, '-r');

end


for i = 1 : graph.n
    
    X = [graph.node(:).x];
    Y = [graph.node(:).y];
    
    plot(X, Y, 'ok', 'markerSize' , 10 , 'MarkerEdgeColor' , 'r' , 'MarkerFaceColor', [1, 0.6, 0.6]);
end

title('Best tour (the queen)')
box('on');

4.5 drawGraph.m

function [   ]  = drawGraph( graph )
% To visualize the nodes and edges of the graph
hold on 

for i = 1 : graph.n - 1
    for j =  i+1 : graph.n
    
        x1 = graph.node(i).x;
        y1 = graph.node(i).y;
        
        x2 = graph.node(j).x;
        y2 = graph.node(j).y;
        
        X = [x1 , x2]; 
        Y = [y1 , y2];
        
        plot( X , Y , '-k');
    end
end

for i = 1 : graph.n
    X = [graph.node(:).x];
    Y = [graph.node(:).y ];
    plot(X,Y, 'ok', 'MarkerSize', 10, 'MarkerEdgeColor' , 'r' , 'MarkerFaceColor' , [ 1, 0.6 , 0.6]);
end

title ('Al nodes and edges')
box('on')

end

4.6 drawPhromone.m



function [ ] = drawPhromone(tau , graph)

maxTau = max(tau(:));
minTau = min(tau(:));

tau_normalized = (tau - minTau) ./ (maxTau - minTau);

for i = 1 : graph.n -1 
    for j = i+1 : graph.n
        x1 = graph.node(i).x;
        y1 = graph.node(i).y;
        
        x2 = graph.node(j).x;
        y2 = graph.node(j).y;
        
        X = [x1 , x2];
        Y = [y1 , y2];
        
         tau(i , j);
 
        plot(X,Y, 'color' , [0, 0, (1-tau_normalized(i,j)),  tau_normalized(i,j)] , 'lineWidth', 10.*tau_normalized(i,j) + 1)
 
    end
end

for i = 1 : graph.n
    hold on
    X = [graph.node(:).x];
    Y = [graph.node(:).y];
    plot(X , Y , 'ok',  'MarkerSize', 10, 'MarkerEdgeColor', 'r', 'MarkerFaceColor', [1 .6 .6])
end


title('All Phromones')
box on

end

4.7 ACO.mfitnessFunction.m

function [ fitness ] = fitnessFunction ( tour , graph)


fitness = 0;

for i = 1 : length(tour) -1
    
    currentNode = tour(i);
    nextNode = tour(i+1);
    
    fitness = fitness + graph.edges( currentNode ,  nextNode );
    
end


end

4.8 rouletteWheel.m

function [ nextNode ] = rouletteWheel( P )
% Roulette wheel to choose one edge based on P values 
cumsumP = cumsum(P);

r = rand();

nextNode = find( r <= cumsumP );

nextNode = nextNode(1);


end

4.9 updatePhromone.m

function [ tau ] = updatePhromone(tau , colony)
% Update the phromone matrix. 
nodeNo = length (colony.ant(1).tour);
antNo = length( colony.ant(:) );

for i = 1 : antNo % for each ant
    for j = 1 : nodeNo-1 % for each node in the tour
        currentNode = colony.ant(i).tour(j);
        nextNode = colony.ant(i).tour(j+1);
        
        tau(currentNode , nextNode) = tau(currentNode , nextNode)  + 1./ colony.ant(i).fitness;
        tau(nextNode , currentNode) = tau(nextNode , currentNode)  + 1./ colony.ant(i).fitness;

    end
end

end

5.运行结果

在这里插入图片描述

在这里插入图片描述

6.参考文献

[1]M D,V M,A C. Ant system: optimization by a colony of cooperating agents.[J]. IEEE transactions on systems, man, and cybernetics. Part B, Cybernetics : a publication of the IEEE Systems, Man, and Cybernetics Society,1996,26(1).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/761762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu创建多用户并使用ssh链接

添加多个同时登录的用户 以下内容中的“username”根据自己需求自己定义 1.创建新用户 sudo useradd username2.给新用户添加管理权限 sudo vim /etc/sudoers打开的文件中添加如下内容 username ALL(ALL:ALL) ALL3.设置密码 输入&#xff1a; sudo passwd username打开的…

使用golang+antlr4构建一个自己的语言解析器

Goland 中Antlr4插件 在goland中安装Antlr4插件&#xff0c;用于识别输入的字符在在语法文件中生成的语法树的样子&#xff0c;大概就是如下的摸样 下载步骤&#xff1a; 1.点击文件中的设置选项 2.在插件目录下输入Antlr4搜索插件 3.点击安装即可 编写自己的语言语法文件…

DDD落地实践复盘 - 记理论培训事件风暴

DDD毕竟是一个指导方法&#xff0c;想落地扎根还是需要很多尝试的&#xff0c;笔者整理了一下在部门内践行推广之初的复盘小结&#xff0c;这可能是多数团队在推广DDD时都会遇到的问题&#xff0c;希望能对大家有所帮助。 DDD在部门进行两次尝试&#xff0c;一次是PPT培训&…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 三)

页面和自定义组件生命周期 在开始之前&#xff0c;先明确自定义组件和页面的关系&#xff1a; 自定义组件&#xff1a;Component装饰的UI单元&#xff0c;可以组合多个系统组件实现UI的复用。页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;E…

springMVC(四)—— 简化配置之不用再写@Repository类

这种简化配置的方法在下面这篇博客中已经用到了&#xff0c;但是因为太重要了&#xff0c;所以把他单独拿出来讲。 springMVC&#xff08;三&#xff09;—— 整合SSM框架_玛丽莲茼蒿的博客-CSDN博客IDEAtomcat 8。https://blog.csdn.net/qq_44886213/article/details/1316570…

【六袆 - Java】Kafka的由来,Kafka创始人,Kafka企业级应用开发;Kafka是一种分布式流处理平台和消息队列系统;

kafka是一门什么技术&#xff1f; Kafka是一种分布式流处理平台和消息队列系统&#xff0c;用于解决高吞吐量、低延迟的数据处理和消息传递问题。它最初由LinkedIn开发&#xff0c;旨在应对LinkedIn在大规模社交网络中处理实时数据流的需求。 它的由来 Kafka的历史可以追溯到…

git学习笔记 |常用命令

文章目录 Git学习笔记是什么&#xff1f;Git的工作机制Git和代码托管中心 Git的常用命令设置签名本地库初始化 git init添加到暂存区 git add将暂存区的文件提交到本地库 git commit查看历史版本 git log/git reflog版本穿梭 git reset Git的分支分支命令合并分支时代码冲突删除…

GBT51277-2018矿山立井冻结法施工及质量验收标准

为规范矿山立井冻结法施工及质量验收保障施T安全确保施工质量,制订本标准。 本标准适用于冰点高于一2C地下水流速小于5m/d、地温低于35C、冲积层厚度小于700m、冻结深度小于950m的立井井筒冻结法施T及质量验收。 立井冻结法施T工程承包合同和技术文件对施工质量要求不应低于本…

Android 自定义按键添加流程

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、驱动通过GPIO连接的按键二、Framework 层添加按键响应方法三、参考文献 一、驱动通过GPIO连接的按键 此类按键采用GPIO来连接&#xff0c;通过监测…

变压器试验介质损耗

试验目的 介质损耗因数 tanδ (% ) 是判断变压器绝缘状态的一种较有效的手段, 主要用来检 查变压器整体受潮、 油质劣化及严重的局部缺陷等, 但不一定能发现变压器局部受潮 等集中性局部缺陷。 试验设备 异频介质损耗测试仪 厂家&#xff1a; 湖北众拓高试 试验接线 (1) 介…

MacBook M1 VulnHub靶机搭建(arm Mac搭建x86 ova镜像)

个人博客: xzajyjs.cn 自从换了M1系的arm Mac后&#xff0c;原本的Vulnhub上的几乎所有靶场按照之前的方法都无法正常搭建了&#xff08;VirtualBox&#xff09;&#xff0c;在外网论坛上找了一遍&#xff0c;有一个相对麻烦一些的替代方法&#xff0c;但效果还是不错的&#x…

MFC演示双缓冲绘图算法

VC6新建一个单文档工程&#xff1b; 先添加一个小球类&#xff1b; 头文件和cpp文件如下&#xff1b; #if !defined(AFX_SPHERE_H__835B2B85_5B12_4409_AEC0_9C5062625DDE__INCLUDED_) #define AFX_SPHERE_H__835B2B85_5B12_4409_AEC0_9C5062625DDE__INCLUDED_#if _MSC_VER &…

MySQL-DQL-基本查询

数据库操作DQL语句 DQL DQL英文全称Data Query Language&#xff08;数据查询语言&#xff09;&#xff0c;用来查询数据库表中的记录关键词&#xff1a;SELECT语法 基本查询条件查询&#xff08;where&#xff09;分组查询&#xff08;group by&#xff09;排序查询&#xff0…

智能办公解决方案——电子标签

智能电子办公标签概要&#xff1a; 电子会议桌牌它外形美观大方&#xff0c;完全取代了传统塑料、纸质或铜制桌牌&#xff0c;是会议桌面显示设备的一大创新&#xff0c;与传统桌牌相比&#xff0c;具有信息化程度高、可反复使用的特点&#xff0c;是现代信息化会议的理想工具…

小物体检测、分割论文

文章目录 2023CaraNet: Context Axial Reverse Attention Network for Segmentation of Small Medical Objects 2023 CaraNet: Context Axial Reverse Attention Network for Segmentation of Small Medical Objects 摘要&#xff1a; 目的&#xff1a;准确、可靠地分割医学图…

Ubuntu 考虑采用新的 “统一默认安装 (unified default install)”

导读Ubuntu安装程序中的 “最小化安装” (Minimal installation) 是该发行版多年来最受欢迎的功能之一。 当用户选择 Ubuntu 的 “最小化安装” 选项时&#xff0c;可以在安装更少的预装应用程序情况下&#xff0c;获得完整、功能齐全的 Ubuntu 系统。 但这个功能可能要被砍掉…

【CSDN新星计划】初阶牛C/C++赛道——顺序程序设计(C语句②)

目录 3.2 最基本的语句——赋值语句 3.2 最基本的语句——赋值语句 在C程序中最常用的语句是:赋值语句和输入输出语句。其中最基本的是赋值语句程序中的计算功能大部分是由赋值语句实现的,几乎每一个有实用价值的程序都包括赋值语句。有的程序中的大部分语句都是赋值语句。先介…

进程间通信之命名管道

进程间通信之命名管道 命名管道1.命名管道概念2.创建一个命名管道2.1用命名管道实现通信2.2用命名管道实现server&client通信 命名管道 1.命名管道概念 管道应用的一个限制就是只能在具有共同祖先&#xff08;具有亲缘关系&#xff09;的进程间通信&#xff0c;这种通信可…

高并发的哲学原理(十)-- 理论无限容量:站在地球表面

前面两篇文章每一篇都花了我五十个小时以上&#xff0c;写的我是欲仙欲死&#xff0c;本文我们来务点虚&#xff0c;上上价值。 我们将从微服务架构讲起&#xff0c;一步一步追根溯源&#xff0c;找寻“分布式数据库”在另一个维度的投影&#xff0c;探寻基建、应用、服务、组织…

Java:运算符、位运算 的运算规则与用法详解

目录 运算符Math数学函数与常量类型转换强制类型转换自增和自减运算符关系运算符三元运算符 位运算& 与| 或^ 异或~ 按位取反<< >> 左移 右移运算符优先级 运算符 Math数学函数与常量 import java.lang.Math.*; public class Test{public static void main(S…