
正文
蚁群算法改进java代码 蚁群算法路径规划改进
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
求教:蚁群算法选择最短路径问题
这个例子其实是当初数模比赛时用来完成碎片拼接的,但其所用到原理还是求解最短路径的原理。但这里的最短路径和数据结构中最短路径有一定的区别。在数据结构中,对于最短路径的求解常用的一般有Dijkstra算法与Floyd算法,但对于要求出一条经过所有的点的并且要求路径最短,这些算法还是有一定的局限性的。而蚁群算法则很好地满足了这些条件。话说回来,很想吐槽一下网络流传的一些蚁群算法的例子,当初学习这个时候,身边也没有相关的书籍,只好到网上找例子。网上关于这个算法源代码的常见的有2个版本,都是出自博客,但是在例子都代码是不完整的,缺失了一部分,但就是这样的例子,居然流传甚广,我很好奇那些转载这些源码的人是否真的有去学习过这些,去调试过。当然,我下面的例子也是无法直接编译通过的,因为涉及到图像读取处理等方面的东西,所以就只贴算法代码部分。但是对于这个问题蚁群算法有一个比较大的缺点,就是收敛很慢,不过对于数量小的路径,效果还是很好的。function bestqueue =aco1(nt,nc_max,m ,st, sd ,Alpha ,Beta ,Rho ,Q,gethead,getend)%参数解释:%nt 路径所经过的点的个数;%nc_max 迭代的次数;%m 蚂蚁的个数;%st 起点序号;%sd 终点序号;%Alpha 信息素系数;�ta 启发因子系数;%Rho 蒸发系数;% Q 信息量;%gethead getend 是用来求距离矩阵的,可根据实际情况修改
% nt = 209;%碎片个数full = zeros(nt,nt);tic;%初始化距离矩阵for i =1:nt for t = 1:nt if i ~= t full(i,t) = sum(abs(getend(:,i) - gethead(:,t))); else full(i,t) = inf; end endend% a =full(156,187)eta = 1./full;%启发因子,取距离的倒数% eta% e = eta(4,2)tau = ones(nt,nt);%信息素矩阵% tabu = zeros(nt,nt);%禁忌矩阵,取蚂蚁数量和碎片数量一致,以减少迭代次数nc =1;%初始化迭代次数;rbest=zeros(nc_max,nt);%各代最佳路线rbest(:,1) = (linspace(st,st,nc_max))';rbest(:,nt) =(linspace(sd,sd,nc_max))'; lbest=zeros(nc_max,1);%各代最佳路线的长度pathlen = 0;%临时记录每代最佳路线长度stime = 1;%记录代数进度for i = 1:nc_max % 代数循环 delta_tau=zeros(nt,nt);%初始化改变量 stime for t = 1:m % 对蚂蚁群体的循环, tabu=zeros(1,nt);%禁忌向量,标记已访问的碎片,初试值设为0,访问之后则变为1; viseted = zeros(1,nt);%记录已访问的元素的位置 tabu(st) = 1;%st为起点,在此表示为碎片矩阵的编号,因为已经将蚁群放在起点,故也应将禁忌向量和位置向量的状态进行修改 tabu(sd) =1;%同上 visited(nt) = sd ;%同上; visited(1) = st;%同上; ht = 0; for r = 2:nt-1 %记录了还没访问的图片编号 vp = 1;%visited指示量 pp = [];%置空的概率向量 jc = 0; %获取尚未访问的位置的向量。 wv = zeros( nt -2 - ht ); for k =1 : nt if tabu(k) == 0 jc = jc +1; wv(jc) = k; end end% a =(tau(visited(end),ju(3))^Alpha)*(eta(visited(end),ju(3))^Beta)% visited(end) %计算选择的概率 for k=1:length(wv) pp(k)=(tau(visited(vp),wv(k))^Alpha)*(eta(visited(vp),wv(k))^Beta);%下一张碎片的选择概率计算,p =(信息素^信息素系数)*(启发因子^启发因子系数) end pp=pp./(sum(pp));%归一化 pcum =cumsum(pp); psl = find(pcum = rand);%轮盘赌法 to_visit= wv(psl(1)) ;%完成选点 tabu(to_visit) =1; visited(r) = to_visit; ht =ht +1;%已访问碎片个数变化 vp =vp+1; end %路径变化信息 %对单个蚂蚁的路径进行统计 sum1 =0; for pr = 1:nt -1 x = visited(pr); y = visited(pr+1) ; sum1 =sum1 + full(x,y); end% vcell{t} =visited;%元胞记录每个蚂蚁的路径,即碎片顺序;% msum(t) = sum1; %信息素变化; for ww=1:(nt-1) delta_tau(visited(ww),visited(ww+1))=delta_tau(visited(ww),visited(ww+1)) + Q/sum1; end% delta_tau(visited(end),visited(1))=delta_tau(visited(end),visited(1))+Q/(sum1/100);% if t == m i == nc_max % bestqueue = visited% end if t == m bestqueue = visited end end tau=(1-Rho).*tau+delta_tau; %完成信息素的更新,找出现有的最新的最佳路径,即信息素最多的路径; stime =stime +1;end toc;
相关问答
Q1: 蚁群算法求解TSP问题遇到“索引超出矩阵维度。”的问题跪求大神能解答
你检查一下坐标矩阵是否出现了重复数值。比如你给的例子中C矩阵的第二个和第三个数值就重复了。
Q2: java俄罗斯方块 代码怎么让电脑自己玩
这个蚁群算法改进java代码你需要设计一套算法了蚁群算法改进java代码,就是比如你现在的电脑模拟人蚁群算法改进java代码,这样根据你自己设计的逻辑推断的路线图,当然你也可以模拟蚁群算法使程序随机出现错误,还有可以用机器学习的方法来模拟
Q3: 写给前辈的一封信
各位有想对前辈说的话,想写封信给前辈们,那么如何给前辈写一封信?下面我整理了写给前辈的一封信,供你参考。
写给前辈的一封信篇一
致豫让前辈的一封信
豫让前辈·:
您好!
每每读到您屡刺赵襄子,竟不惜吞炭,辞家,我便不禁为您扼腕——您真的太傻了!
其原因有三:
1. 不顾后果。别说在春秋战国,即使在当今,做了好事,纵然,是真心所为,也会招人揣度——“这小子一定是居心不良,想要得到赵襄子的赏识吧。”“很有可能!这小子竟吞炭报主,说他是真心的·,谁也不信呀!:”“没准他走投无路了,想诳上赵襄子!”“世态炎凉呀!”先生,你还真别不信,一切皆有可能,一不小心,你没准就会被人“人肉”了。先生,您说您冒天下之大不韪去博这个恶名是不是傻?
2. 是非观念混淆。就算您要报恩,也要先掂量掂量吧,
咱21世纪啥子最重要?地球人都知道——monkey!,神马感恩不感恩,知遇不知遇的,有钱才是硬道理,在金钱的威压下,无价的爱情,不也变成了“宁愿坐在宝马车上哭,不愿坐在自行车上笑”吗?高尚的师德,不也演变为一切以金钱为重吗?改变命运的知识,可以买到,享誉终身的名声,可以买到。因为有钱,所以高尚;因为有钱,所以高尚。您既有能力,又有机会,竟为了一个小小的智伯而是大好机会白白葬送,大把大把的钞票从手中流过,何其愚也?
3. 不信前人之言。身体是革命的本钱,没有一个好身
体,何谈刺杀?可您却甘愿吞炭,甘愿屡屡以身犯险,置生命于何地,置健康于何地?古有严嵩严分宜,今有许迈永许三多,为了健康,为了生命,皆以身试法,何其勇也,相比之下,您不是太傻了吗?纵有傻子沈浩,白痴王伟,愚人郭明义,但相较之下,还是文强居多,不是吗?
豫让前辈,如果我是您的话,我一定不会做此等既不利人更不利己的傻事·,还望您三思考。
写给前辈的一封信篇二
写给沙叶新前辈的一封信尊敬的沙叶新老师,您好!
首先请允许笔者 自我介绍 。笔者是出生在湖北一个破落农村的一个曾经怀有报效祖国的青年。笔者同时也是一个有七年文学历史的农村青年。
笔者自信有一定的文学才华,但在现实生活的连番跌撞下,也不得不低下曾经傲气十足的头颅。笔者因为在人生的十字路口找不到方向,迷茫困顿下,才不得不写出自己的心声的。最近一个多月,笔者都在网络上发表笔者的想法,但名不见经卷,人微言轻,在这个商业社会,几乎没有那家媒体关注笔者的 事迹 。笔者是一有 故事 的青年。有自己的苦衷,万般无奈之下,只有希冀沙老前辈能够拨冗空闲为笔者奔走宣传一二。
笔者父母皆是穷苦的农民,如今皆已年迈,没有退休金养老,而我目今27岁,依旧是单身光棍一条,依旧身无存款,囊中羞涩。笔者家境贫寒,近乎家徒四壁,盖不起新房,娶不起媳妇,接续香火恐怕也是遥遥无期了。笔者目今还有一些褴褛衣衫遮蔽其身,笔者担忧,再过一两年,笔者要裸奔上街了。
所幸笔者身材修长,算的上一美男子,笔者被逼无奈之下,也不在在乎那么些“礼义廉耻”的三纲五常了,笔者只想哪位富婆(富姐)包养。也许笔者会被骂的狗血淋头,但笔者正因为文学的熏陶,才“理所当然”地下此决定。
27岁还没结婚,这在我们这思想落后的农村来说,无异是一个异数。父母时常劝说我成家立业。但我心里清楚,身为一个男人,没有安身立命的能力,娶妻生子也是枉然。如果没有能耐,就不要结婚,以免给对方往后带来不必要的麻烦。
我打工的时间不是很长,零零散散凑起来,也大约三年时间。即便我离开曾经深深眷恋的学堂,但我一直在坚持着我的文学梦想。
我涉足文学,是从2003年高考失利之后。赋闲在家,读一些闲书,萌发了对文学的特殊 爱好 。持续至今,屈指算来,也就有了七个年头了。虽然时间不算很长,但我深信,我对文学还是有一定程度的造诣!
从古至今,文学都在历史的纷乱变革中,呈现出不可磨灭的地位。虽然有焚书坑儒,有文字狱,有灭佛,但 文化 的薪火相传,并没有因为曾经的兵燹战火,而与琼楼大殿一齐化为焦土。这是文化的幸运,但也有不幸。许多重要的藏书,难免失秩消亡,成为绝响。这不能不说,是文化的遗憾。
《诗经》,《周礼》,《礼记》,《山海经》,《论语》,《墨子》,《庄子》,《老子》,《韩非子》,《列子》,《管子》,二十四史,《资治通鉴》......魏晋南北朝的辞赋,唐诗,宋词,元曲,明清小说......都给我们留下了弥足珍贵的文化奇迹。
中国是四大闻名古国之一。三皇和五帝(黄帝,颛臾,帝喾,唐尧,虞舜),还有盘古开天辟地,女蜗造人,仓颉创字......这些神话 传说 ,都给华夏民族增添了神圣的光彩。
中国有五千年的历史,上下五千年。博大精深的文化渊薮,多元的文化脉络,不是那个民族的文化所能比及的。
班固,班昭,扬雄,庾信,萧乾,司马相如,司马迁,李白,杜甫,贺知章,陆游,白居易,孟浩然,李淳风,袁天罡,李煜,司马光,苏轼,苏洵,苏辙,秦观,韩愈,欧阳修,初唐四杰,竹林七贤......这些伟大的文学家,在历史的长河中,流芳百世,启发着后来者,激励着后来者。
自古文人多寂寞,唯有饮者留其名。作家与文人大都先知先觉,看的社会事物是深刻透彻的,所谓透过现象看本质,窥一斑而知全豹。但文人也有迷惑,蒲松龄一生潦倒不堪,在官场黑暗的科举制度下,用犀利的笔,写下了《聊斋志异》;词人柳咏,潦倒于青楼之中,与歌妓为伍,不能不令人顿生怜悯;杜甫奔波坎坷,命途多蹇;李白怀才不遇,失意中以诗酒聊以自慰......大多是文人的悲哀。但我想,那是古代封建时代的杯具吧。
现代社会,文学在不断萎缩,不知道是商业引起的,还是由于政治引起的,或者是其他。章怡和老前辈说,当今艺术趋于消亡。每个人都心浮气躁,穷人,富人,甚至就连佛家清净之地,也或多或少的沾染了世俗的庸俗之气吧。
穷人在努力工作着,依旧只能养家糊口,能够供给子女上学,也就算是要烧香拜佛,谢天谢地了;富人有的富得流油 ,但大都为富不仁,冷漠,自私,贪婪,即便做慈善事业,也要为自己贴金,为自己的商业做 广告 。官场的水最深,深不可测,不可见底,云波诡谲。佛家清净之地,本该伴随青灯经书,宣扬佛法普照。但不少寺庙却为此敛财,不以为耻。
现在社会的名利观,是史无前例的。人的欲望,如同无底洞,欲壑难填。为了攫取金钱,不择手段,铤而走险,没有了道德基础的束缚。法律的效用只在于富人,并不怎么保护穷人的利益(并非笔者凭空捏造,报纸上的报道屡见不鲜)。前段时间播放的《孔子》,笔者不知道有有没有 教育 作用,但笔者窃以为,人心的净化,不是靠一部《孔子》就能够易如反掌解决的。世风日下,人心欺倒。
真正的知识份子,是不会屈服于权力的。古代许多有气节的文人身上都有的风骨,亦是习以为常的。士为知己者死!
但现今的文人,最注重的还是利益,明哲保身,向世俗权力低头,亦是习以为常的。毕竟文艺是为政治服务。文艺是粘附在政治这张“皮”上的毛。皮之不存,毛将焉附?在易中天老师《劝君免谈陈寅恪》一文中,道出了文人与学术研究者的困惑,尤其是学术研究者的无奈,写 文章 的意义的论述。
笔者亦疑惑何为锦绣文章?何为大作?以下摘录易中天老师《劝君免谈陈寅恪》一文:
所谓“权”,并不等于或只是政治权力,也包括学术权力。它可能是一种行政权力,也可能只是一种话语权力。比如能批给你一大笔科研经费,为你调查研究、收集资料大开方便之门,让你看到别人看不到的东西等等,运用的是行政权力;说一不二,一言九鼎,“说你行你就行,不行也行;说不行就不行,行也不行”,则是在运用话语权力了。话语权力也很厉害呢!它能决定一个人在学术界混得怎么样,能不能混出个名堂来,甚至混不混得下去,同样堪称“生杀予夺”。君不见,多少有着真才实学的人默默无闻,多少有着真知灼见的著作埋没不彰,而某些平庸之辈的平庸之作甚至狗屁不通的东西却被捧上了天,就因为后者掌握了话语权力而前者没有么!行政权力与职位有关,话语权力与地位有关,但在中国现行体制下,两者之间往往有一种说不清楚的瓜葛和猫腻。长期以来,中国的学术活动尤其是学术评价(评奖、评职称、批课题等等),一直在行政化的体制下运作。而且,随着所谓“量化管理”的推行,学术的体制化还有愈演愈烈之势。体制是不由分说的。顺之者昌,逆之者亡。体制也是一视同仁的。无论谁和体制作对,哪怕脱离体制,都将一事无成,甚至连饭都没得吃。?
笔者知道现在才略有明白,自古文人不自由。但笔者又认为,现代社会应该不会重蹈先前的覆辙了吧。然,现实却令笔者不那么乐观。
笔者窃以为,当今考学历,考名牌大学,硕士,博士,博士后,两院院士,都有一个显而易见的目的,那就是学历就是敲门砖。当然,现在这种意义,毕竟减弱了不少。不过,人情世故,起了很犹为重要的作用。如果你不通世故,即便你有经天纬地之才,也说不定会被前仆后继的嫉妒者所菲薄,甚至将你“除”之而后快。
再是“朝廷有人好办事”,权力的诱惑力,不是以人的意志为转移。你有权,别人朝着你的权力尊重你,你没权,别人毫不留情的离开你。所谓人一走,茶就凉,哪管什么周详不周详!笔者想,就是这么个道理吧。
笔者但愿这些庸俗的影响文坛学术界的不成文的潜规则,能够在若干年后,消弭殆尽!
再说一说,古人的天命观。孔子云,不知天命不可以为君子。还有《周易》,《易经》,《推背图》,《烧饼歌》,《梅花诗......淳风,袁天罡的《推背图》据说屡验屡灵,后世帝王皆为之畏忌,也风闻统治者篡改里面的记载。至于刘伯温,笔者想,这应该是没得怀疑的吧。
现代社会是以民主,自由,博爱为主题的多元文化存在。不应该出现什么农村户口,城市户口那么悬虚的工资和福利待遇。《世界人权宣言》不是解说的很清楚么?城市人,农村人,都应该一视同仁。倘若区别对待,那不是背离了《世界人权宣言》吗?还有马克思先生的共产主义的理论么?中国毕竟加入了WTO,人类的普世价值,应该是通用的,不分国界的。因为我是农民,所以我不那么服气!
笔者水木生
写给前辈的一封信篇三
90后准程序员写给前辈们的一封信
作为一个即将步入社会的90后,一直有许多话想对前辈们说....
1.我们的时代?
我们的时代是什么?我觉得就是吃快餐长大的一代,想想70后的那一代程序员,他们那时候没什么网络,没太多的技术,书也没现在这么牛毛,他们有着扎实的基本功,他们玩起内存那叫一个帅,现在呢?生活大爆炸,信息大爆炸,我们这一代人,被太多的信息覆盖,盲目的学习,盲目的崇拜,看着什么都懂,但是又什么都不行,就像魔兽世界老一代的玩家形容我们,吃快餐长大的一代,就像我们这些从《熊猫人之谜》开始玩wow一样,我们也许不明白,当年的魔兽有多好玩,练一个号有多么难,又多么的有乐趣,什么叫副本,什么叫任务,今天的时代,各种所谓的技术,各种工具,各种几个月精通,就像随机副本一样,催肥了我们,也害了我们......
2.我崇拜的程序员
我最崇拜的有两种程序员,一种是把程序员当生活的,他们享受编程,喜欢开源,喜欢linux,喜欢python,用vim,Emacs,写博客,用邮件列表,画 思维导图 ,还经常写写打油诗,把自己比作武林高手,比作诗人,我就很希望自己将来能成为他们那样的人,还有一种程序员,只是用程序挣钱,比如我的一个老师,他的水平就很高,自己接C和c++的项目赚了不少钱,但是当我问起他,用vim还是Emacs,他说没听过,他只用VS,他也从来不写博客,不想把自己的东西贡献出来,他也说,他需要的许多软件都是拿钱都买不到的,开源的根本不能用,只是实现了皮毛,我也挺崇拜他的,我觉得这样的人很聪明,很会挣钱。
3.头痛的简历
简历上有两个最令我头痛的地方,一个是 毕业 院校,一个是项目经历,我上的是一个兰州的普通本科,兰州没什么软件公司,外地的又不来招牌,所以我前几天来到了西安,但是在外人眼里,我们兰州人都是骑骆驼上学的,所以在简历上写这种毕业院校,HR估计看都不会看的。
还有一个就是项目经历,我想说,我没有项目经历,但是我在大学并没有闲着,我是根据自己的 方法 ,去“修炼”,比如,我不看别人的一行代码,去实现贪吃蛇,俄罗斯方块这样的程序,我就开始想,我应该怎么写,我试着先去实现一个能画方格的程序,接着,再去实现一个能根据坐标,画出方格的程序,然后是一个蛇类,移动的算法,输入控制。。。就这样自己想办法一块块构建起来,没有看别人一行代码。之后,有一次,我在书上读到驱动测试编程,我真有种“蓦然回首,那人却在灯火阑珊处”的感觉,在自学了python后,我又试着用pygame来重写,或者用c++用MVC的方式重写贪吃蛇,或者把输入控制的键盘映射,改成可配置的文本文件,或者把控制模块和绘制模块,改成文本流传递消息,这些都是从《UNIX编程艺术》上学来的,在比如,我们上jsp课的时候,我就不明白动态网页的原理,我就开始“计算机考古”,开始看HTTP头,明白动态网页的原理,然后用CGI实现了一个老师布置的jsp作业,虽然被老师批评了,但是我觉得最起码学到了许多。像我们的《计算机图形学》课,老师居然教我们C在DOS下的画图,我觉得那太过时了,我就开始自学OPENGL,然后用WINAPI写一个窗口,把它粘进去,我还常常用像HGE,pygame,来实现一些老师布置的算法程序,把这些算法演示出来,比如蚁群算法,做出来就像游戏一样。我还把《机械迷城》中的几个过不去的迷宫游戏,自己用栈,实现了迷宫算法,或者干脆用pygame写一个自己玩。有一次我在想opengl是如何实现的,我就开始用2d的api写了个3d的程序(使用正交投影),我还用思维导图解决问题,比如这篇博客就是先用思维导图画好的。我就用自己的方式,写了许多“玩具程序”,修炼自己,但是我真没有项目经历,我没有跟老师一起做项目,是因为,我不喜欢跟他们做,他们动不动就跟你讲什么挣钱,什么不挣钱,他们会告诉你,那些大老板,根本不懂程序,但是人家挣许多钱,他们也不愿意把代码写的漂亮,能运行挣钱就行,还都是拼音命名规则,我觉得大学本来就是培养自己兴趣的时候,我觉得我做到了,不过最近就再想,我所做的这些,是不是真的比不上那三个月的项目实习 经验 ?
4.大学的教育
说实话,我真的不喜欢老师们上课的方式,他们大多数就是在读ppt,要么有半节课在骂社会,一切跟程序有关的东西都变得枯燥,他们让背java继承public,protect,private的表,被const指针的各种搭配,在配上static,还背优先级,我觉得,就是应试教育的恶果,我从来都是“记用法,不记规则”的,因为规则这东西,又不是语言的设计者故意刁难你的,肯定自有用途,所以在我的笔记上有“const 引用,能让形参不被copy,提高效率”这句话,不会有“const引用,函数无法修改形参”这句话。
像《 操作系统 》这样的课程,老师天天讲理论,什么哲学家就餐,线程调度,全是在黑板上画,我为了学习操作系统,干脆就自己去学linux系统编程,用用那些api,我觉得这是学习操作系统最好的方式,而且,我觉得linux真的比windows适合学习,linux上有vim这样的编辑器,也有那么多的软件工具,还有man,有管道,等等,许多哲学,不像windows的sdk那么臃肿...
我们这个年纪的人,一开始就是windows,web邮箱,vs,有太多的东西没有经历过,我就喜欢去寻找“过时”的好东西,我把它称之为《计算机考古学》,做一个真正地程序员,了解来龙去脉。
我们学校就是为了大家好就业,给大家的方向都定的j2ee,而我就选择自己的方式,寻找自己的兴趣,我并不是那种浮躁什么都想学,我觉得大学,又不是研究生,也不是什么培训包就业班,本来就应该用自己的方式寻找自己的未来,而且,最后,我还是决定了自己的方向,那就是五个一,一个编辑器vim,一个过程语言c,一个动态语言python,一个无底洞语言c++,一个平台linux...
再有,就是设计模式这东西,不知道为什么,被说的那么神奇,然后大家盲目的崇拜,那些精通java企业级的,好像都要懂设计模式才行,我觉得,本科生就不应该学什么设计模式,能把oop学懂就不错了,oop可不仅仅就是封装,继承,多态这么简单,不管怎样,应该先学会把程序实现出来,许多人没写多少代码,没学懂oop,就开始设计模式。就像一个连与人交流的情商都没有的人去学习什么读心术,企图提高自己的情商,真是可怕,再说了,学了linux,看了《Unix编程艺术》,你可能连oop都不崇拜了...
大学,自己做了许多,也思考了许多,可惜参加了3个月培训的人已经月薪5000了,我来到这里投简历又没人看...
这就是我,一个没上过重点,没有实习经历的90后想说的,我还想说,我热爱程序,希望能找到一个属于自己的工作...
Q4: 最近在学习TSP问题的相关知识,我下载了一个蚁群算法解决的代码,但是这个数据文件我看不懂
EDGE_WEIGHT_TYPE : EUC_2D 二维欧氏距离
NODE_COORD_SECTION就是每个节点的信息,依次分别表示:节点编号,x轴坐标,y轴坐标
Q5: 蚁群算法JAVA版
说明:信息素权重,路径权重和信息素蒸发率对最后的结果影响很大,需要微调。
目前发现2 / 5 / 0.5 能达到稍微让人满意的效果。本程序离完美的ACO还差很远,仅供参考。
本蚁群算法为AS算法。
用法:
1.new一个对象
ACOforTSP tsp = new ACPforTSP(tsp数据文件名,迭代次数,蚂蚁数量,信息素权重,路径权重,信息素蒸发率);
2.用go()方法运行
tsp.go();
ACOforTSP.java
___________________________________________________________________
import java.io.File;
import static java.lang.Math.pow;
import static java.lang.Math.sqrt;
import static java.lang.Math.random;
import java.util.HashMap;
import java.io.FileReader;
import java.io.BufferedReader;
/**
*
* @author dvdface
*/
public class ACOforTSP {
//城市的距离表
private double[][] distance;
//距离的倒数表
private double[][] heuristic;
//启发信息表
private double[][] pheromone;
//权重
private int alpha, beta;
//迭代的次数
private int iterationTimes;
//蚂蚁的数量
private int numbersOfAnt;
//蒸发率
private double rate;
ACOforTSP (String file, int iterationTimes, int numbersOfAnt, int alpha, int beta, double rate) {
//加载文件
this.initializeData(file);
//初始化参数
this.iterationTimes = iterationTimes;
//设置蚂蚁数量
this.numbersOfAnt = numbersOfAnt;
//设置权重
this.alpha = alpha;
this.beta = beta;
//设置蒸发率
this.rate = rate;
}
private void initializeData(String filename) {
//定义内部类
class City {
int no;
double x;
double y;
City(int no, double x, double y) {
this.no = no;
this.x = x;
this.y = y;
}
private double getDistance(City city) {
return sqrt(pow((x - city.x), 2) + pow((y - city.y), 2));
}
}
try {
//定义HashMap保存读取的坐标信息
HashMapInteger, City map = new HashMapInteger, City();
//读取文件
BufferedReader reader = new BufferedReader(new FileReader(new File(filename)));
for (String str = reader.readLine(); str != null; str = reader.readLine()) {
//将读到的信息保存入HashMap
if (str.matches("([0-9]+)(\\s*)([0-9]+)(.?)([0-9]*)(\\s*)([0-9]+)(.?)([0-9]*)")) {
String[] data = str.split("(\\s+)");
City city = new City(Integer.parseInt(data[0]),
Double.parseDouble(data[1]),
Double.parseDouble(data[2]));
map.put(city.no, city);
}
}
//分配距离矩阵存储空间
distance = new double[map.size() + 1][map.size() + 1];
//分配距离倒数矩阵存储空间
heuristic = new double[map.size() + 1][map.size() + 1];
//分配信息素矩阵存储空间
pheromone = new double[map.size() + 1][map.size() + 1];
for (int i = 1; i map.size() + 1; i++) {
for (int j = 1; j map.size() + 1; j++) {
//计算城市间的距离,并存入距离矩阵
distance[i][j] = map.get(i).getDistance(map.get(j));
//计算距离倒数,并存入距离倒数矩阵
heuristic[i][j] = 1 / distance[i][j];
//初始化信息素矩阵
pheromone[i][j] = 1;
}
}
} catch (Exception exception) {
System.out.println("初始化数据失败!");
}
}
class Ant {
//已访问城市列表
private boolean[] visited;
//访问顺序表
private int[] tour;
//已访问城市的个数
private int n;
//总的距离
private double total;
Ant() {
//给访问顺序表分配空间
tour = new int[distance.length+1];
//已存入城市数量为n,刚开始为0
n = 0;
//将起始城市1,放入访问结点顺序表第一项
tour[++n] = 1;
//给已访问城市结点分配空间
visited = new boolean[distance.length];
//第一个城市为出发城市,设置为已访问
visited[tour[n]] = true;
}
private int chooseCity() {
//用来random的随机数
double m = 0;
//获得当前所在的城市号放入j,如果和j相邻的城市没有被访问,那么加入m
for (int i = 1, j = tour[n]; i pheromone.length; i++) {
if (!visited[i]) {
m += pow(pheromone[j][i], alpha) * pow(heuristic[j][i], beta);
}
}
//保存随机到的数
double p = m * random();
//寻找被随机到的城市
double k = 0;
//保存找到的城市
int q = 0;
for (int i = 1, j = tour[n]; k p; i++) {
if (!visited[i]) {
k += pow(pheromone[j][i], alpha) * pow(heuristic[j][i], beta);
q = i;
}
}
return q;
}
private void constructSolution () {
while (n != (distance.length-1) ) {
//选取下一个城市
int p = chooseCity();
//计算总的距离
total += distance[tour[n]][p];
//将选取到的城市放入已访问列表
tour[++n] = p;
//将选取到的城市标记为已访问
visited[p] = true;
}
//回到起点
total += distance[tour[1]][tour[n]];
//将起点加入访问顺序表的最后
tour[++n] = tour[1];
}
private void releasePheromone() {
//释放信息素的大小
double t = 1/total;
//释放信息素
for (int i=1;itour.length-1;i++) {
pheromone[tour[i]][tour[i+1]] += t;
pheromone[tour[i+1]][tour[i]] += t;
}
}
}
public void go() {
//保存最好的路径和路径长度
double bestTotal = Double.MAX_VALUE;
int[] bestTour = new int[distance.length+1];
//新建蚂蚁数组,用来引用所创建的蚂蚁
Ant[] ant = new Ant[numbersOfAnt];
//进行iterationTimes次迭代
while (iterationTimes != 0) {
//初始化新的一批蚂蚁(这里用构造新的蚂蚁代替重置蚂蚁状态)
for (int i=0; inumbersOfAnt; i++) {
ant[i] = new Ant();
}
//进行一次迭代(即让所有的蚂蚁构建一条路径)
for (int i=0; inumbersOfAnt; i++) {
ant[i].constructSolution();
//如果蚂蚁构建的路径长度比上次最好的还好,那么保存这个长度和它所走的路径
if (ant[i].totalbestTotal) {
bestTotal = ant[i].total;
System.arraycopy(ant[i].tour, 1, bestTour, 1, bestTour.length-1);
}
}
//蒸发信息素
evaporatePheromone();
//释放信息素
for (int i=0; inumbersOfAnt; i++) {
ant[i].releasePheromone();
}
//报告本次迭代的信息
System.out.format("本次为倒数第%d次迭代,当前最优路径长度为%10.2f\n",iterationTimes,bestTotal);
//迭代总数减去1,进行下次迭代
iterationTimes--;
}
//输出最好的路径长度
System.out.format("得到的最优的路径长度为:%10.2f\n",bestTotal);
//输出最好的路径
System.out.println("最优路径如下:");
for (int i=1; ibestTour.length; i++) {
System.out.print("→"+bestTour[i]);
}
}
private void evaporatePheromone() {
for (int i = 1; i pheromone.length; i++)
for (int j = 1; j pheromone.length; j++) {
pheromone[i][j] *= 1-rate;
}
}
}
蚁群算法改进java代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于蚁群算法路径规划改进、蚁群算法改进java代码的信息别忘了在本站进行查找喔。








