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

加入VIP,免费下载
 

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

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

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(TSP问题及LINGO求解技巧.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

TSP问题及LINGO求解技巧.docx

1、TSP问题及LINGO求解技巧TSP问题及 LINGO 求解技巧巡回旅行商问题 (Traveling Salesman Problem , TSP),也称为货郎担问题。最早可以追溯到 1759年Euler 提出的骑士旅行问题。 1948年,由美国兰德公司推动, TSP成为近代组合优化领域的一个典型难题。它已经被证明属于 NP难题。用图论描述 TSP,给出一个图 G(V , E) ,每边 eE 上有非负权值w(e) ,寻找 G的Hamilton 圈 C,使得 C的总权 W (C)w(e) 最小 .eE(C)几十年来,出现了很多近似优化算法。如近邻法、贪心算法、最近插入法、最远插入法、模拟退火算法

2、以及遗传算法。这里我们介绍利用LINGO 软件进行求解的方法。问题 1设有一个售货员从10个城市中的某一个城市出发,去其它9个城市推销产品。10个城市相互距离如下表。 要求每个城市到达一次仅一次后,回到原出发城市。 问他应如何选择旅行路线,使总路程最短。表 110个城市距离表城市1234567891010745861213111827031091451417173430591021827124510501491092316589914078720196614109701352513712521108130232118813148975230181291117272320252118016101

3、817121619131812160我们采用线性规划的方法求解设城市之间距离用矩阵 d 来表示, d ij 表示城市 i 与城市 j 之间的距离。设 0-1矩阵 X 用来表示经过的各城市之间的路线。设xij0若城市 i不到城市 j1若城市 i到城市 j , 且 i在j 前考虑每个城市后只有一个城市,则:nxij 1, i 1, , nj1 j i考虑每个城市前只有一个城市,则:nxij1,j 1, , n;i1ij但仅以上约束条件不能避免在一次遍历中产生多于一个互不连通回路。为 此 我 们 引 入 额 外 变 量 ui (i 1, , n , 附 加 以 下 充 分 约 束 条 件 :ui u

4、j nxij n 1, 1 i j n ;该约束的解释:如 i 与 j 不会构成回路,若构成回路,有:xij 1, x ji 1 ,则:uuj1, uju1,从而有:ii12,导致矛盾。如 i , j 与 k 不会构成回路,若构成回路,有:xij 1, xjk 1, xki 1则:uuj1, uju1, uu1从而有:ikki13,导致矛盾。其它情况以此类推。于是我们可以得到如下的模型:nminzdij xiji , j1nLxij 1,j 1, ,ni1ijnxij 1,Ls.tj1jiui uj nxijxij 0或1,ui为实数 ,n1,1 i j nL, ni, j 1,iL,n1,前

5、面问题的 Lingo 程序!TSP quesion;MODEL:SETS:city/1.10/:u;link(city,city):d,x;ENDSETSDATA:d= 0 745861213111870310914514171743 0591021827125105 014910923168991407872019614 109701352513125 2110813023211813 148975230181211 17 2723202521180161817 121619131812160;ENDDATAMIN=SUM(link:d*x);for(city(j):sum(city(i)|

6、j#ne#i:x(i,j)=1); ! 城市 j 前有一个城市相连 ;for(city(i):sum(city(j)|j#ne#i:x(i,j)=1); ! 城市 i 后前有一个城市相连 ;for(link(i,j)|i#NE#j#and#i#gt#1:u(i)-u(j)+10*x(i,j)=9);FOR(link:BIN(x);End得到的结果如下:X(3,2)=1,X(4,1)=1,X(4,3)=1,X(6,5)=1,X(7,2)=1,X(7,5)=1,X(8,6)=1,X(9,1)=1,X(10,8)=1,X(10,9)=1。其它全为 0。其最短路线为 1 4 32 7 5 6 810

7、9 1,最短距离为 77 公里。问题 2 2005 年电工杯 B 题比赛项目排序问题全民健身计划是 1995 年在国务院领导下, 由国家体委会同有关部门、 各群众组织和社会团体共同推行的一项依托社会、 全民参与的体育健身计划, 是与实现社会主义现代化目标相配套的社会系统工程和跨世纪的发展战略规划。 现在,以全民健身为主要内容的群众性体育活动蓬勃开展, 举国上下形成了全民健身的热潮, 人民群众健康水平不断提高, 同时也扩大了竞技体育的社会影响, 提高了竞技体育水平。 现在各级、 各类、各种运动比赛比比皆是,这不但提高了全民的身体素质, 而且使一批运动员脱颖而出, 成为运动健将, 为国家争得了荣誉

8、。在各种运动比赛中,为了使比赛公平、公正、合理的举行,一个基本要求是:在比赛项目排序过程中, 尽可能使每个运动员不连续参加两项比赛, 以便运动员恢复体力, 发挥正常水平。1 表 2 是某个小型运动会的比赛报名表。有 14 个比赛项目, 40 名运动员参加比赛。表中第 1 行表示 14 个比赛项目, 第 1 列表示 40 名运动员, 表中“” 号位置表示运动员参加此项比赛。 建立此问题的数学模型, 并且合理安排比赛项目顺序, 使连续参加两项比赛的运动员人次尽可能的少;2文件“ 运动员报名表 ”中给出了某个运动比赛的报名情况。 共有 61 个比赛项目, 1050人参加比赛。 请给出算法及其框图,

9、同时给出合理的比赛项目排序表, 使连续参加两项比赛的运动员人次尽可能的少;3说明上述算法的合理性;4对“问题 2”的比赛排序结果,给出解决“运动员连续参加比赛”问题的建议及方案。表 2 某小型运动会的比赛报名表项目2345678910111213141运动员1#2#3#4#5#6#7#8#9#10#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#27#28#29#30#31#32#33#34#35#36#37#38#39#40#问题一解答:若项目 i 和项目 j 相邻,可以计算出同时参加这两个项目的人数,作为 i 和 j 的距离 dij 。则问题

10、转化为求项目 1 到项目 14 的一个排列,使相邻距离和最小。我们采用 TSP问题求解。但由于开始项目和结束项目没有连接, 可考虑引入虚拟项目 15,该虚拟项目与各个项目的距离都为 0。距离矩阵 D 的求法:该报名表用矩阵 A40 14 表示。1第 i 个人参加项目 jaij第 i个人不参加项目 j040则 dijaki .akjij , i , j ,1,2,L,14k1dii 0i1,2,L,14另外 di ,150, d15, i0i 1,2,L,15由于问题 1 中 40 个运动员参加 14 个项目的比赛是 word 表,可将其拷贝到Excel 表中,然后将 #替换为 1,将空格替换为

11、0,形成 0-1 表,并拷贝到数据文件 table1.txt 中。问题 2 中 1050 个运动员参加的 61 个项目比赛的 Access 数据库中的表保存为 Excel 表,然后在表中将 #替换为 1,将空格替换为 0,形成 0-1 表,并拷贝到数据文件 table2.txt 中。在 Matlab 中编制如下程序形成距离矩阵。load table1.txt;a=table1;m,n=size(a);d=zeros(n+1,n+1); % 定义距离矩阵 ;for i=1:nfor j=1:nfor k=1:md(i,j)=d(i,j)+a(k,i)*a(k,j); % 计算不同项目之间距离 e

12、ndendendfor i=1:n+1d(i,i)=0;end%输出文件 fid=fopen(dis1.txt,w);for i=1:n+1for j=1:n+1fprintf(fid,%1d ,d(i,j);endfprintf(fid,n);endfclose(fid);输出的距离矩阵D 为:0212001012111102014101113102101101000311022102410112102101100101020111011200001201211121201102010111022100131121012142201110111101113102312111210100301

13、10101011103110102012241030100122111223011040111122121310400000000000000000然后按照前面介绍的方法 2 程序:!第一个问题的求解的程序:!比赛项目排序问题 ;model :sets :item / 1. 15/: u;link ( item, item ) :dist,x;endsetsn = size ( item);data : ! 距离矩阵 ;di st=fil e(c: lingo12prgdis1.txt);! 文件路径;!输出为 1的变量 ;text()= writef or( link(i,j) |x(i,j

14、)#GT#0: x(,i,j,)=,x(i,j);enddat aMIN = SUM(link:dist*x);for (item(j):sum(item(i)|j#ne#i:x(i,j)=1);! 点 j 前有一个点相连;for( ite m(i) :sum(ite m(j) |j#ne#i:x(i,j)=1);! 点 i后前有一个点;!保证不出现 子圈 ;for(link(i ,j) |i#N E#j#and#i#gt#1:u(i)-u(j)+FOR(link: BIN(x); ! 定义 X为 0-1 变量 ;n *x(i,j)=n-1 );end其中数据文件 dis1.txt 为:021

15、200101211110201410111310210110100031102210241011210210110010102011101120000120121112120110201011102210013112101214220111011110111310231211121010030110101011103110102012241030100122111223011040111122121310400000000000000000Lingo12求解结果为:目标值 z=2x(1,8)=1 x(2,6)=1 x(3,11)=1 x(4,13)=1 x(5,1)=1x(6,3)=1x(7,

16、5)=1 x(8,15)=1 x(9,4)=1 x(10,12)=1 x(11,7)=1x(12,14)=1x(13,10)=1 x(14,2)=1 x(15,9)=1由于 15 是虚拟项,去掉后对应序列为9-4-13-10-12-14-2-6-3-11-7-5-1-8-9则项目排序如下,其中箭头上所示数字为连续参加相邻两项目的运动员数。即有两名运动员连续参加比赛。问题 2解答与问题 1相同,只是项目变成 61个,引入虚拟项目后变为 62个,运动员为 1050名。模型建立同问题 1。在问题一中的 Matlab 程序中只需要将表 table1.txt 改为 table2.txt ,输出数据文件将

17、 dis1.txt 改为 dis2.txt 就可以了。在Lingo 程序中将项目数由 15修改为 62,使用的数据文件由 15改为 62,同样可以运行,只是运行时间较长, 本程序在 Lingo12 中大约运行 6分钟左右。 原始数据文件 table2.txt 和Matlab 输出的距离矩阵 dis2.txt ,由于数据较大这里不列出,可参见附录。Lingo 程序!第二个问题的求解的程序:!比赛项目排序问题 ;model :sets :item / 1. 62/: u;link ( item, item ) :dist,x;endsetsn = size ( item);data : ! 距离矩

18、阵 ;di st=fil e(c: lingo12prgdis2.txt);! 文件路径;!输出为 1的变量 ;text()= writef or( link(i,j) |x(i,j)#GT#0: x(,i,j,)=,x(i,j);enddat aMIN = SUM(link:dist*x);for (item(j):sum(item(i)|j#ne#i:x(i,j)=1);! 点 j 前有一个点相连;for( ite m(i) :sum(ite m(j) |j#ne#i:x(i,j)=1);! 点 i后前有一个点;!保证不出现 子圈 ;for(link(i ,j) |i#N E#j#and#

19、i#gt#1:u(i)-u(j)+FOR(link: BIN(x); ! 定义 X为 0-1 变量 ;n *x(i,j)=n-1 );endLingo12 求解结果:Lingo12求解结果为:目标值 z=5x(1,19)=1 x(2,44)=1 x(3,50)=1 x(4,25)=1 x(5,20)=1x(6,15)=1 x(7,42)=1 x(8,59)=1 x(9,35)=1 x(10,3)=1x(11,54)=1 x(12,21)=1 x(13,32)=1 x(14,41)=1 x(15,40)=1x(16,57)=1 x(17,22)=1 x(18,9)=1 x(19,60)=1 x(20,6)=1x(21,10)=1 x(22,37)=1 x(23,14)=1 x(24,51)=1 x(25,13)=1x(26,27)=1 x(27,29)=1 x(28,17)=1 x(29,24)=1 x(30,58)=1x(31,12)=1 x(32,56)=1 x(33,47)=1 x(34,23)=1 x(35,46)=1x(36,45

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1