简单易懂,蚁群算法解决旅行商问题

智能计算之蚁群算法(ACO)介绍 1. 简介 2. 基本思想 3. 研究进展 4. 基本流程 (1)路径构建 (2)信息素更新 ​5. 应用举例 6. 改进版 6.1 精华蚂蚁系统 6.2 基于排列的蚂蚁系 6.3 最大最小蚂蚁系 6.4 蚁群系统 7. 参数设置​编辑 8. 练习题... 阅读详情
AI摘要

探讨了旅行商问题(TSP)的群蚁算法解决策略,介绍了算法原理、流程及C#实现,适合对路径优化感兴趣的技术人员。

转载声明:

原文把蚁群解决旅行商问题写的很清楚,只不过本人认为原文中有一些小错误,特此更改(文中红色加粗字体为改正处),代码中出现的一些算法的小问题也进行了更正(比如代码中的贪心算法),代码也附在下面,谢谢博主的分享。

原文地址:http://www.cnblogs.com/asxinyu/p/Path_Optimization_Tsp_Problem_Ant_System_CSharp.html#opennewwindow

修改后的代码:https://github.com/DiamondTan/ACOTSP

1.关于旅行商(TSP)问题及衍化

  旅行商问题(Traveling Saleman Problem,TSP)是车辆路径调度问题(VRP)的特例,由于数学家已证明TSP问题是NP难题,因此,VRP也属于NP难题。旅行商问题(TSP)又译为旅行推销员问题、货郎担问题,简称为TSP问题,是最基本的路线问题,该问题是在寻求单一旅行者由起点出发,通过所有给定的需求点之后,最后再回到原点的最小路径成本。——旅行商问题百科

  很明显,当节点数很少时,大多数人都会想到,问题很简单,直接穷举就OK了,但实际问题中,节点数往往很大,变得不可能。例如:对于一个仅有16个城市的旅行商问题,如果用穷举法来求问题的最优解,需比较的可行解有:15!/2=653,837,184,000个。在1993年,使用当时的工作站用穷举法求解此问题需时92小时。即使现在计算机速度快,但是面对复杂的问题,仍然不够。这就是所谓的“组合爆炸”,指数级的增长,所以科学家逐步寻找近似算法或者启发式算法,目的是在合理的时间范围内找到可接受的最优解。

  TSP问题解决算法的发展可以分为3个部分:

1).经典精确算法:穷举法、线性规划算法、动态规划算法、分支定界算法等运筹学中的传统算法,这些算法复杂度一般都很大,只适用于求解小规模问题。

2).近似算法:当问题规模较大时,其所需的时间成级数增长,这是我们无法接受的,算法求解问题的规模受到了很大的限制,一个很自然的想法就是牺牲精确解法中的最优性,去寻找一个好的时间复杂度我们可以容忍的,同时解的质量我们可以接受的算法.基于这一思想所设计出的算法统称为近似算法。如插入算法,最邻近算法等。

3).智能算法:随着科学技术和生产的不断发展,许多实际问题不可能在合理的时间范围内找到全局最优解,这就促使了近代最优化问题求解方法的产生。随着各种不同搜索机制的启发式算法相继出现,如禁忌搜索、遗传算法、模拟退火算法、人工神经网络、进化策略、进化编程、粒子群优化算法、蚁群优化算法和免疫计算等,掀起了研究启发式算法的高潮。

  具体每一种算法不再详细描述,大家可以针对性的寻找相应资料进行了解。

  TSP问题在实际的生产生活中,更加实际环境不同,有很多衍生的经典问题。车辆路径调度(VRP)扩展问题是经典VRP加入各种约束条件后而形成的。例如需求约束形成的需求随机的车辆路径问题(SVRP);加入时间约束得到的带时间窗的车辆路径题(VRPTW);加入距离约束的距离约束车辆路径问题(DVRP);根据其它条件的不同,还有多配送中心车辆路径问题(MDVRP)、可切分的车辆路径问题(SDVRP);先配送再收集车辆路径问题(VRPB)、配送收集车辆路径问题(VRPPD);信息不完全的模糊车辆路径问题(FVRP)[3]。

2.群蚁算法基本原理

2.1 算法综述

  对于VRP问题,求解算法大致可分为精确算法和人工智能算法两大类。精确性算法基于严格的数学手段,在可以求解的情况下,解的质量较好。但是由于算法严格,运算量大,特别是大规模的问题几乎无法求解。所以其应用只能是小规模的确定性问题,面对中小规模问题,人工智能算法在精度上不占优势。但规模变大时,人工智能方法基本能在可接受时间里,找到可接受的满意解,这是精确算法难以做到的。由于的实际问题,各种约束错综复杂,人工智能算法显示出了巨大的优越性,也正因为如此,实际应用中,人工智能算法要更广泛。求解车辆路径调度问题的精确算法有动态规划法、分枝定界法等。并开始寻求所得结果可接受的启发式算法,以处理大规模实际问题,一些其他学科的新一代优化算法相继出现,如禁忌搜索算法,遗传算法,人工神经网络算法,以及现在研究较多的蚁群算法等。

2.2 群蚁算法的原理

  蚁群算法是受到对真实蚂蚁群觅食行为研究的启发而提出。生物学研究表明:一群相互协作的蚂蚁能够找到食物和巢穴之间的最短路径,而单只蚂蚁则不能。生物学家经过大量细致观察研究发现,蚂蚁个体之间的行为是相互作用相互影响的。蚂蚁在运动过程中,能够在它所经过的路径上留下一种称之为信息素的物质,而此物质恰恰是蚂蚁个体之间信息传递交流的载体。蚂蚁在运动时能够感知这种物质,并且习惯于追踪此物质爬行,当然爬行过程中还会释放信息素。一条路上的信息素踪迹越浓,其它蚂蚁将以越高的概率跟随爬行此路径,从而该路径上的信息素踪迹会被加强,因此,由大量蚂蚁组成的蚁群的集体行为便表现出一种信息正反馈现象。某一路径上走过的蚂蚁越多,则后来者选择该路径的可能性就越大。蚂蚁个体之间就是通过这种间接的通信机制实现协同搜索最短路径的目标的。我们举例简单说明蚂蚁觅食行为:

    

    如上图a,b,c的示意图:

    a图是原始状态,蚂蚁起始点为A,要到达E,中途有障碍物,要绕过才能到达。BC和BH是绕过障碍物的2条路径(假设只有2条)。各个路径的距离d已经标定。

    b图是t=0时刻蚂蚁状态,各个边上有相等的信息素浓度,假设为15;

    c图是t=1时刻蚂蚁经过后的状态,各个边的信息素浓度,有变化;因为大量蚂蚁的选择概率会不一样,而选择概率是和路径长度相关的。所以越短路径的浓度会越来越大,经过此短路径达到目的地的蚂蚁也会比其他路径多。这样大量的蚂蚁实践之后就找到了最短路径。所以这个过程本质可以概括为以下几点:

    1.路径概率选择机制信息素踪迹越浓的路径,被选中的概率越大

    2.信息素更新机制路径越短,路径上的信息素踪迹增长得越快

    3.协同工作机制蚂蚁个体通过信息素进行信息交流。

    从蚂蚁觅食的原理可见,单个个体的行为非常简单蚂蚁只知道跟踪信息素爬行并释放信息素,但组合后的群体智能又非常高蚂蚁群能在复杂的地理分布的清况下,轻松找到蚁穴与食物源之间的最短路径。这种特点恰恰与元启发算法的特点相一致,蚁群优化算法正是受到这种生态学现象的启发后加以模仿并改进而来,觅食的蚂蚁由人工蚁替代,蚂蚁释放的信息素变成了人工信息素,蚂蚁爬行和信息素的蒸发不再是连续不断的,而是在离散的时空中进行。

  上述例子如果不好理解,我在这里贴几张PPT,个人感觉非常不错,也是我找了很多资料觉得最好理解的【来源是大连理工大学谷俊峰】,点击这里提供下载:蚁群算法基本知识.rar。

    从深层意义上来讲,蚁群算法作为优化的方法之一,属于人工群集智能领域。人工群集智能,大都受自然群集智能如昆虫群和动物群等的启发而来。除了具有独特的强有力的合作搜索能力外,还可以利用一系列的计算代理对问题进行分布式处理,从而大大提高搜索效率。

3.群蚁算法的基本流程

  我们还是采用大连理工大学谷俊峰的PPT来说明问题,重要公式进行截图计算和解释,对PPT难以理解的地方进行单独解释:

3.1 基本数学模型

  首先看看基本TSP问题的基本数学模型:

  问题其实很简单,目标函数就是各个走过路径的总长度,注意的就是距离矩阵根据实际的问题不一样,长度是不一样的。

3.2 群蚁算法说明

  在说明群蚁算法流程之前,我们对算法原理和几个注意点进行描述:

1.TSP问题的人工蚁群算法中,假设m只蚂蚁在图的相邻节点间移动,从而协作异步地得到问题的解。每只蚂蚁的一步转移概率由图中的每条边上的两类参数决定:1. 信息素值也称信息素痕迹。2.可见度,即先验值。
2.信息素的更新方式有2种,一是挥发,也就是所有路径上的信息素以一定的比率进行减少,模拟自然蚁群的信息素随时间挥发的过程;二是增强,给评价值“好”(有蚂蚁走过)的边增加信息素。
3.蚂蚁向下一个目标的运动是通过一个随机原则来实现的,也就是运用当前所在节点存储的信息,计算出下一步可达节点的概率,并按此概率实现一步移动,逐此往复,越来越接近最优解。
4.蚂蚁在寻找过程中,或者找到一个解后,会评估该解或解的一部分的优化程度,并把评价信息保存在相关连接的信息素中。 

3.3 群蚁算法核心步骤

  更加我们前面的原理和上述说明,群蚁算法的2个核心步骤是 路径构建 和 信息素更新。我们将重点对这2个步骤进行说明。

3.3.1 路径构建

  每个蚂蚁都随机选择一个城市作为其出发城市,并维护一个路径记忆向量,用来存放该蚂蚁依次经过的城市。蚂蚁在构建路径的每一步中,按照一个随机比例规则选 择下一个要到达的城市。随机概率是按照下列公式来进行计算的:

  上述公式就是计算 当前点 到 每一个可能的下一个节点 的概率。分子是 信息素强度 和 能见度 的幂乘积,而分母则是所有 分子的和值。这个刚开始是很不容易理解的,我们在最后实例计算的时候,可以看得很清楚,再反过来理解公式。注意每次选择好节点后,就要从可用节点中移除选择的节点。

3.3.2 信息素更新

  信息素更新是群蚁算法的核心。也是整个算法的核心所在。算法在初始期间有一个固定的浓度值,在每一次迭代完成之后,所有出去的蚂蚁回来后,会对所走过的路线进行计算,然后更新相应的边的信息素浓度。很明显,这个数值肯定是和蚂蚁所走的长度有关系的,经过一次次的迭代, 近距离的线路的浓度会很高,从而得到近似最优解。那我们看看信息素更新的过程。

  初始化信息素浓度C(0),如果太小,算法容易早熟,蚂蚁会很快集中到一条局部最优路径上来,因为可以想想,太小C值,使得和每次挥发和增强的值都差不多,那么 随机情况下,一些小概率的事件发生就会增加非最优路径的信息素浓度;如果C太大,信息素对搜索方向的指导性作用减低,影响算法性能。一般情况下,我们可以使用贪婪算法获取一个路径值Cnn,然后根据蚂蚁个数来计算C(0) = m/Cnn ,m为蚂蚁个数

  每一轮过后,问题空间中的所有路径上的信息素都会发生蒸发,然后,所有的蚂蚁根据自己构建的路径长度在它们本轮经过的边上释放信息素,公式如下: 

  信息素更新的作用:
1.信息素挥发(evaporation)信息素痕迹的挥发过程是每个连接上的 信息素痕迹的浓度自动逐渐减弱的过程,这个挥发过程主要用于避 免算法过快地向局部最优区域集中,有助于搜索区域的扩展。
2.信息素增强(reinforcement)增强过程是蚁群优化算法中可选的部 分,称为离线更新方式(还有在线更新方式)。这种方式可以实现 由单个蚂蚁无法实现的集中行动。基本蚁群算法的离线更新方式是 在蚁群中的m只蚂蚁全部完成n城市的访问后,统一对残留信息进行 更新处理。

3.3.3 迭代与停止

  迭代停止的条件可以选择合适的迭代次数后停止,输出最优路径,也可以看是否满足指定最优条件,找到满足的解后停止。最重要的是,我刚开始理解这个算法的时候,以为每一只蚂蚁走一条边就是一次迭代,其实是错的。这里算法每一次迭代的意义是:每次迭代的m只蚂蚁都完成了自己的路径过程,回到原点后的整个过程。

4.群蚁算法计算实例

  使用PPT中的一个案例,非常直观,对几个符号错误进行了修改,主要是计算概率的乘号,结果没有错误:

这里蚂蚁2的应该选择城市A。

步骤四中的τAC 计算应该等于0.233

  过程总体还是比较简单的,注意理解公式,然后把公式和实例结合起来看,最好是拿笔自己手动画一画,容易理解。下面我们来看看如何编程实现TSP问题的群蚁算法代码。

5.TSP问题的群蚁算法C#代码实现

  百度搜索相关群蚁算法的代码,基本都是matlab的,在优快云有一个asp.net + C#版本的实现,不过我看了之后果断决定重写,封装不够完善,同时思路也不清楚。所以自己写的过程,理解也更清楚了。经过我的简单更改,目前还说得过去吧,当然后续我还打算继续进行研究,所以先把基本程序的过程写下来,当然是利用了C# 的面向对象特性,看了别人写的 完全面向过程,理解真的很费劲。简单说说实现过程和代码吧。

5.1 群蚁算法系统基类

  我们封装了一个基础的BaseTspAntSystem类,包括了一些基本属性和计算过程,后续相关改进版本可以进行直接继承。当然设计可能有缺陷,先这样进行,碰到需求再改吧。 BaseTspAntSystem类的主要属性如下:

/// <summary>城市数量,N</summary>
public Int32 NCity { get; set; }
/// <summary>蚂蚁数量,M</summary>
public Int32 AntCount { get; set; }
/// <summary>信息启发式因子a,表征信息素重要程度的参数</summary>
public Double Alpha { get; set; }
/// <summary>期望启发式因子b,表征启发式因子重要程度的参数</summary>
public Double Beta { get; set; }
/// <summary>信息素蒸发的参数p</summary>
public Double Rho { get; set; }
/// <summary>距离数据,不一定是对称矩阵,D=d(ij)</summary>
public Double[,] Distance { get; set; }
/// <summary>最大迭代次数NC</summary>
public Int32 NcMax { get; set; }
/// <summary>最好的解个数,取最优解列表中个数的数目,可以作为备用方案</summary>
public Int32 BetterPlanCount { get; set; }
private List<Ant> planList;
/// <summary>信息素浓度</summary>
public double[,] InfoT { get; set; }
 

 

  基类有一个构造函数,对系统的初始化就是传入基本的参数,并对相关列表进行初始化,代码如下:

 

/// <summary>构造函数</summary>
/// <param name="m">蚂蚁数量</param>
/// <param name="a">信息启发式因子</param>
/// <param name="b">期望启发式因子</param>
/// <param name="p">信息素蒸发的参数</param>
/// <param name="distance">距离数据</param>
/// <param name="NCMax">最大迭代次数</param>
/// <param name="planCount">最优解的个数</param>
public BaseTspAntSystem(double[,]distance,Int32 m,double a,double b,double p,int NCMax,int planCount=10)
{
    this.AntCount = m;
    this.Alpha = a;
    this.Beta = b;
    this.Rho = p;
    this.Distance = distance;
    this.NcMax = NCMax;
    this.BetterPlanCount = planCount;
    planList = new List<Ant>();
    NCity = Distance.GetLength(0);//所有的城市个数
    InfoT = new double[NCity, NCity];//初始化信息素矩阵
}

 

   核心的是求解过程,完全按照迭代次数要求进行迭代进行,过程就是概率选择和信息素更新,我们辅助的用到了Ant蚂蚁类,目的就是让程序更加独立和容易理解。Ant类里面有蚂蚁路径寻找过程的所有信息。下一节将进行介绍。求解过程代码如下面,看看注释和对比算法进行:

 

public void TspSolution()
{
    #region 初始化计算
    //计算初始信息素的值,可直接指定,或者贪婪算法计算
    double Cnn = GreedyAlgorithm();
    double t0 = (double)AntCount / Cnn;//信息素初始化
    for (int i = 0; i < NCity; i++)
    {
        for (int j = 0; j < NCity; j++)
        {
            //每条可行的路径的信息素初始值
            if (Distance[i, j] != 0) InfoT[i, j] = t0;
        }
    }
    //为每个蚂蚁随机选择出发城市,List的长度为蚂蚁个数,内部List长度为路径    
    List<Int32> allNodes = new List<int>();
    for (int i = 0; i < NCity; i++) allNodes.Add(i);//所有路径节点
    //迭代次数
    Int32 NC = 0;
    #endregion

    while (NC<NcMax)
    {
        //生成蚂蚁及初始访问城市,并设置对应禁忌表和路径列表
        List<Ant> antList = new List<Ant>();
        for (int i = 0; i < AntCount; i++)
            antList.Add(new Ant(i, allNodes.DeepCopy(), false));
        //所有蚂蚁依次寻找下一个节点,直到本轮完成
        antList.ForEach(n => n.NextCityUntilFinished(InfoT,Distance,Alpha,Beta,Rho));               
        //统计最优解
        planList.AddRange(antList);//先添加
        planList = planList.OrderBy(n => n.CpathLength).ToList();//排序
        //取出前面指定的几条最短路径
        if (planList.Count > BetterPlanCount) 
            planList.RemoveRange(BetterPlanCount, planList.Count - BetterPlanCount);
        NC++;
        //更新信息素的值:循环所有路径,依次进行添加
        //先挥发
        for (int i = 0; i < NCity; i++) //挥发过程
        {
            for (int j = 0; j < NCity; j++) InfoT[i, j] *= (1.0 - Rho);
        }
        //再增强,循环所有蚂蚁
        foreach (var item in antList)
        {
            var temp =  1.0 / item.CpathLength;
            foreach (var edge in item.Edge) InfoT[edge.Key, edge.Value] += temp;    
        }
    }
}

 

5.2 蚂蚁功能类

   根据算法的描述,m只蚂蚁同时进行自己的工作和寻找路程,是一个并行的过程,因此也在单次过程中,蚂蚁都是独立的。蚂蚁的每一次迭代,过程都比较清楚,寻找路径过程,注意维护一些可用的节点列表,以及最后一条路径的处理。看看蚂蚁类的主要属性和构造函数:

 

public class Ant
{
    #region 属性
    /// <summary>蚂蚁编号</summary>
    public Int32 Id { get; set; }
    /// <summary>当前蚂蚁已经走过的路径节点列表,也就是禁忌表
    /// 最后1个就是当前所处的位置
    /// </summary>
    public List<Int32> PathNodes { get; set; }
    /// <summary>当前蚂蚁下一步可供选择的节点列表</summary>
    public List<Int32> selectNodes { get; set; }
    /// <summary>该蚂蚁旅行的总长度</summary>
    public Double CpathLength { get; set; }
    /// <summary>当前蚂蚁走过的边,key为起点,value为终点</summary>
    public Dictionary<int, int> Edge;
    private Random rand;
    int N;
    #endregion

    #region 构造函数
    /// <summary>构造函数</summary>
    /// <param name="id">蚂蚁编号</param>
    /// <param name="allNodes">所有节点名称列表</param>
    /// <param name="isFixStart">是否固定起点</param>
    public Ant(Int32 id,List<Int32> allNodes,Boolean isFixStart)
    {
        this.Id = id;
        this.selectNodes = allNodes;
        this.PathNodes = new List<int> ();
        //isFixStart为false给蚂蚁随机1个起点,否则都为0
        if (isFixStart)
        {
            this.PathNodes.Add(0);
            this.selectNodes.RemoveAt(0);
        }
        else
        {
            var temp = new Random().Next(0, allNodes.Count - 1);
            this.PathNodes.Add(temp);
            this.selectNodes.RemoveAt(temp);
        }
        this.CpathLength = 0;
        rand = new Random();
    }
    #endregion
}

  Ant类的核心是寻找下一个城市节点的过程,以及循环直到所有路径都完成。如下面代码,是一个循环过程:

 

#region 蚂蚁行为-依次按概率选择下一个城市,直到走完
public void NextCityUntilFinished(double[,] info,double[,] distance,double a,double b,double p)
{
    N = distance.GetLength(0);
    Edge = new Dictionary<int, int>();//经过的边:起点-终点
    //为空,就不需要计算了
    while(selectNodes.Count >0)
    {
        double sumt = 0;//分母的和值
        Int32 current = PathNodes.Last();
        //依次计算当前点到其他点可选择点的 值
        Dictionary<Int32, double> dic = new Dictionary<int, double>();
        foreach (var item in selectNodes)
        {
            var temp = Math.Pow(info[current, item], a) * Math.Pow(1.0 / distance[current, item], b);
            sumt += temp;
            dic.Add(item, temp);
        }
        //计算各个点的概率
        var ratio = dic.ToDictionary(n => n.Key, n => n.Value / sumt);
        //产生1个随机数,并按概率确定下一个城市
        Int32 nextCity = GetNextCityByRandValue(ratio, rand.NextDouble());
        //修改列表
        this.PathNodes.Add(nextCity);
        this.selectNodes.Remove(nextCity);
        this.CpathLength += distance[current, nextCity];
        Edge.Add(current, nextCity);//信息素增强辅助计算
    }
    //最后1条路径的问题,额外增加,直接 回原点
    this.CpathLength += distance[PathNodes.Last(), PathNodes.First()];
    Edge.Add(PathNodes.Last(), PathNodes.First());
    this.PathNodes.Add(PathNodes.First());//最后才添加           
}

/// <summary>按照dic中按照顺序的节点的概率值,和随机数rnd的值,确定哪一个为下一个城市</summary>
/// <param name="dic"></param>
/// <param name="rnd"></param>
/// <returns></returns>
int GetNextCityByRandValue(Dictionary<Int32,double> dic,double rnd)
{
    double sum = 0;
    foreach (var item in dic)
    {
        sum += item.Value;
        if (rnd < sum) return item.Key;
        else continue;
    }
    throw new Exception("无法选择城市");
}
#endregion

  后面的GetNextCityByRandValue是一个辅助函数,进行随机概率值的选择,确定是否选择哪一个节点。

6.资源与参考文献

  基本TSP问题的C#代码下载:AcaSolution-150913.rar

  如果下载有问题,请到本文原文下载:群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法 

[1].什么是NP问题.http://blog.youkuaiyun.com/yangtrees/article/details/8107563

[2].文永军.旅行商问题的两种智能算法[M].西安电子科技大学,2010年

[3].杨瑞臣.有时间窗和在前约束车辆路径问题的蚁群优化[M].西安建筑科技大学,2005.

[4].谷俊峰.智能算法-第七章:蚁群算法 PPT,大连理工大学,下载:蚁群算法基本知识.ra

蚁群算法 蚁群算法简介 蚁群算法(Ant Algorithm 简称AA)是近年来刚刚诞生的随机优化方法,它是一种源于大自然的新的仿生类算法。由意大利学者Dorigo最早提出,并首先使用于解决TSP(旅行商问题)。蚂蚁算法主要是通过蚁群之间的信息传递而达到寻优的目的,最初又称蚁群优化方法(Ant Colony optimization 简称ACO)。由于模拟仿真中使用了人工蚂蚁的概念,因此又称蚂蚁系统(Ant... 阅读详情

相关推荐

蚁群算法学习

蚁群算法

qq_50086023的博客 3245

【人工智能】蚁群算法(密恐勿入)

蚁群算法是一种模拟蚂蚁觅食行为的启发式算法,被广泛应用于优化问题的求解。蚁群算法的基本思想是,将一群蚂蚁放在问题的解空间上,让它们通过信息素的传递和挥发,逐渐找到最优解。首先,我们先回顾一下,什么是TSP旅行商问题:假设有一位邮递员,他从初始城市(任意一城市)出发,途径所有城市并回到初始城市,那么他一共会有n−1!(n-1)!n−1条路径。从中找出那条最短路径,这就是TSP旅行商问题。如果我们遍历的去找那个最短路径,那么随着城市的增加,计算量大大增加。

qq_25218219的博客 8万+

ACO蚁群算法解决TSP旅行商问题

前言 蚁群算法也是一种利用了大自然规律的启发式算法,与之前学习过的GA遗传算法类似,遗传算法是用了生物进行理论,把更具适应性的基因传给下一代,最后就能得到一个最优解,常常用来寻找问题的最优解。当然,本篇文章不会主讲GA算法的,想要了解的同学可以查看,我的遗传算法学习和遗传算法在走迷宫中的应用。话题重新回到蚁群算法,蚁群算法是一个利用了蚂蚁寻找食物的原理。不知道小时候有没有发现,当一个蚂蚁发现了地

走在前往架构师的路上 1万+

蚁群算法(ACO)学习笔记

蚁群算法笔记 #1.蚁群算法简介:

I am a slow walker, but I never walk backwards! 9056

蚁群算法——旅行商问题(TSP)优化

代码: %% 旅行商问题(TSP)优化 %% 清空环境变量 clear all clc %% 导入数据 load citys_data.mat %% 计算城市间相互距离 fprintf('Computing Distance Matrix... \n'); n = size(citys,1); D = zeros(n,n); for i = 1:n for j = 1:n ...

Potattto的博客 5035

计算智能--基于蚁群算法的旅行商问题

一、旅行商问题概述 旅行商问题又称TSP问题,即给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。旅行商问题是一个经典的组合优化问题。早期的研究者使用精确算法求解该问题,常用的方法包括:分枝定界法、线性规划法、动态规划法等。但是,随着问题规模的增大,精确算法将变得无能为力,因此,在后来的研究中,国内外学者重点使用近似算法或启发式算法,主要有遗传算法、模拟退火法、蚁...

weixin_42659381的博客 2097

蚁群算法解决旅行商问题Python

旅行商问题(英语:Travelling salesman problem, TSP)是组合优化中的一个NP困难问题,在运筹学和理论电脑科学中非常重要。问题内容为“给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。” 蚁群在外出觅食或者探索的时候,往往会留下弗洛蒙(信息素),每当该蚂蚁在此路径有良好的发现,就会将弗洛蒙浓度加大;反之,弗洛蒙浓度则会挥发,蚁群算法就是根据这一特点而被设计出来的。 首先我们对蚂蚁的功能进行定义: 1. 蚂蚁在一个旅程中不会访问相同的城市 2. 蚂

早安不安的博客 5402

MATLAB蚁群算法解决旅行商问题

MATLAB蚁群算法解决旅行商问题 问题 一个商品推销员要去以下城市推销商品,该推销员从A城市出发,需要经过所有城市后,回到出发地。应如何选择行进路线,以使总的行程最短。 城市 经度 纬度 A 66.8300000000000 25.3600000000000 B 61.9500000000000 26.3400000000000 C 40 44.3900000000000 D 24.3900000000000 14.6300000000000 E 17.0700000000

bjtu_lmc的博客 1229

【旅行商问题】蚁群算法解决旅行商问题【Matlab】

【旅行商问题】蚁群算法解决旅行商问题【Matlab】@TOC 一、旅行商问题 1、问题描述 旅行商问题(TravelingSalesmanProblem,TSP)是一个经典的组合优化问题。经典的TSP可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地。应如何选择行进路线,以使总的行程最短。从图论的角度来看,该问题实质是在一个带权完全无向图中,找一个权值最小的Hamilton回路。由于该问题的可行解是所有顶点的全排列,随着顶点数的增加,会产生组合爆炸,它是

weixin_43945051的博客 4005

【老生谈算法】matlab实现蚁群算法解决旅行商问题——蚁群算法

摘 要:旅行商问题的传统求解方法是遗传算法,但此算法收敛速度慢,并不能获得问题的最优化解。蚁群算法是受自然界中蚁群搜索食物行为启发而提出的一种智能优化算法,通过介绍蚁群觅食过程中基于信息素的最短路径的搜索策略,给出基于MATLAB的蚁群算法在旅行商问题中的应用,对问题求解进行局部优化。经过计算机仿真结果表明,这种蚁群算法对求解旅行商问题有较好的改进效果。关键词:蚁群算法;旅行商问题;MATLAB;优化一、意义和目标 旅行商问题是物流领域中的典型问题,它的求解具有十分重要的理论和现实意义。采用一定的物流配送方

m0_53407570的博客 744

Ubuntu更新后VirtualBox报错rc=-1908?手把手教你修复Kernel driver not installed

本文详细解析了Ubuntu更新后VirtualBox报错rc=-1908的原因,并提供了完整的修复方案。通过重新安装VirtualBox、处理DKMS内核模块以及解决Secure Boot问题,帮助用户快速恢复虚拟机功能。特别针对Kernel driver not installed错误,给出了从诊断到修复的详细步骤。

weixin_42519781的博客 340

详解蚁群算法解决旅行商问题

本文详细解释了如何通过蚁群算法解决旅行商问题。文中的代码可以直接编译。

weixin_45496000的博客 2588

Dell R730安装Windows Server 2008 R2

一、RAID驱动准备  在安装Windows server2008 R2操作系统时,如果没有发现硬盘,请将下面的阵列卡驱动先解压(在下载的.exe文件,双击点下一步会自动解压),解压后把那文件夹复制到U盘中。阵列卡 PERC9 H330 - H730 - H730P - H830 Controllers for Windows Server 2008 R2二、系统安装方法方法一:光盘安装  ①请您...

MarshLin 2万+

蚁群算法求解旅行商问题详解

在查找蚁群算法的资料时网上有很多讲解,细心的同学可能会发现,有几个热门的版本所介绍的蚁群算法有一些细微的差别,这是因为蚁群算法有很多种不同的变体,因此看到的介绍并不一致。所以决定从新将Marco Dorigo于1997年发表的文章Ant Colony System: A Cooperative Learning Approach to the Traveling Salesman Problem仔细的捋了一遍,并将其中的一些细节问题做了一些注解。 一、背景 (一)旅行商问题(TSP...

weixin_53146190的博客 5545

mstar PQ软件修改方法

1.修改ADC的值 Static code APIXC_AdcGainOffsetSetting tADCSetting[ADC_SET_NUMS]= #define INIT_ADC_RGB_RED_GAIN               0x1000 #define INIT_ADC_RGB_GREEN_GAIN           0x1000 #define INIT_ADC_RGB

qq_18810259的专栏 2565

从Android到鸿蒙:UI框架迁移的实战指南与最佳实践

本文为Android开发者提供了将应用UI框架迁移至鸿蒙系统的实战指南。文章深入对比了Android命令式编程与鸿蒙ArkUI声明式编程的核心差异,详细讲解了从环境配置、布局迁移(如RecyclerView转List)、逻辑处理到多设备适配与性能优化的全流程最佳实践,帮助开发者高效完成迁移工作。

weixin_29208077的博客 434

旅行商问题与蚁群算法

旅行商问题(Traveling Salesman Problem,TSP)是一个经典的组合优化问题:说有一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地。请问他应如何选择行进路线,以使总的行程最短?

tomheaven的专栏 3522

【IEEE】从Accept到Online:详解Proof校样阶段的关键操作与避坑指南

本文详细解析了IEEE论文从Accept到Online的Proof校样阶段关键操作流程与避坑指南。重点介绍了IEEE Author Gateway平台的使用技巧、校样稿首页的风险点检查,以及多人协作校对策略,帮助作者高效完成论文出版前的最后审核,确保学术成果准确呈现。

weixin_30591551的博客 360

蚁群算法解决TSP问题(附代码python)

一、问题描述 1.1旅行商问题简述 旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。 1.2旅行商问题求解算法 本次实验选用蚁群算法来对旅行商问题求解。 二、实验目的 理解蚁群行为的蚁群优化算法的求解过程。

m0_63845261的博客 7989

基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1221

CodeBuddy Code CLI 常用工作流:17个实战场景全解析

CodeBuddy Code CLI 17个实战场景解析 本文详细介绍了CodeBuddy Code CLI在17个开发场景中的高效应用,包括: 快速理解新代码库 高效修复Bug 安全重构代码 使用子代理系统处理专业任务 Plan Mode安全分析 自动化测试处理 创建合并请求 文档生成与维护 图片内容分析 文件目录快速引用 每个场景都配有具体命令示例和最佳实践,帮助开发者提升工作效率。

简简单单Onlinezuozuo 1080

蚁群算法解决旅行商问题(附MATLAB代码)

函数生成包含坐标和距离矩阵的模型。是计算旅行路径长度的函数。nVar是问题的变量数量(即城市数量)。

LJGHZ的博客 1904

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++手敲蚁群算法解决旅行商问题

利用仿生智能算法来对旅行商问题TSP进行求解。可以选用遗传算法、蚁群算法、粒子群算法、鱼群算法等智能算法进行求解,这里选择的是蚁群算法。

XZY1952911554的博客 1061

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【TSP问题】基于蚁群算法求解旅行商问题附Matlab代码

旅行商问题(Traveling Salesperson Problem,TSP)是一个经典的组合优化问题,其目标是在给定一组城市和它们之间的距离的情况下,找到一条最短的路线,使旅行商能够访问所有城市一次且仅一次,最终回到起点。TSP问题具有极高的计算复杂度,随着城市数量的增加,求解难度呈指数级增长。蚁群算法(Ant Colony Optimization,ACO)是一种基于群体智能的启发式算法,它模拟了真实蚂蚁觅食时的路径选择行为,能够有效地解决TSP问题。

qq_59747472的博客 1428

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 一个快速完整的教程,Maven安装
下一篇: OpenGL制作键盘交互的会行走的机器人
DiamondTan-覃
博客等级 码龄11年 148粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值