运筹系列67:大规模TSP问题的EAX遗传算法

news2024/9/22 21:21:17

1. 算法介绍

EAX是edge assembly crossover 算子的缩写。本算法有Y nagata教授公布,目前在VLSI最大的几个案例上获得了best的成绩。另外目前MonoLisa 100K问题的最优解也是由其公布,若能得到更优解,可以获得1000美元奖励。
算法步骤如下:

  1. 获得一系列初始解,选取两条路径A和B进行重叠
  2. 拆解重叠后的路径形成一系列子路径,每一条子路径都是偶数条边,其中A和B交叉,称为AB-cycle
  3. 按照一定的规则(随机或者启发式)选取边,称为E-set
  4. 使用A和E-set中的边进行反向增删,得到一系列Intemidiate结果
  5. 使用启发式算法将Intemidiate结果构建成soild结果。
    在这里插入图片描述

2. 代码分析

参考代码https://github.com/nagata-yuichi/GA-EAX(原版)
以及https://github.com/wlsgusjjn/EAX-TSP.git (简化版)

2.1 概述

原版文件清单如下:

main.cpp
 - The main function

env.cpp, env.h
 - Main procedure of the GA

kopt.cpp kopt.h
 - Local search with the 2-opt neighborhood

cross.cpp cross.h
 - Edge assembly crossover,核心程序

evaluator.cpp evaluator.h
 - Pre-processing procedures to the TSP instance

indi.cpp, indi.h 
 - An individual (tour)

rand.cpp, rand.h
 - Procedures for generating a random number and permutation etc 

sort.cpp, sort.h
 - Procedures for sorting

***.tsp
 - Several TSP instances (TSPLIB format)

2.2 使用方法

编译:g++ -o jikken -O3 main.cpp env.cpp cross.cpp evaluator.cpp indi.cpp rand.cpp kopt.cpp sort.cpp -lm

运行:./jikken <integer1> <string1> <integer2> <integer3> <string2>
比如:./jikken 10 DATA 100 30 rat575.tsp
参数说明:

  • = number of trials
  • = filename to which results are written
  • = number of population (300 is recommended if N > 10,000)
  • = number of offspring solutions (30 is recommended)
  • = instance filename (the instance must conform with TSPLIB format)

如果string1位DATA,则会生成两个结果文件:
DATA_Result和DATA_BestSol

  • DATA_Result:存储迭代信息,格式如下:
    0 6773 173 0 3
    1 6773 174 0 3
    2 6773 166 0 3
    3 6773 173 0 3
    4 6773 173 0 3
    5 6773 171 0 3
    6 6773 182 0 3
    7 6773 168 0 3
    8 6773 173 0 3
    9 6773 173 0 3

    • 1st column: trial number
    • 2nd column: best tour length obtained in each run
    • 3rd column: the number of generations in each run
    • 4th column: the execution time (sec) for generating the initial population
    • 5th column: the execution time (sec) for each run of the GA

*DATA_BestSol:存储每一轮的最优结果

575 6773
1 24 25 26 27 28 29 52 50 51 74 73 72 49 48 47 70 71 93 94 116 …

  • 1st line: number of cities, tour length
  • 2nd line: a solution representing a sequence of the cities

如果想记录每一轮的所有路径,将main.cpp中的gEnv->WritePop()开启,结果会写入DATA_POP_*
随后可以将这个文件作为初始路径传给程序继续执行优化:./jikken 10 DATA2 100 30 rat575.tsp DATA_POP_0

2.3 自定义修改

还可以做一些自定义算法配置,主要在env。cpp里面的TEnvironment::Init() 可以修改搜索参数:

  Example1: Default setting
  fStage = 1;       /* Stage I */
  fFlagC[ 0 ] = 4;  /* Diversity preservation: 1:Greedy, 3:Distance, 4:Entropy */
  fFlagC[ 1 ] = 1;  /* Eset Type: 1:Single-AB, 2:Block2 */ 

  Example2: Only Stage II is performed using EAX with the Block2 strategy
  fStage = 2;       /* Stage I */
  fFlagC[ 0 ] = 4;  /* Diversity preservation: 1:Greedy, 3:Distance, 4:Entropy */
  fFlagC[ 1 ] = 2;  /* Eset Type: 1:Single-AB, 2:Block2 */ 

  Example3: The greedy selection is used instead of the entropy-preserving selection.
  fStage = 1;       /* Stage I */
  fFlagC[ 0 ] = 1;  /* Diversity preservation: 1:Greedy, 3:Distance, 4:Entropy */
  fFlagC[ 1 ] = 1;  /* Eset Type: 1:Single-AB, 2:Block2 */ 

TerminationCondition() 里可以修改停止条件

3. 2013年新版本的改进

参考文章:https://sci-hub.se/10.1287/ijoc.1120.0506,主要想法就是第一步将EAX的操作局部化,随后再执行正常的EAX算子。

3.1 GA整体流程

每一阶段的GA算法架构如下,其中Npop个初始解使用的是greedy local search +2-opt neighborhood。注意下面有两个参数Npop和Nch。
在这里插入图片描述
每个阶段的终止条件:如果最近的1500/Nch次迭代都没有改进,则令G=当前迭代总次数。继续迭代,直至连续G/10次迭代都没有改进

3.2 边交换算法

  1. 首先是筛选AB-cycle:在$G_{AB} 上随机游走,直至所有路径都已游走完毕。过程中一旦发现 A B − c y c l e ,立即保存并从 上随机游走,直至所有路径都已游走完毕。过程中一旦发现AB-cycle,立即保存并从 上随机游走,直至所有路径都已游走完毕。过程中一旦发现ABcycle,立即保存并从G_{AB} $中删除。
  2. AB-cycle筛选出一部分的集合叫做E-set。
  3. 使用A和E-set给出一个新的路径(可能有subtour),然后按照一定的规则消除subtour,生成新的路径
  4. 将新路径放入offspring集合中,直至没有新的offspring生成。

3.3 构筑E-set规则

3.2节中构造E-set时,局部EXA规则目前有两种:
1.随机策略:每个AB-cycles有0.5的概率选上
2.单个策略:随机在剩余的AB-cycles中选一个
subtour消除规则为:
1.每次都从最小的subtour开始,遍历所有待删除的边e
2.另一条待删除的边,需满足其中至少有一个点在e的最近10个点中

全局EXA规则有三种
1.K-multiple策略:随机选取K个AB-cycles,代码中K=5
2.block策略:主要思想是选取位置相近的AB-cycles
3.block2策略:首先定义A-vertex为连接A中两条边的点;B-vertex为连接B中两条边的点;C-vertex为连接A和B中各一条边的点,如下图。其中a和b的差别在于,b中对c-vertex做了精简。
在这里插入图片描述
在intermediate solution中,A-blocks和B-blocks被c-vertex隔开,且c-vertex的数量肯定是偶数。c-vertex的计算比subtour的计算要快。使用tabu-search选取E-set,规则为:

  1. 初始化Tabu[i] = 0
  2. 选一个较大的AB-cycle作为center AB-cycle然后从剩下的里面随机选取AB-cycle,每一个至少和AB-cycle都有一个接触点
  3. 在每次迭代过程中,当前E-set都会转移到临近的tabu解以外的c-vertex最小的subtour中,直至LS个阶段没有改进(这里令其为20)。
    在这里插入图片描述

4. 一些对比结果

如下,其中B-err是best solution error,如果是=的话,后面括号中表示获得最优值的次数。A-err是average,W-error则是worst。
在这里插入图片描述

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

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

相关文章

【教学典型案例】用户称为设计者的正例

目录一&#xff1a;背景介绍二&#xff1a;设计理念三&#xff1a;设计过程按照设计理念设计的功能&#xff1a;1、用户可以根据自己的情况来选择显示哪些活动参与数据。2、用户可以对请假功能和点读功能进行开启和关闭操作&#xff08;默认为全部开启&#xff09;四&#xff1…

我一个女孩子居然做了十年硬件……

2011年&#xff0c;一个三本大学的电子信息专业的大三女学生跟2个通信专业的大二男生组成了一组代表学校参加2011年“瑞萨杯”全国大学生电子设计大赛&#xff0c;很意外的获得了湖北赛区省三等奖&#xff0c;虽然很意外&#xff0c;但还是挺高兴的&#xff0c;毕竟第一次为喜欢…

数据大爆炸时代,大容量硬盘为何不可或缺?

2月27日&#xff0c;中共中央、国务院正式印发《数字中国建设整体布局规划》&#xff08;以下简称《规划》&#xff09;&#xff0c;明确提出要夯实数字中国建设基础&#xff1a;一是打通数字基础设施大动脉&#xff0c;优化各种级别数据中心的合理梯次布局&#xff1b;二是畅通…

Arduino双色LED实验记录

接线图片&#xff1a;双色LED实物和布线有区别&#xff1a;代码&#xff1a;int RED_LED 11; //设置红色为11 int GREEN_LED 10; //设置绿色为10 int val 0;//全局变量val void setup() {// put your setup code here, to run once:pinMode(RED_LED,OUTPUT);//引脚配置pinMo…

HCIP总结(一)

抽象语言---编码---二进制---电信号----处理电信号 &#xff08;电脑工作流程&#xff09; OSI参考模型 ----OSI/RM (核心思想&#xff1a;分层) 应用层----提供各种应用服务&#xff0c;将抽象语言转换成编码&#xff0c;提供人机交互的接口 表示层----将编码转换成二进制 …

10个值得收藏的ChatGPT辅助编程技巧

在我们开始之前&#xff0c;你必须先了解编程语言&#xff0c;然后才能相信 ChatGPT 抛给你的任何东西。 我必须明确这一点&#xff0c;因为许多误入歧途的绵羊被告知 ChatGPT 是新的圣杯&#xff0c;开发人员将被淘汰。 推荐&#xff1a;用 NSDT场景设计器 快速搭建3D场景。 使…

Redis学习(三):五大数据类型及常用操作

五大数据类型 Redis-Key set [key] [value] # 向数据库添加一个键值对 keys * # 查看当前数据库所有的键值 EXISTS [key] # 查看key是否存在在当前数据库中&#xff0c;存在返回1&#xff0c;不存在返回0 move [key] [index] # 将key移动到编号为index的数据库&#xff0c;…

Docker(八)---Docker安全相关设定

文章目录一、理解docker安全二、容器资源控制1.cpu资源限制2.cpu优先级3.内存资源限制4.磁盘io限制三、docker安全加固&#xff08;隔离&#xff09;四、容器特权一、理解docker安全 Docker容器的安全性&#xff0c;很大程度上依赖于Linux系统自身&#xff0c;评估Docker的安全…

扬帆优配|多只“迷你基”清盘未果业绩反领跑 盲目追捧有风险

2023年以来&#xff0c;在信创板块一枝独秀的行情下&#xff0c;多只重仓该板块的基金成绩乘着春风起舞&#xff0c;但作为较为小众的职业&#xff0c;现在来看能够真正享受到红利的基金多为迷你基金。有剖析指出&#xff0c;不少“迷你基”经过押注单一赛道或许投资小盘股等方…

【数据库】排名问题

返回第N高的一个解决思路返回N组中的第N高解决思路分数排名解决思路窗口函数数据库经常被用来解决排名问题。 返回第N高的一个 单表查询: 表: Employee------------------- | Column Name | Type | ------------------- | id | int | | salary | int | ----…

HTML DOM 改变 HTML 内容

HTML DOM 允许 JavaScript 改变 HTML 元素的内容。改变 HTML 输出流在 JavaScript 中&#xff0c;document.write() 可用于直接向 HTML 输出流写内容。实例<!DOCTYPE html><html><body><script>document.write(Date());</script></body>&l…

算法分析与设计之并查集详解

算法分析与设计之并查集1.前言2.并查集的基础2.1.关于动态连通性2.2.动态连通性的应用场景&#xff1a;2.3.对问题建模&#xff1a;2.4.建模思路&#xff1a;2.5.API2.7.Quick-Find算法&#xff1a;2.8.Quick-Union算法&#xff1a;3. 并查集的应用1.前言 本文主要介绍解决动态…

day02_设计测试用例的常见方法

软件测试用例 概念&#xff1a;一个为了特定的目的&#xff08;检验开发的代码实现是否满足用户的需求&#xff09;而设计的文档&#xff08;包含测试输入、执行条件、预期结果&#xff09;&#xff0c;文档的形式可以是xmind、excel等。 测试用例的核心要素 常见测试用例的…

Echarts-授人以鱼不如授人以渔

Echarts 授人以渔 授人以鱼不如授人以渔 这篇文章就告诉大家如何快速查阅官网的配置项手册 建议收藏&#xff0c;老司机请跳过 echarts是一个非常强大的图形库 但是对于很多刚入门的小伙伴而言echarts里面配置项海量的名词看到吐血 想要修改样式的时候不知道改哪里 下面就简…

【LeetCode】1653. 使字符串平衡的最少删除次数

1653. 使字符串平衡的最少删除次数 题目描述 给你一个字符串 s &#xff0c;它仅包含字符 ‘a’ 和 b’​​​​ 。 你可以删除 s 中任意数目的字符&#xff0c;使得 s 平衡 。当不存在下标对 (i,j) 满足 i < j &#xff0c;且 s[i] ‘b’ 的同时 s[j] ‘a’ &#xff0…

一次输入多个数据-batchsize大于1的简单的线性回归模型-标量

最简单的线性回归模型-标量 接上篇&#xff0c;由于batchsize为1&#xff0c;因此loss有很大的波动&#xff0c;这篇我们讨论batchsize大于1的情况。若batchsize数量为N&#xff0c;则ywxbywxbywxb的损失函数为&#xff1a; L∑i1N(wxi∗b−yi∗)2(wxTbeT−yT)(wxbe−y)\begin{…

html网页源码加密

html加密、网页加密、网页源码加密html网页源码能加密吗&#xff1f;能加密到何种程度&#xff1f; 某些时候&#xff0c;我们可能需要对html网页源码加密&#xff0c;使网页源码不那么容易被他人获得。出于这个目标&#xff0c;本文测试一种html加密方式。 提前透露&#xf…

Linux系统PWM应用编程

目录应用层如何操控PWM编写应用程序在开发板上测试本章我们将学习如何对开发板上的PWM 设备进行应用编程。 应用层如何操控PWM 与LED 设备一样&#xff0c;PWM 同样也是通过sysfs 方式进行操控&#xff0c;进入到/sys/class/pwm 目录下&#xff0c;如下所示&#xff1a; 这里…

Java多态性

用一句话概括就是&#xff1a;事物在运行过程中存在不同的状态。 多态的存在有三个前提: 1.要有继承关系 2.子类要重写父类的方法 3.父类引用指向子类对 但是其中又有很多细节需要注意。首先我们定义两个类&#xff0c;一个父类Animal&#xff0c;一个子类Cat。 父类Animal cl…

Hive学习——企业级调优

目录 一、计算资源调优 (一)Yarn资源配置——集群 1.Yarn配置说明 (1)yarn.nodemanager.resource.memory-mb (2)yarn.nodemanager.resource.cpu-vcores (3)yarn.scheduler.maximum-allocation-mb (4)yarn.scheduler.minimum-allocation-mb (二)MapReduce资源配置 二、…