收藏 分享(赏)

TSP问题的遗传算法求解方案--源程序清单(旅行商问题,包含算法介绍,源程序,测试结果).doc

上传人:myw993772 文档编号:7059168 上传时间:2019-05-04 格式:DOC 页数:76 大小:816KB
下载 相关 举报
TSP问题的遗传算法求解方案--源程序清单(旅行商问题,包含算法介绍,源程序,测试结果).doc_第1页
第1页 / 共76页
TSP问题的遗传算法求解方案--源程序清单(旅行商问题,包含算法介绍,源程序,测试结果).doc_第2页
第2页 / 共76页
TSP问题的遗传算法求解方案--源程序清单(旅行商问题,包含算法介绍,源程序,测试结果).doc_第3页
第3页 / 共76页
TSP问题的遗传算法求解方案--源程序清单(旅行商问题,包含算法介绍,源程序,测试结果).doc_第4页
第4页 / 共76页
TSP问题的遗传算法求解方案--源程序清单(旅行商问题,包含算法介绍,源程序,测试结果).doc_第5页
第5页 / 共76页
点击查看更多>>
资源描述

1、TSP问题的遗传算法求解方案算法的软件实现4.1 开发环境介绍本文中的所有算法是在 Visual C+ 6.0 的操作平台上进行开发的,并结合 STL进行编程。1、Visual C+ 6.0 简介Visual C+ 6.0 是微软公司最新出品的功能最为强大的可视化开放工具,是计算机界公认的最优秀的应用开发工具之一。Microsoft 的基本类库使得开发 Windows 应用程序比以往任何时候都要容易。Visual C+作为一种程序设计语言,它同时也是一个集成开发工具,提供了软件代码自动生成和可视化的资源编辑功能。2、Visual C+ 6.0 的优势(1).拥有强大的编辑环境。(2).拥有强大

2、的类库的支持。(3).拥有强大的调试环境。(4).拥有较强的低层控制能力。(5).拥有强大的帮助系统 MSDN 的支持。(6).拥有一个高效的编译器,产生的可执行文件体积小巧、运行速度快。 3、STL简介STL(Standard Template Library ),即标准模板库,是一个具有工业强度的,高效的C+程序库。它被容纳于C+标准程序库(C+ Standard Library)中,是ANSI /ISO C+标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C+程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。这种现象有

3、些类似于Microsoft Visual C+中的MFC(Microsoft Foundation Class Library),或者是Borland C+ Builder中的VCL (Visual Component Library),但是它比二者具有更强的优势。更加值得一提的是,它具备以下几个区别于其它软件库的优点:(1).经过类属编程方法精心组织的,可互换的编程模块能够提供比传统组件设是否 世代进化图4.1 遗传算法解TSP的具体流程图计方法丰富得多的组合方式。(2).类属编程方法设计也是将来为数据库,用户界面等专业领域开发组件的基础。开始产生城市对城市进行编码初始化遗传算法的相关参数计

4、算每个个体的适应值是否符合终止条件? 输出正确的TSP 结果选择 交叉变异轮盘赌选择普通选择PMX GXCXOX基于次序的变异 基于位置的变异 倒位变异GEN=GEN+1(3).通过使用某些编译机制并根据不同的算法进行具体的设计,可以在不损失效率的情况下实现对组件的概括。与此形成鲜明对照的是,其它一些具有复杂继承层次和大量使用虚函数的C+库结构则通常会降低效率。4.2 算法实现的流程图本设计的具体流程图如图4.1所示:4.3 算法的各个模块及其详细设计思路1城市生成模块用户可以点击鼠标左键产生城市,也可以选择菜单栏的设置城市选项,通过输入城市数目来随机生成城市。当然,如果用户选择错了城市,可以

5、在该城市上点击鼠标右键来清除城市。如果用户要清除所有的城市,可以双击鼠标右键或选择菜单栏的结束选项,都可以清除所有的城市。其设计设计思路如图4.2所示:按下鼠标左键按下鼠标右键 选择菜单栏的设置城市选项选择菜单栏的结束选项图4.2 城市生成模块的设计思路最后的效果如图4.3所示:程序检测鼠标移动的具体信息程序将点的信息存入一个点向量中调用画图函数画点 (即设置城市)将点向量中要除去的点找出来重新画点向量中的所有点(此时该删除的点已从点向量中删除)用一个变量记入要产生的城市数 循环调用鼠标左键点击消息直到达到要求的城市数重新画地图(即清除了所有的点)图4.3 TSP问题城市设置实现效果2.地图选

6、择模块根据具体的需要,用户可以选择不同的地图,本设计提供的地图有:基于直角坐标系的地图和圆形地图,这两个地图由不同的类来产生。其中类DefaultMap产生直角坐标地图,类RoundMap产生圆形地图。图4.4所示的是直角坐标地图,图4.5所示的是圆形地图。图4.4 直角坐标地图图4.5 圆形地图3. 遗传算法解TSP的参数设置模块在具体的应用中,用户可以根据具体情况来设置遗传算法的相关参数,这些参数包括: 交叉率:控制程序进行交叉的次数,在本设计中,先随机生成一个数,如果这个数大于交叉率,则不交叉,如果这个数小于交叉率,则进行交叉。具体实现如下:pick = float(randomInt(

7、0,1000)/1000;if(pick #include #include #include #include #include #include #include #include #include #include #include#include using namespace std;/命名空间/三地图类1.头文件/map.h/#pragma once#include “head.h“/MapControl 控制地图以及左右键点击后对的处理/class Mappublic:virtual void DrawMap(HWND hwnd,HDC hdc)=0;/画地图/ virtual

8、void SaveClickPoint()=0;/保存格式为地图中的位置virtual void DelAllPoint()=0;/清除 vecpoin 所有点/在地图上画点(参数为实际位置)virtual void DrawPonit(HWND hwnd,const POINT/将地图上已存在的点(参数为实际位置)删除virtual void SmearPonit(HWND hwnd,const POINT/保存 POINT(参数为实际位置)到向量virtual void AddPoint(const POINT/删除 POINT(参数为实际位置)到向量virtual void SubPoi

9、nt(const POINT/获得所有已点击的点的位置(实际值)virtual vector GetAllClickPoint( )=0;protected:POINT beginpoint;/实际位置vector vecpoint;/地图中的位置;/函数对象/class equal_pointpublic:equal_point()equal_point(const POINTbool operator()(const POINTprivate:POINT val;/四直角坐标地图类1.头文件/defaultmap.h/#pragma once#include “map.h“#define

10、DIVISIONS1 10 #define DIVISIONS2 6class DefaultMap:public Mappublic: void DrawMap(HWND hwnd,HDC hdc);/画地图/void SaveClickPoint( );/保存格式为地图中的位置void DelAllPoint ( );/清除 vecpoin 所有点/在地图上画点(参数为实际位置)void DrawPonit(HWND hwnd,const POINT/将地图上已存在的点(参数为实际位置) 删除void SmearPonit(HWND hwnd,const POINTvoid AddPoin

11、t(const POINT/保存 POINT(参数为实际位置)到向量void SubPoint(const POINT/删除 POINT(参数为实际位置 )到向量/获得所有已点击的点的位置(实际值)vector GetAllClickPoint( );POINT GetMapPoint (const POINT/实际 POINT 在地图位置POINT GetRealPoint (const POINT/地图 POINT 实际位置protected:/找到该点附近的像素点 iarea 为该点的半径vector FindAroundPoint(const POINT ;/2.源文件/default

12、map.cpp/#include “defaultmap.h“/画地图/void DefaultMap:DrawMap(HWND hwnd,HDC hdc ) HPEN hpen;hpen=CreatePen(PS_SOLID,1,RGB(0,128,128); /创建画笔SelectObject(hdc,hpen);for (int x = 0 ; x DefaultMap:FindAroundPoint(const POINTvector vecroundpoint;temppoint.x =point.x-6 ;/ 判断点是否在有效区域/-51temppoint.y =point.y-5

13、1 ;/-51if(temppoint.x700|temppoint.y420) return vecroundpoint; iarea=abs(iarea);/防止 iarea 小于零for(int n=-iarea;n-1-iarea;m-)temppoint.x=point.x+m;temppoint.y=point.y+n;vecroundpoint.push_back( temppoint ); temppoint.x=point.x+n;temppoint.y=point.y+m;vecroundpoint.push_back( temppoint ); return vecrou

14、ndpoint;/在地图上画点/ 在地图上画点(参数为实际位置)/void DefaultMap:DrawPonit( HWND hwnd ,const POINT/ 判断点是否在有效区域int cy =point.y-51;if(cx700|cy420) return;AddPoint( point );HDC hdc;hdc=GetDC(hwnd);HPEN hpen;hpen=CreatePen(PS_DOT,5,RGB(255,0,0);SelectObject(hdc,hpen); /选择对象进 DCEllipse(hdc,point.x+2,point.y+2,point.x-2,

15、point.y-2); /画圆点DeleteObject(hpen);ReleaseDC (hwnd, hdc);return;/添加和减少点(在地图位置)到向量/ 保存 POINT(参数为实际位置)到向量/void DefaultMap:AddPoint(const POINTif( vecpoint.size()!=0 /保证点不重复vecpoint.push_back( tempoint );/清除一个指定的点/void DefaultMap:SubPoint(const POINTvector :iterator Iter1;vecroundpoint=FindAroundPoint(

16、point,2); /获得该点附近的像素点if(vecroundpoint.size()=0 ) return;Iter1=find_first_of( vecpoint.begin(),vecpoint.end(),vecroundpoint.begin(),vecroundpoint.end(),equal_point() );if(Iter1=vecpoint.end() return;vecpoint.erase(Iter1);/将地图上已存在的点(参数为实际位置) 删除/擦掉该点(重画所有的点和地图)/void DefaultMap:SmearPonit( HWND hwnd ,co

17、nst POINT hdc=GetDC(hwnd);int n=vecpoint.size();SubPoint(point);if(n=vecpoint.size() /没找到则向量大小不变 return;DrawMap( hwnd, hdc );ReleaseDC (hwnd, hdc);for(n=0;n DefaultMap:GetAllClickPoint( ) return vecpoint;/将地图与实际位置之间转换/POINT DefaultMap:GetRealPoint(const POINTtemppoint.x=point.x-6 ; temppoint.y=point

18、.y-51;/ 判断点是否在有效区域if(temppoint.x700|temppoint.y420) temppoint.x=-1;temppoint.y=-1;return temppoint;temppoint.x+=6;temppoint.y+=51;return temppoint;/地图位置转换为实际位置/POINT DefaultMap:GetMapPoint(const POINTtemppoint.x-=6;temppoint.y-=51;if( temppoint.x GetAllClickPoint( );/获得所有已点击的点的位置( 实际值) protected:vec

19、tor mappoint;/2.源文件/roundmap.cpp/#include “roundmap.h“/圆形地图 /RoundMap:RoundMap()/ do initialization stuff herevector point60(60);int iallpoint120=305,-21,324,-23,344 , -23 ,365 ,-19,384, -13, 402, -6,421, 4,437, 16 ,454 ,28,468 ,41,482, 57, 493, 74,503, 93,509, 113, 515, 132, 518, 152,520,173,518, 1

20、93,514, 214,510,233,501, 254,493, 271,481, 287,468,304, 456, 318, 439,329,422, 342,284, -16,263 ,-12,246, -4,225, 3, 210, 17,194, 28,178, 42, 166, 56, 156, 74,145, 93,137, 112,133,131,129, 153,127, 173,128,195,132, 213,137, 233,146 ,255, 155 ,272,165, 290,180, 307,194,318,208, 331,227 ,343,244,352,2

21、65, 360,282 ,365,303 ,366, 326, 369,343, 368,368, 365,385, 360,404, 353;for(int n=0;n60;n+) point60n.x=iallpoint2*n;point60n.y=iallpoint2*n+1;for(n=0;n60;n+) point60n.x=point60n.x+21;point60n.y=point60n.y+81;mappoint=point60;/画地图/void RoundMap:DrawMap(HWND hwnd,HDC hdc ) /n 表示线的条数RECT rect;rect.bott

22、om=450;/ 无效区域 (背景区域)rect.left=100;rect.right=740;rect.top=0;HBRUSH hbrush; /擦除背景区域hbrush=CreateSolidBrush( RGB(255,255,255) );FillRect(hdc,SelectObject (hdc, GetStockObject (BLACK_PEN) ;for(int n=0;n60;n+) Ellipse (hdc, mappointn.x-5, mappointn.y-5, mappointn.x+5, mappointn.y+5);/保存删除 POINT(在地图位置)到向

23、量/*void RoundMap:SaveClickPoint()fstream outFile( “copy.text“, ios_base:out );if ( !outFile )cerr “unable to open input file: “ “ - bailing out!n“;return ;if(vecpoint.size()=0) return; outFile“#“Round_Map_NAME“n; /以后有用outFile“#“vecpoint.size()n;for(int n=0;nvecpoint.size();n+)outFilevecpointn.x;outFile“ “;outFilevecpointn.y;outFilen;return;*/删除所有的点/void RoundMap:DelAllPoint() if(vecpoint.size()=0) return;vecpoint.clear();return;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报