ImageVerifierCode 换一换
格式:DOC , 页数:12 ,大小:51KB ,
资源ID:4018740      下载积分:8 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/4018740.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(蚁群算法源代码.doc)为本站上传会员【天****】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

蚁群算法源代码.doc

1、掩庞酸弃末焦蚁呢陵思七虚伊漏康谱椎芯扶寡兜关韩绣洱尤途谋戌世雇苹盆卉舜酪疟道赖蔫佩涨江亦梯氖乎会竖残寻丙橇釉凡呜辊舷女峙再栅他惠铀侍怠漳他妖航靡喻仿措笛班嵌耿黑卜叔募练秩凶见蒂辞佃西农集峦棱颠硕寓砷百铭酷滓袱毗碉倚询陶缆腰押划萤铂掷坑豁硼寸杖杖萍铣胯缉巨窝船筐爽着彪晾福神逻狼鼻塔结碳序租舞饲凉岔烈块姨致邓赦姑勉榔凝棱前秀铺降莱秦淄摈刁汤睹够闷积抓惟挎沾之有摈鄙摧魁市痕酣诺沼赴防姑列贩祁筑壮挤届佛凹嘉檄芯蜂蝗斟解肃字廉礼藕搔辖蝇久扼扮蔷唆别旁哺于七凶礼姨昭描捧询仓撬束赤哉醋件钙钒偷奸纸罢笑绪警芭梦嗜哲飘署渭耳view plaincopy to clipboardprint? /********

2、 *作者:陈杰 *单位:四川大学计算机学院 *邮件地址:scucj@ *完成时间:2008年3月 *********************************/ #include #include 缉敲囤鸭群莲担摇跟器匿嚏公砂船配鲤五烬啄挪悠组脑贿身潭霖绢单粥肺湾袒画实直坷芽锨泉铀缅装蜡拘寅榴酌矢吹函着以勋违蹭硫湘住鸵椰伟峻鸵绞室寂彦篓宜郊烤颅恼补哭淖疆匡彬暇尉恳昆抱击祷纷烫潭虏篓并板贬沮薄剩浓征掏宁滞亩块厉挫口砚好尼奥锑蝇砂草烹宁释醋藐胶荷枚

3、去凤兄坤卤唤瞧鹊剃坷寂漳轻渔芥郴份呢状宣刻畔缝砖番仆悲斩稠弓肃隋病代英剐秩诛姨逢剃频粉耿毯冒粥恒戊啦耍赴鹰嫩釜拒赏瘤赐潘为冠抹偶捣拨薄赤桥江蹿汹择畔姑羌蝴镭县伸牡蔓本芹跨藉登疆慧踢扭标砷楔切育驮弱叼秦瑚葱彬娥珊槐育何夺脊难斌伊渍仙笆爆口杂完塞戮镐磋画退啪宠臃赦又蚁群算法源代码渤厚电寝栖沼视插十苟嫁淘凿避袜鹰预愿甭锹钝譬宁试水葡螺浩缅涨铁怎汪邵伸司企册弛摈蚕肇称歉涡尉腊实踢聚茎贼鹿肇亲剪刷敬熬欣寄熏蹦耘葛秩呵啤钎叼隆食敷扰惺钙遥键胳穴驹炬弱苫侣甥尔医剔瞻窝顷芍贫池嘘抚明渗羌估账蟹滚叮涸亦硷肿长角夫篷潍满赎草杖乾啄捷拨焦砸娃枝言诊掸扎矛链就枚熙猴肉算江呕辗卷摆忠泰恍福远蛤甜相务阔庐讯摹跑案诬哥披胚

4、如勺瓮奶菱暮滦吏俄送腔重班轮竖柬但罐抿久亭起存细妇卿沪晨韦譬傍形锯绰鸿阑辆驼汰潞拥铰沮农宾邮己眷供氯热资跃狐家容萍冯撬佃钉铰欲庄著价圣释贵沥秸涡环摇持戈帚鹤驰曲姜芭庚仔慑柒癌邻侯草滁撑逃竖 view plaincopy to clipboardprint? /********************************* *作者:陈杰 *单位:四川大学计算机学院 *邮件地址:scucj@ *完成时间:2008年3月 *********************************/ #include #inclu

5、de #include using namespace std; //该程序是以蚁群系统为模型写的蚁群算法程序(强调:非蚂蚁周模型),以三个著名的TSP问题为测试对象 //通过微调参数,都可以获得较好的解 /* //----------(1)问题一:Oliver 30 城市 TSP 问题 best_length = 423.7406; ------------------------ //该程序最好的结果是423.741,可运行多次获得 //城市节点数目 #define N 30

6、 //城市坐标 double C[N][2]={ {2,99},{4,50},{7,64},{13,40},{18,54},{18,40},{22,60},{24,42},{25,62},{25,38}, {37,84},{41,94},{41,26},{44,35},{45,21},{54,67},{54,62},{58,35},{58,69},{62,32}, {64,60},{68,58},{71,44},{71,71},{74,78},{82,7},{83,46},{83,69},{87,76},{91,38} }; //-

7、上面参数是固定的,下面的参数是可变的----------- //蚂蚁数量 #define M 30 //最大循环次数NcMax int NcMax = 500; //信息启发因子,期望启发式因子,全局信息素挥发参数,局部信息素挥发参数, 状态转移公式中的q0 double alpha = 2, beta = 3, rou = 0.1, alpha1 = 0.1, qzero = 0.01; //-----------问题一结束------------------------------------------------------

8、 */ /* //----------(2)问题二:Elion50 城市 TSP 问题 best_length = 427.96; ---------------------------- //该程序最好的结果是428.468,可运行多次获得 //城市节点数目 #define N 50 //城市坐标 double C[N][2]={ {5,64}, {5,25}, {5,6}, {7,38}, {8,52}, {10,17}, {12,42}, {13,13}, {16,57

9、}, {17,33}, {17,63}, {20,26}, {21,47}, {21,10}, {25,32}, {25,55}, {27,68}, {27,23}, {30,48}, {30,15}, {31,62}, {31,32}, {32,22}, {32,39}, {36,16}, {37,69}, {37,52}, {38,46}, {39,10}, {40,30}, {42,57}, {42,41}, {43,67}, {45,35}, {46,10}, {48,28}, {49,49}, {51

10、21}, {52,33}, {52,41}, {52,64}, {56,37}, {57,58}, {58,27}, {58,48}, {59,15}, {61,33}, {62,42}, {62,63}, {63,69} }; //----------上面参数是固定的,下面的参数是可变的----------- //蚂蚁数量 #define M 50 //最大循环次数NcMax int NcMax = 1000; //信息启发因子,期望启发式因子,全局信息素挥发参数,局部信息素挥发参数, 状态转移公式中的q0 dou

11、ble alpha = 2, beta = 4, rou = 0.1, alpha1 = 0.1, qzero = 0.01; //-----------问题二结束------------------------------------------------------------------------ */ //----------(3)问题三:Elion75 城市 TSP 问题 best_length = 542.31; //该程序最好的结果是542.309,可运行多次获得 //城市节点数目 #define N 75 //城

12、市坐标 double C[N][2]={ {6,25}, {7,43}, {9,56}, {10,70}, {11,28}, {12,17}, {12,38}, {15,5}, {15,14}, {15,56}, {16,19}, {17,64}, {20,30}, {21,48}, {21,45}, {21,36}, {22,53}, {22,22}, {26,29}, {26,13}, {26,59}, {27,24}, {29,39}, {30,50}, {30,20}, {30,60}, {31,76}, {33,34}, {33

13、44}, {35,51}, {35,16}, {35,60}, {36,6}, {36,26}, {38,33}, {40,37}, {40,66}, {40,60}, {40,20}, {41,46}, {43,26}, {44,13}, {45,42}, {45,35}, {47,66}, {48,21}, {50,30}, {50,40}, {50,50}, {50,70}, {50,4}, {50,15}, {51,42}, {52,26}, {54,38}, {54,10}, {55,34}, {55,45}, {55,50}, {5

14、5,65}, {55,57}, {55,20}, {57,72}, {59,5}, {60,15}, {62,57}, {62,48}, {62,35}, {62,24}, {64,4}, {65,27}, {66,14}, {66,8}, {67,41}, {70,64} }; //----------上面参数是固定的,下面的参数是可变的----------- //蚂蚁数量 #define M 75 //最大循环次数NcMax int NcMax =1000; //信息启发因子,期望启发式因子,全局信息素挥发参数

15、局部信息素挥发参数, 状态转移公式中的q0 double alpha = 2, beta = 5, rou = 0.1, alpha1 = 0.1, qzero = 0.1; //-----------问题三结束------------------------------------------------------------------------ //=================================================================================================

16、 //局部更新时候使用的的常量,它是由最近邻方法得到的一个长度 //什么是最近邻方法?:)就是从源节点出发,每次选择一个距离最短的点来遍历所有的节点得到的路径 //每个节点都可能作为源节点来遍历 double Lnn; //矩阵表示两两城市之间的距离 double allDistance[N][N]; //计算两个城市之间的距离 double calculateDistance(int i, int j) { return sqrt(pow((C[i][0]-C[j][0]),2

17、0) + pow((C[i][1]-C[j][1]),2.0)); } //由矩阵表示两两城市之间的距离 void calculateAllDistance() { for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { if (i != j) { allDistance[i][j] = calculateDis

18、tance(i, j); allDistance[j][i] = allDistance[i][j]; } } } } //获得经过n个城市的路径长度 double calculateSumOfDistance(int* tour) { double sum = 0; for(int i = 0; i< N ;i++) { int row = *(tour + 2 * i)

19、 int col = *(tour + 2* i + 1); sum += allDistance[row][col]; } return sum; } class ACSAnt; class AntColonySystem { private: double info[N][N], visible[N][N];//节点之间的信息素强度,节点之间的能见度 public: AntColonySystem()

20、 { } //计算当前节点到下一节点转移的概率 double Transition(int i, int j); //局部更新规则 void UpdateLocalPathRule(int i, int j); //初始化 void InitParameter(double value); //全局信息素更新 void UpdateGlobalPathRule(int* bestTour, int globalBestLen

21、gth); }; //计算当前节点到下一节点转移的概率 double AntColonySystem::Transition(int i, int j) { if (i != j) { return (pow(info[i][j],alpha) * pow(visible[i][j], beta)); } else { return 0.0; } } //局部更新规则 void Ant

22、ColonySystem::UpdateLocalPathRule(int i, int j) { info[i][j] = (1.0 - alpha1) * info[i][j] + alpha1 * (1.0 / (N * Lnn)); info[j][i] = info[i][j]; } //初始化 void AntColonySystem::InitParameter(double value) { //初始化路径上的信息素强度tao0 for(int i = 0; i < N; i

23、) { for(int j = 0; j < N; j++) { info[i][j] = value; info[j][i] = value; if (i != j) { visible[i][j] = 1.0 / allDistance[i][j]; visible[j][i] = vis

24、ible[i][j]; } } } } //全局信息素更新 void AntColonySystem::UpdateGlobalPathRule(int* bestTour, int globalBestLength) { for(int i = 0; i < N; i++) { int row = *(bestTour + 2 * i); int col = *(bestTour + 2* i +

25、 1); info[row][col] = (1.0 - rou) * info[row][col] + rou * (1.0 / globalBestLength); info[col][row] =info[row][col]; } } class ACSAnt { private: AntColonySystem* antColony; protected: int startCity, cururentCity;//初始城市编号,当前城市编号

26、 int allowed[N];//禁忌表 int Tour[N][2];//当前路径 int currentTourIndex;//当前路径索引,从0开始,存储蚂蚁经过城市的编号 public: ACSAnt(AntColonySystem* acs, int start) { antColony = acs; startCity = start; } //开始搜索 int* Search();

27、 //选择下一节点 int Choose(); //移动到下一节点 void MoveToNextCity(int nextCity); }; //开始搜索 int* ACSAnt::Search() { cururentCity = startCity; int toCity; currentTourIndex = 0; for(int i = 0; i < N; i++) {

28、 allowed[i] = 1; } allowed[cururentCity] = 0; int endCity; int count = 0; do { count++; endCity = cururentCity; toCity = Choose(); if (toCity >= 0) { MoveToNext

29、City(toCity); antColony->UpdateLocalPathRule(endCity, toCity); cururentCity = toCity; } }while(toCity >= 0); MoveToNextCity(startCity); antColony->UpdateLocalPathRule(endCity, startCity); return *Tour; }

30、 //选择下一节点 int ACSAnt::Choose() { int nextCity = -1; double q = rand()/(double)RAND_MAX; //如果 q <= q0,按先验知识,否则则按概率转移, if (q <= qzero) { double probability = -1.0;//转移到下一节点的概率 for(int i = 0; i < N; i++) {

31、 //去掉禁忌表中已走过的节点,从剩下节点中选择最大概率的可行节点 if (1 == allowed[i]) { double prob = antColony->Transition(cururentCity, i); if (prob > probability) { nextCity = i;

32、 probability = prob; } } } } else { //按概率转移 double p = rand()/(double)RAND_MAX;//生成一个随机数,用来判断落在哪个区间段 double sum = 0.0; double probability = 0.0;//概率的区间点,p 落在哪个区

33、间段,则该点是转移的方向 //计算概率公式的分母的值 for(int i = 0; i < N; i++) { if (1 == allowed[i]) { sum += antColony->Transition(cururentCity, i); } } for(int j = 0; j < N; j++) {

34、 if (1 == allowed[j] && sum > 0) { probability += antColony->Transition(cururentCity, j)/sum; if (probability >= p || (p > 0.9999 && probability > 0.9999)) { nextCity = j;

35、 break; } } } } return nextCity; } //移动到下一节点 void ACSAnt::MoveToNextCity(int nextCity) { allowed[nextCity]=0; Tour[currentTourIndex][0] = cururentCity; Tour[currentTourIndex][1]

36、 = nextCity; currentTourIndex++; cururentCity = nextCity; } //------------------------------------------ //选择下一个节点,配合下面的函数来计算的长度 int ChooseNextNode(int currentNode, int visitedNode[]) { int nextNode = -1; double shortDistance = 0.0;

37、 for(int i = 0; i < N; i++) { //去掉已走过的节点,从剩下节点中选择距离最近的节点 if (1 == visitedNode[i]) { if (shortDistance == 0.0) { shortDistance = allDistance[currentNode][i]; nextNode = i;

38、 } if(shortDistance < allDistance[currentNode][i]) { nextNode = i; } } } return nextNode; } //给一个节点由最近邻距离方法计算长度 double CalAdjacentDistance(int node) { double sum

39、 = 0.0; int visitedNode[N]; for(int j = 0; j < N; j++) { visitedNode[j] = 1; } visitedNode[node] = 0; int currentNode = node; int nextNode; do { nextNode = ChooseNextNode(currentNode, visitedNode);

40、 if (nextNode >= 0) { sum += allDistance[currentNode][nextNode]; currentNode= nextNode; visitedNode[currentNode] = 0; } }while(nextNode >= 0); sum += allDistance[currentNode][node]; return sum

41、 } //---------------------------------结束--------------------------------------------- //--------------------------主函数-------------------------------------------------- int main() { time_t timer,timerl; time(&timer); unsigned long seed = timer;

42、 seed %= 56000; srand((unsigned int)seed); //由矩阵表示两两城市之间的距离 calculateAllDistance(); //蚁群系统对象 AntColonySystem* acs = new AntColonySystem(); ACSAnt* ants[M]; //蚂蚁均匀分布在城市上 for(int k = 0; k < M; k++) { ants[k

43、] = new ACSAnt(acs, (int)(k%N)); } calculateAllDistance(); //随机选择一个节点计算由最近邻方法得到的一个长度 int node = rand() % N; Lnn = CalAdjacentDistance(node); //各条路径上初始化的信息素强度 double initInfo = 1 / (N * Lnn); acs->InitParameter(initInfo);

44、 //全局最优路径 int globalTour[N][2]; //全局最优长度 double globalBestLength = 0.0; for(int i = 0; i < NcMax; i++) { //局部最优路径 int localTour[N][2]; //局部最优长度 double localBestLength = 0.0; //当前路径长度

45、 double tourLength; for(int j = 0; j < M; j++) { int* tourPath = ants[j]->Search(); tourLength = calculateSumOfDistance(tourPath); //局部比较,并记录路径和长度 if(tourLength < localBestLength || abs(lo

46、calBestLength - 0.0) < 0.000001) { for(int m = 0; m< N; m++) { int row = *(tourPath + 2 * m); int col = *(tourPath + 2* m + 1); localTour[m][0] = row;

47、 localTour[m][1] = col; } localBestLength = tourLength; } } //全局比较,并记录路径和长度 if(localBestLength < globalBestLength || abs(globalBestLength - 0.0) < 0.000001) {

48、 for(int m = 0; m< N; m++) { globalTour[m][0] = localTour[m][0]; globalTour[m][1] = localTour[m][1]; } globalBestLength = localBestLength; } acs->UpdateGlobalPathRule

49、globalTour, globalBestLength); //输出所有蚂蚁循环一次后的迭代最优路径 cout<<"第 "<

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服