蚁群算法解决tsp问题

2023-11-07

控制蚁群算法走向的关键是信息素,信息素类似遗传算法的适应性函数,类似退火算法的评价函数,影响着其中一只蚂蚁的下一步的选择。

蚂蚁:类似遗传算法的染色体,就是一条解,在tsp问题中蚂蚁的路径就是tsp的解。

信息素:评价函数,与路径成反比

蚂蚁数量:一次迭代有多少只蚂蚁在跑(注意不是一起跑,而是先后放上一只蚂蚁)

迭代次数T:所有蚂蚁跑完视为一次迭代周期。


程序流程:

1,随机生成距离矩阵

进入循环while(t<T)

{

2,信息素递减(只有较近的信息素才能影响这一步)

3,对于每一只蚂蚁,随机生成起点,标记起点为访问过

进入循环(寻找城市数量-1次)(起点已经有了)

{

4,寻找周围城市的最大信息素

5,随机生成0~1的数如果小于bugp(蚂蚁正常选择)则从最大信息素城市中找一个作为下一个

                                      否则(蚂蚁犯错误了,有木有感觉像退火算法里的允许犯错的那个函数)随机生成一个未访问过的点作为下一个(因为至少你要保证可行吧)

6,标记这个点被访问过

}

修改信息素,修改方式为原来信息素+Q/这条路径长度(Q为1个常数)

t++;

}

输出最优解。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define T 1000//最大迭代次数
#define n 1000//蚂蚁数量
#define cities  10//城市数量
#define bugp 0.9//每一次选择操作的出错概率
#define alpha 0.1//每一次信息素的消失速率
#define Q 1
int start;
int biggest[cities],biggestsum;//储存信息素最多时所对应的点(毕竟信息素最大值所对应的边不止一条,biggest记录下那些边的对应的终点,biggestsum为biggest的元素个数)
int distance[cities][cities];//城市的距离矩阵
double phe[cities][cities];//边所对应的信息素浓度(之所以选择边是因为点容易受到周围优秀的点的影响)
int ant;//蚂蚁当前所在点
int bugsum,bugTry[cities];//出错时可供选择的城市数量和城市下标
int visit[cities];//用来标记城市是否已经经过
int path[n][cities+1];//记录每一个蚂蚁所走过的城市
void initdistance()
{
    int i,j;
    memset(distance,0,sizeof(distance));
    srand(time(NULL));
     for (i=0;i<cities;i++)
        for (j=i+1;j<cities;j++)
        {
           distance[i][j]=rand()%100;
           distance[j][i]=distance[i][j];
        }
        printf("城市的距离矩阵如下:\n");
        for (i=0;i<cities;i++)
        {
            for (j=0;j<cities;j++)
                printf("%4d",distance[i][j]);
                printf("\n");
        }
}

int main()
 {
     int i,j,k,p,t,n1,n2,r;
     double d;
     double  max;//记录下最大信息素浓度
     double sumdistance;
     initdistance();//初始化城市矩阵
     t=0;
     for (i=0;i<cities;i++)
      for (j=0;j<cities;j++)
        phe[i][j]=1;//初始化每一条边的信息素浓度
      srand(time(NULL));
      for (i=0;i<n;i++)
        path[i][0]=rand()%cities;//每一个蚂蚁随机在起点
     while(t<T)
     {
         for (i=0;i<cities;i++)
            for (j=0;j<cities;j++)
              phe[i][j]=phe[i][j]*alpha;//每一次信息素逐渐消逝
         for (i=0;i<n;i++)//对于每一只蚂蚁
         {
             start=path[i][0];//记录下起点
             memset(visit,0,sizeof(visit));//清零标记数组
             visit[start]=1;
             ant=start;
             for (j=1;j<cities;j++)//选取剩下的cities-1个城市
             {
                 bugsum=biggestsum=max=0;
                 for (p=0;p<cities;p++)
                  if (!visit[p])
                    max=max>phe[ant][p]?max:phe[ant][p];//寻找周围最大的信息素的那条边(其实是为了找到那个p点)
                 for (p=0;p<cities;p++)
                 {
                     if ((max==phe[ant][p])&&(!visit[p]))
                      biggest[biggestsum++]=p;//记录下信息素浓度最大的点(注意一般不止一个点)
                 }
                 for (p=0;p<cities;p++)
                    if (!visit[p])
                 bugTry[bugsum++]=p;//记录下总共可供选择的点
                 d=rand()%100;
                 d=d/100;
                 if (d<bugp)//如果蚂蚁选择正确
                 ant=biggest[rand()%biggestsum];//选择信息素最大的点
                 else//如果蚂蚁选择错误
                ant=bugTry[rand()%bugsum];//只选择成立的点(未必最优)
                visit[ant]=1;
                path[i][j]=ant;
             }
         }
         //上面是每一只蚂蚁的选择,而一次全部选择后,更新信息素
         for (i=0;i<n;i++)
         {
             sumdistance=0;
             for (j=1;j<cities;j++)
             {
                n1=path[i][j-1];
                n2=path[i][j];
                sumdistance=sumdistance+distance[n1][n2];
             }
             n1=path[i][cities-1];
             n2=path[i][0];
             sumdistance=sumdistance+distance[n1][n2];//注意要回到起点
             for (j=1;j<cities;j++)
             {
                 n1=path[i][j-1];
                 n2=path[i][j];
                 phe[n1][n2]=phe[n1][n2]+Q/sumdistance;//更新信息素,注意因为信息素还要再次递减,所以就好比2进制的权,越靠近话语权越重
             }
             n1=path[i][cities-1];
             n2=path[i][0];
             phe[n1][n2]=phe[n1][n2]+Q/sumdistance;
         }
         t++;//这样迭代次数+1
        }
         max=999999;
       for (i=0;i<n;i++)
       {
           sumdistance=0;
           for (j=1;j<cities;j++)
           {
               n1=path[i][j-1];
               n2=path[i][j];
               sumdistance=sumdistance+distance[n1][n2];
           }
           n1=path[i][cities-1];
           n2=path[i][0];
           sumdistance=sumdistance+distance[n1][n2];
           if (sumdistance<max)
           {
               max=sumdistance;
               r=i;
           }
       }
       printf("最短路径为:%.4f\n",max);
       printf("路径为:\n");
       for (i=0;i<cities;i++)
       printf("%d ",path[r][i]);//第r个蚂蚁是最优的
       printf("%d\n",path[r][0]);
        return 0;
 }





总结:蚁群算法的关键在于信息素,而影响信息素的因素只有两个:蚂蚁选择这条路径的数量和时间的流逝(越往后,越是之前的信息素影响就越弱)。

  同时注意虽然现实中蚂蚁是同时去找食物,但是在蚁群算法中蚂蚁出发却是有先后之分的,而所有的蚂蚁走完就视为一次迭代。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蚁群算法解决tsp问题 的相关文章

  • 一些黑科技接口钩子 钉钉,禅道,gitlab,jenkins等

    日常工作中需要做流程的串联 这个时候就需要掌握一些黑科技接口 这些接口甚至是官方文档上并没有提供的 但是我们确实可以使用 进行内部工具开发的一定要记得提供钩子 没有钩子 做不了朋友 钉钉相关 钉钉群中的自定义机器人 curl https o
  • C/C++在线编译器

    一直以来都喜欢用手机看书 尤其是在上班时 看的最多的是编程一类的书 主要是C 看着就想写写代码 可是电脑用不能用 怎么办 于是想到用UC浏览器找找看网上有没有在线的编译器 想什么时候写代码都可以验证 于是就找了几个 各有千秋吧 中文的我没找
  • 在地址栏中输入一段内容,接下来都发生了些什么

    用户发出 URL 请求到页面开始解析的这个过程 就叫做导航 用以定位到新资源 并且将老的资源从页面卸载 一 用户输入 地址栏首先判断输入的内容是搜索内容还是符合url规则的url 如果是搜索内容的话 浏览器会拼接上该搜索内容形成一个新的ur
  • mybatis-plus

    mybatis plus的sql拼接规则 实体对象参数属性有值 那么该属性名会拼接sql语句中 实体对象参数属性为基本属性时 会有默认值 mybatis plus认为是有值 参与sql拼接 mybatis plus与mybatis的对比 m
  • 3d指向检测 ros_3d_pointing_detection

    Introduction The workflow of this project is Detect 2D human joints from color image by Openpose Compute 3D human joints
  • stopPropagation, preventDefault 和 return false 的区别

    http blog csdn net bkq421511585 article details 14166789
  • 使用Docker拉起ES容器和Kibana容器并设置密码Demo

    1 准备条件 安装好docker 在同一台服务器上安装es和kibana 安装docker命令参考 可以按顺序执行如下命令安装 1 sudo yum install y yum utils 2 sudo yum config manager
  • 做擦边网站 服务器放在狗爹,在GoDaddy搭建Prosper202服务器

    记录一下我在GoDaddy搭建Prosper202服务器的过程 1 首先 我购买的是Liunx Deluxe共享虚拟主机 狗爹这个类型的产品可以建多个网站 我有一个域名 www网站已经上线 虽然还没有什么内容 2 为你的Prosper202
  • add_library使用 $<TARGET_OBJECTS:name>

    一 背景 前面介绍了add library的两种格式 今天分享一个实例 Cmake分别生成静态链接库 OBJ链接库 并使用
  • 人人商城小程序消息服务器配置,人人商城小程序订阅消息设置方法和几个坑!...

    操作步骤 第一步 开通订阅消息功能 登录微信小程序官网后台 mp weixin qq com 开通订阅消息 第二步 服务类目 新增 商家自营 gt 服装 鞋 箱包 第三步 添加订阅消息 4个 订阅消息 公共模板库 搜索 订单支付成功通知 编
  • Android仿小米商城底部导航栏(基于BottomNavigationBar)

    简介 现在大多数App都会用到底部导航栏 比如QQ 微信和购物App等等 有了底部导航栏 用户可以随时切换界面 查看不同的内容 Android底部导航栏的实现方式特别多 例如TabHost TabLayout 或者TextView等 都可以
  • 机器学习-支持向量机算法实现与实例程序

    一 SMO算法基础 支持向量就是离分隔超平面最近的那些点 分隔超平面是将数据集分开来的决策边界 支持向量机将向量映射到一个更高维的空间里 在这个空间里建立有一个最大间隔超平面 在分开数据的超平面的两边建有两个互相平行的超平面 建立方向合适的
  • 剑指offer总结

    时间复杂度一般比空间复杂度更重要 因为改进时间对算法的要求更高 是空间换时间 还是时间换空间 一般要看具体的应用 对于普通的应用 一般是空间换时间 因为普通用户更关心速度 而且一般有足够的存储空间允许这样操作 对于嵌入式的软件 一般我们会用
  • 简说C++学习-第一章C++语言概述

    简说C 学习 第一章C 语言概述 1 C 语言的发展 1972年 贝尔实验室在B语言的基础上 做了进一步的充实和完善 设计出了C语言 C语言的优点 语言简洁 使用灵活 方便 具有丰富的运算符和数据类型 可以进行低级操作 适合开发系统软件 程
  • Java jdbc实现多表查询

    数据库中的一张表对应Java中的一个类 我这里示例的是学生类 老师类 成绩类 还有一个用于存储多表查询结果后的SelectAll类 public class Student 学生表 private Integer id 学生编号 priva
  • sublime text 3下载与安装详细教程

    一 下载 打开官网下载链接http www sublimetext com 3 下载Sublime Text 3 portable version 下载下来为 Sublime Text Build 3083 x64 zip 编辑器的包 解压
  • Linux 中统计指定目录下同一类文件总的大小

    root PC1 test ls a map a ped a txt b ped b txt root PC1 test ll h total 1 4G rw r r 1 root root 200M Dec 1 19 42 a map r
  • Tensorflow-2-Tensorboard使用

    一 概述 机器学习如此复杂 训练模型的时候 摸不清背后到底是如何运行的 自己设置的参数和关键变量 如果能看到在训练时的变化情况 可以为后面的参数调优阶段提供很大的便利 Tensorboard就是这样一个工具 它刻意将模型抽象成图像 tens

随机推荐

  • UmiJS基础+UmiUI安装使用+Mock使用示例+DvaJS案例

    title UmiJS基础 date 2022 09 12 19 20 27 tags React 框架 UmiJS categories 框架 UmiJS 介绍 官方文档 可扩展 Umi 实现了完整的生命周期 并使其插件化 Umi 内部功
  • 问题(02)Message 消息提示每次只弹出1个,不能同时出现2个

    项目场景 PC端开发 vue elementUI 问题描述 Message 消息提示同时出现2个 原因分析 Element UI的Message消息提示是点击一次触发一次的 解决方案 在utils文件创建resetMessage js re
  • Jar包中Class文件替换

    1 查找替换的class的具体路径 jar tvf jar grep class 根据自己的jar包和类名替换 2 根据第一步查到的class的具体路径解压出来对应文件 jar xvf jar class 3 替换解压出来的文件中的clas
  • 代码制作数字流星雨_用C语言编写流星雨程序

    展开全部 数字流星雨代码 流星雨 cpp Defines the entry point for the console application 程序名称 数字流星雨 最后修改e5a48de588b632313133353236313431
  • Python 判断生肖

    Python 判断年份干支纪年及生肖 生肖 12年一循环 干支纪年法 60年一循环 十天干 甲 乙 丙 丁 午 戊 庚 辛 壬 癸 十二地支 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥 十二生肖 鼠 牛 虎 兔 龙 蛇 马 羊 猴 鸡
  • java 插件式架构_springboot插件式开发框架

    介绍 该框架主要是集成于springboot项目 用于开发插件式应用的集成框架 核心功能 插件配置式插拔于springboot项目 在springboot上可以进行插件式开发 扩展性极强 可以针对不同项目开发不同插件 进行不同插件jar包的
  • 【Cat.1模组】 广和通L610 基于OpenCPU的SDK二次开发

    目前支持Cat 1网络的芯片平台主要是紫光展锐UIS8910和翱捷ASR1603 基于紫光展锐平台 各大厂商延伸出多款Cat 1模组 广和通L610就是其中之一 本文记录开发过程 供日后参考 广和通L610模组支持AT指令开发和OpenCP
  • 2020安卓启动图标圆角_从零开始画图标系列:启动图标设计指南

    想要在启动图标设计上入门 就要先从规范开始学习 然后了解不同的风格以及对应风格的设计过程 说到启动图标的规范 首先会想到的 就是 iOS 提供的图标栅格 通过这个栅格 会规范图形的尺寸 以及所处的位置 这个模板和工具图标的使用方法类似 我们
  • JAVA代码实现多级树结构封装对象(2018-09-26补充)

    我们经常在代码里会造一个树结构对象 以方便前端使用 以地区 区 镇 村 为例 后台一般对于树结构对象在数据库的结构是这样的 主键ID 名字 父ID ID REGION NAME PARENT ID 121100 尼龙区 0 12110000
  • 【Javascript VTK】在页面中放置VTK三维模型

    一 问题描述 在项目的开发过程中 遇到将vtk三维重建结果放置到网页 Web Page 中进行可视化展示的棘手问题 想要实现的效果图如下 图一 最终实现的 v t k 3
  • python日常实用技能:如何利用Python批量生成任意尺寸的图片

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 不知道大家有没有遇到过 因检验需要1000张 分别从11到10001000像素的图片 搜索一番过后发现还是Python实现比较方便 遂决定用Python实现这一功能 下面分
  • JS变量提升

    变量提升 即变量可以在声明之前使用 值为 undefined 如 var 这种使用方式虽然不报错 但它是错误的 根据代码规范我们必须要在变量声明后使用 在ES6中严格规定了这点 let 和 const 所声明的变量一定要在声明后使用 否则报
  • Python数据结构:集合(Set)介绍

    Python数据结构 集合 Set 介绍 集合 Set 是Python中一种无序 可变且不重复的数据结构 它可以用于存储一组唯一的元素 而且集合中的元素是不可重复的 在本文中 我们将介绍集合的特点 创建和操作集合的方法 以及集合与其他数据结
  • PHPExcel使用-使用PHPExcel导出文件

    导出步骤 1 新建一个excel表格 gt 实例化PHPExcel类 2 创建sheet 内置表 gt 1 gt createSheet 方法 2 gt setActiveSheetIndex 方法 3 gt getActiveSheet
  • 春招大盘点:找工作除了招聘网站还有哪些渠道?

    又是一年毕业季 估计同学们都正在写论文 找工作两头忙 很多同学和小C 诉苦 说现在找实习的渠道太少了 招聘网站都刷完了 也没看到很合适的岗位 那找工作除了招聘网站还有什么渠道呢 其实是有的 今天就为大家盘点一下 1 各大公司官网 一般大的公
  • 编程(C#)实现创建 internet快捷方式 文件

    心情 各种百度 各种搜 搞了老半天 真不容易 a 推荐解决方案2 貌似似这个也不错 http xiaochen 2003 4 blog 163 com blog static 48040967201253033250671 解决方案1 加载
  • 什么是大数据分析?定义、优点和类型

    在一个技术已经达到其使用巅峰并完全压倒我们生活的时代 交换的数据量是巨大的 传统的计算工具无法处理的大量数据集每天都在被收集 我们将这些大量数据称为大数据 如今 企业严重依赖大数据来更好地了解客户 从这些原始大数据中提取有意义的见解的过程被
  • 敏捷开发“松结对编程”实践之二:计划与设计篇(大型研发团队,学习型团队,139团队,师徒制度,设计评审,预想陈述,共同估算,扑克牌估算)

    转载自 http blog csdn net cheny com article details 6581741 本文是 松结对编程 系列的第二篇 之一 之二 之三 之四 之五 之六 之七 之八 此系列之九及之后文章请见栏目总目录 新人其实
  • 代码随想录算法训练营第十四天

    代码随想录算法训练营第十四天 理论基础 递归遍历 迭代遍历 统一迭代 1 1 理论基础 满二叉树 如果一棵二叉树只有度为0的结点和度为2的结点 并且度为0的结点在同一层上 则这棵二叉树为满二叉树 深度为k 有2 k 1个节点的二叉树 完全二
  • 蚁群算法解决tsp问题

    控制蚁群算法走向的关键是信息素 信息素类似遗传算法的适应性函数 类似退火算法的评价函数 影响着其中一只蚂蚁的下一步的选择 蚂蚁 类似遗传算法的染色体 就是一条解 在tsp问题中蚂蚁的路径就是tsp的解 信息素 评价函数 与路径成反比 蚂蚁数