利用遗传算法求解旅行商问题

可执行文件下载:
/Files/gpcuster/TSPGA.rar

修正显示的版本下载:
/Files/gpcuster/TSPGA2.rar
简介

首先,咱们可以看看用遗传算法求解的旅行商问题的效果图:

 
您可以在黑色背景的区域内看到问题的求解结果,下面对该程序的使用做一些说明:

  1. 黑色区域的绿色空心点是需要访问的点。
  2. 黑色区域的红色空心点是开始访问的起点。(有且只有一个)
  3. 白色的连线代表从起点(红色空心点)开始,分别经过需要访问的点(绿色空心点)的行走路线。(注意:这里定义的旅行商问题和传统的定义有一点不同。这里的定义不需要从终点再回来起点。)

 

程序使用说明

启动程序,您将看到如下界面:

 

下面,我对程序的界面做一些说明:

  1. Population Size:这个参数代表种群的个体数量。
  2. Generations:这个参数代表种群的繁殖代数。
  3. CorssOverRate:这个参数代表种群的个体之间发生交配的概率。
  4. MutationRate:这个参数代表种群个体发生变异的概率。
  5. CitiesNum:这个参数代表需要访问的城市的数量(体现为黑色区域中绿色空心点的个数)。
  6. Random:点击这个按钮,将随机参数起始点(红色空心点)和需要访问的城市(绿色空心点)。
  7. Reset:点击这个按钮,将清除所有在黑色区域的点。
  8. Start:点击这个按钮,将根据黑色区域的数据开始计算旅行商问题,并显示最后计算的结果。

更加您的需要,可以不用点击Random按钮随机产生问题的描述。您可以自己手动地在黑色区域设置起点和需要访问的点。设置方法如下:

将鼠标移到到黑色区域,点击鼠标的右键将在黑色区域设置一个需要访问的点,点击鼠标的左键将在黑色区域设置访问的起点(有且仅有一个)

当您完成黑色区域的设置以后,在点击Start就可以运行程序,并观看到最后的计算结果了。

程序的组织结构

整个程序分为2个部分:

  1. 表现层:Form1.cs
  2. 逻辑层:World.cs

您在使用的时候不需要考虑表现层中的内容。(如果您想对程序的界面做修改那就是另外一回事了J

您关注的重点应该在逻辑层当中。里面描述了整个程序的计算过程。

 

程序的计算原理

整个程序的计算流程相对简单,根据初中做学的达尔文关于《物种起源》的思想。描述如下:

Start

配置种群的相关参数

_world.Population = Int32.Parse(population.Text);

_world.Generation = Int32.Parse(generation.Text);

_world.CrossOverRate = Double.Parse(crossOverRate.Text);

_world.MutationRate = Double.Parse(mutationRate.Text);

初始化种群的第一代

generateFirstGeneration();

进化到下一代

generateNextGeneration()

返回最优的个体

End

具体的实现原理和方法,可以参考这篇论文
/Files/gpcuster/AFastTSPSolverUsingGAOnJAVA.rar

最后,程序的源代码下载:
/Files/gpcuster/TSPGACode1.rar

posted @ 2008-01-12 12:49 逖靖寒 阅读(3230) 评论(20)  编辑 收藏 网摘 所属分类: 算法

  回复  引用    
#1楼 2008-01-12 14:41 | tony_lan [未注册用户]
不知道楼主在解决大规模TSP问题上,效果怎么样,不错,赞一个!!!
  回复  引用  查看    
#2楼 [楼主]2008-01-12 15:04 | 逖靖寒      
@tony_lan
您可以把
CitiesNum该为100,然后点击Random,在是Start。
看看效果怎么样。
  回复  引用  查看    
#3楼 2008-01-12 18:48 | SZW      
为什么我计算出来的路线总是在我标的点整体下移一段距离呢?跟楼主的图片上不一样
  回复  引用  查看    
#4楼 [楼主]2008-01-12 19:55 | 逖靖寒      
@SZW
呵呵,我刚刚才发现这个问题。
马上改正。
  回复  引用  查看    
#5楼 [楼主]2008-01-12 20:21 | 逖靖寒      
@SZW
修正好了,您再看看行不行。
  回复  引用  查看    
#6楼 2008-01-13 14:36 | SZW      
@逖靖寒
支持楼主!谢谢!你这个思路对于一些物流路线管理也有很大的借鉴意义^_^


下了/Files/gpcuster/TSPGA2.rar,貌似还有一些问题:


有关调用实时(JIT)调试而不是此对话框的详细信息,
请参见此消息的结尾。

************** 异常文本 **************
System.DivideByZeroException: 试图除以零。
在 d.a(Object A_0, MouseEventArgs A_1)
在 System.Windows.Forms.Control.OnMouseMove(MouseEventArgs e)
在 System.Windows.Forms.Control.WmMouseMove(Message& m)
在 System.Windows.Forms.Control.WndProc(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

  回复  引用  查看    
#7楼 [楼主]2008-01-13 15:03 | 逖靖寒      
@SZW
呵呵,
这个异常应该是显示那块引起的,因为程序在我的电脑上没有问题,所以我不好测试。请原谅。

还有,我的思路就是看了日本人在96年发表的一篇论文。
按照他的思路,一步一步实现的。并没有自己多少创新。
  回复  引用    
#8楼 2008-04-10 16:56 | Simplesource [未注册用户]
博主对这个问题很有研究啊!我也比较喜欢遗传算法,关于这个问题我也写过一个小程序,大家可以一起讨论一下。
http://simplesource.blog.163.com/blog/static/1034140620076104130312/
  回复  引用  查看    
#9楼 [楼主]2008-04-10 18:03 | 逖靖寒      
@Simplesource
呵呵,不敢当。我当时是为了解决一个问题才临时学的这个算法。而且我所作的工作也就是用C#实现了一遍而已。
  回复  引用  查看    
#10楼 2008-04-15 13:58 | 简单代码      

我发现楼主的程序线和点不能重合的原因了,很简单,只是少了两对括号:
将如下代码
for (int i = 0; i < visitPoints.Count; i++)
                {
                    Point p = new Point();
                    p.X = visitPoints[i].X * pictureBox1.Width / 200;
                    p.Y = visitPoints[i].Y * pictureBox1.Height / 200;

                    visitPoints[i] = p;
                }

                g.DrawLines(Pens.SeaShell, visitPoints.ToArray());
修改为
for (int i = 0; i < visitPoints.Count; i++)
                {
                    Point p = new Point();
                    p.X = visitPoints[i].X * (pictureBox1.Width / 200);
                    p.Y = visitPoints[i].Y * (pictureBox1.Height / 200);

                    visitPoints[i] = p;
                }

                g.DrawLines(Pens.SeaShell, visitPoints.ToArray());
即可。
不过我试了一下,楼主的程序在规模很小的TSP问题下效果还行,但是规模稍大点,比如100个城市,不但速度慢而且效果奇差。看来,小日本的论文在理论上有点问题,行不通。
100个城市


而且奇怪的是我用博主相同的参数计算58个城市得到的效果却没有博主得出的那么好:

博主是不是有点“学术造假”的嫌疑哦

附:
用我的程序计算100个城市的TSP图(用时9秒):

用我的程序计算500个城市的TSP图(用时:1小时57分):

我的程序,见http://simplesource.blog.163.com/blog/static/1034140620076104130312/


  回复  引用  查看    
#11楼 [楼主]2008-04-15 22:19 | 逖靖寒      
@简单代码
您好。由于我的疏忽,给上传的代码是错误的。我并没有造假。您使用的版本是一个测试的版本,所以才会有您看到的效果。
我给您的邮箱发去我的代码。
PS。实际效果不如您的好,但是不至于您开始看到的那么差。
以后希望能和您多交流,谢谢您指出我的问题。非常感谢。
  回复  引用    
#12楼 2008-07-05 16:19 | hupy [未注册用户]
你好,你可以给我发一份你的完整的代码么,我的这边下了以后不能够正常运行,谢了
  回复  引用    
#13楼 2008-09-24 12:13 | Sopia [未注册用户]
我不知道大半年后您是否依旧保存着原始代码
但是我很希望能够看到有效的版本
您的原始效果图很不错
能否发送给我一份呢?非常感谢... zyldut@yahoo.com.cn
PS 下载的有点问题...
  回复  引用  查看    
#14楼 [楼主]2008-09-24 12:28 | 逖靖寒      
@Sopia
不好意思,电脑重装了,资料不在了:(
但是你可以参考/Files/gpcuster/AFastTSPSolverUsingGAOnJAVA.rar这篇论文。我就是按照他的理论写的,我的文章中的代码有点问题,上传错了。
  回复  引用    
#15楼 2008-11-06 20:34 | maguangzhi [未注册用户]
贡献一个P2P并行遗传算法,见主页http://maguangzhi.bokee.com
  回复  引用  查看    
#16楼 [楼主]2008-11-06 20:41 | 逖靖寒      
@maguangzhi
谢谢你提供的资源,但是你的网页在Linux中的FF3上打开是乱码。。。
  回复  引用    
#17楼 2008-11-10 11:25 | 城城 [未注册用户]
麻烦博主能给我发一份源码吗?非常感谢!
还有相关的资料吗?
我的邮箱:Juan.Huang21@163.com
  回复  引用    
#18楼 2008-11-14 21:18 | 小春春 [未注册用户]
你好,大侠,我在做毕业设计,能发一份类中文的TSP的论文过来吗?还有修改后没有BUG的程序.谢谢啦.
  回复  引用    
#19楼 2008-11-22 00:20 | 卡拉 [未注册用户]
博士 你的算法能否给我发份 wjcper2008@163.com谢谢
  回复  引用    
#20楼 2008-12-12 10:14 | 黑夜里的一盏灯 [未注册用户]
代码能够也发给我一份,谢谢 zcy0121@sohu.com


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-01-12 20:21 编辑过
Google站内搜索
[推荐职位]上海盛大网络招聘架构师



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: