遗传算法求解tsp问题编程题

浅谈编程解决实际问题的常见思想 - 文章 - 伯乐在线
& 浅谈编程解决实际问题的常见思想
现实生活中有很多问题,人为不好解决,但利用计算机速度快,不出错的特性,可以很方便的解决这些问题,下面简单说说我在程序设计中解决实际问题的一些常见思想,高手可以忽略掉,我也是无聊了随便写写而已。
1.枚举最优解时的情况
有很多问题初看很棘手,但经过仔细的分析,可以得出一些显然的结论。
比如下面这个问题: 平面内有上千个点,用一个半径为R的圆去覆盖,最多能覆盖多少点?
很多程序员最暴力的思想就是枚举,当然,利用计算机枚举确实是一种很有效的方法,特别是在数据很小的情况下,不过对于上述问题,如何枚举?枚举圆的位置吗?
确实可以枚举圆的位置,如果不经过思考的话可以再二维正交系内枚举每个点为圆心,然后判断这个圆能覆盖多少圆,最后结果取最大。这个确实是一种方法,不过枚举圆心如何操作?圆心的位置是连续的,不一定是整点这种离散位置。 在数据量小并且精度要求不高的情况下,直接枚举圆心位置不失为一种好方法。 不过稍微分析一下,可以得出这样一个结论,最优解的圆,也就是覆盖点数最多的R半径圆,圆上一定有2个点。
假设最优解的圆上没有2个点,如上图,那么通过微量的平移操作,可以使圆接触平面上的2个点,并且园内的点数不会减少,它的结果不会比圆上没有2个点的情况差,因为只要求最多覆盖多少点,我们可以枚举任意2个点,这样这个半径为R的圆的位置就确定了(在这2点中垂线上,2中情况),再判断下这个圆能覆盖多少点,两两点枚举后取最大,这是一个O(n^3)的算法,1秒内出结果,已经比较高效了。
所以很多时候我们可以分析出最优解是满足哪种情况的,然后利用计算机特性枚举最优解,逆向思维解决问题。
2.动态规划思想
动态规划是一种非常高效的方法,这个编程里面非常非常常见的,不会搜索和动态规划,基本就不会编程。如果能够把一个大的问题划分成若干同类型的小问题,小问题又可以划分为更小的问题,直到问题程度小到一眼就能看出来,那么可以把小问题先求出保存起来,再求大问题,这样的例子相当多,而且利用递归的写法,记忆化深度搜索,很容易实现这种思想。 经典的动态规划还有很多,最长上升子序列,背包问题等等。
如果还有同学不明白动态规划,看下面这一段C语言代码,相信能体会到一些。
/******************
Author: lxgsbqylbk
Function : Get the factorial of integer n (n&=0) 求n的阶乘
//完成动态规划一般2中思路
//1.记忆化深搜
int fac[MAXN];
int F(int n)
return n?(fac[n]?fac[n]:fac[n]=n*F(n-1)):1;
//2.规划方向后求解
int fac[MAXN];
for(fac[0]=1,i=1;i&=N;i++)
fac[i]=fac[i-1]*i;
12345678910111213141516171819202122
/******************Author: lxgsbqylbkFunction : Get the factorial of integer n (n&=0) 求n的阶乘n!=1&& n==0n*(n-1)!&&n&0****/&//完成动态规划一般2中思路//1.记忆化深搜int fac[MAXN];int F(int n){&&&&return n?(fac[n]?fac[n]:fac[n]=n*F(n-1)):1;}&//2.规划方向后求解int fac[MAXN];for(fac[0]=1,i=1;i&=N;i++){&&&&fac[i]=fac[i-1]*i;}
3.排序思想
排序是一个很重要的步骤,有很多问题通过排序预处理后可以更加方便的解决,比如有很多张钞票,面值不同,从中选出m张使它们价值最大,一个做法当然是对着些钞票按照面值从大到小排序,然后取钱m张就行了。 很多时候,上述的动态规划需要对变量按照一定规则排序后才能操作,有一定顺序了之后,问题一般更容易解决。
说到排序,不得不说到贪心算法。 贪心算法就是如果整个大问题要到达一个最优解,在构成大问题的小问题中每次取最优的,大问题就能到达最优情况,当然,这种策略需要经过证明正确性后才能实现。 很多贪心过程前也要有排序的工作,比如著名的Kruscal最小生成树算法,要先对边进行排序,所以排序是个很重要的过程,以至于它被收录到各种语言的库函数中,可以方便的被用户调用。
4.二分,三分。
前几天听同学说,现在8K已经招不到会写二分的程序员了,当然这句话有夸张的成分啦,^-^ 可见二分在程序设计中的常用性。
其实这个可以并列到枚举算法那中,只是这种枚举效率很高,很多地方比如SQL数据库里面的查找方式就是二分,二分枚举,三分枚举,时间复杂度都是对数级的,在程序设计中是相当高效的算法。
二分的条件:数据的单调性。 比如在一组从小到大排序的数中寻找数x 这样就可以二分枚举 每次可以把范围缩小一半,无论数据多大,就算超出int类型,都能很快找出来。
比如求函数8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == K 在区间[0,100]的解 由于这个函数在[0,100]是单调递增的,所以二分是个不错的选择。
三分的条件: 数据的有凸性。
比如求函数6*x^7 + 8*x^6 + 7*x^3 + 5*x^2 – K*x 在区间[0,100]的最小值
这个函数在[0,100]是一个先减后增(或者完全单调,主要看K)的函数,所以三分求解。
当然这个问题可以转换为二分,将函数求导,二分其在0的位置即可,这个涉及到高等数学,不赘述了。
具体过程可以去查资料 二分前一般也需要排序操作的。
5.随机算法
很多时候在要解决的问题没有任何思路,枚举数据量又太大的情况下,可以使用一些随机算法。
常见的随机算法,蚁群算法,模拟退火等等。
简单说说模拟退火(后面我打算专门写一篇模拟退火的随笔)
比如平面内有成千上万个点,要在平面选一个圆,覆盖所有点,问最小的半径是多少?
第一次接触这个问题的时候我有想到一种做法(不敢保证正确):
根据1 还是可以得出结论,最优情况圆上面一定有2个点,否则的话可以把圆继续缩小平移,使它上面有2个点,结果更优。
所以枚举任意2个点,圆心一定在这2点中垂线上,这里是对的。 然后假设这个圆心在在中垂线上移动,如果满足要求,包围了所有点。
那么我猜测这个圆在移动过程中半径先减小后增大。(感觉而已,未证明,也未测试,太麻烦了。) 这里可以使用上述的三分枚举,因为半径函数是下凸性的。
我上面这个方法正确性先不说,复杂度是有一点的,枚举2点,再三分。O(n^2*logV) 当然,数据很小的情况下,比如只有几千个点的话,结果秒出,数据大了,效率降低了。
这里说一下模拟退火的思想。 大概依照一个这样的理论,假设现在有1个位置pos,如果最优解圆心位置在pos上面,那么如果往pos下面搜,搜到的圆心一定比在pos的位置时候大。
依照这个理论,我们就可以现在平面内随机生成一些点,然后贪心的随机移动它们,直到达到一定程度停止。这个算法在时间复杂度上是O(n)的 正确性很高,运行也相当的快。
6.最后一个问题转化
有的时候遇到问题,不能立即想出策略,这个时候尝试下将这个问题转化为常见的模型,利用常见模型和经典的算法解决它。
最常见的还是一些图论上的问题,将实际问题转化为流网络或者二分图。
可能感兴趣的话题
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2016 伯乐在线50道C++编程练习题及解答_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
50道C++编程练习题及解答
上传于||暂无简介
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩5页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢求翻译编程题目 | Hello world!小组 | 果壳网 科技有意思
126902人加入此小组
# By Sam the Great from forums# That freaking superhero has been frequenting Udacity# as his favorite boss battle fight stage. The 'Udacity'# banner keeps breaking, and money is being wasted on# repairs. This time, we need you to proceduralize the# fixing process by building a machine to automatically# search through debris and return the 'Udacity' banner# to the company, and be able to similarly fix other goods.# Write a Python procedure fix_machine to take 2 string inputs# and returns the 2nd input string as the output if all of its# characters can be found in the 1st input string and "Give me# something that's not useless next time." if it's impossible.# NOTE: # If you are experiencing difficulties taking # this problem seriously, please refer back to # "Superhero flyby", the prequel, in Problem Set 11.# TOOLS: # if statement # while loop # string operations # Unit 1 Basics# BONUS: # # 5***** # If you've graduated from CS101,# Gold # try solving this in one line.# Stars! #def fix_machine(debris, product): ### WRITE YOUR CODE HERE ###### TEST CASES ###print "Test case 1: ", fix_machine('UdaciousUdacitee', 'Udacity') == "Give me something that's not useless next time."print "Test case 2: ", fix_machine('buy me dat Unicorn', 'Udacity') == 'Udacity'print "Test case 3: ", fix_machine('AEIOU and sometimes y... c', 'Udacity') == 'Udacity'print "Test case 4: ", fix_machine('wsx0-=mttrhix', 't-shirt') == 't-shirt' 小弟英语不怎么好 谁能翻译下问题 谢谢
+ 加入我的果篮
写一个Python方法 fix_machine有两个字符串输入如果第二个字符串中所有的字符都可以在第一个字符串找到返回第二个字符串如果不能,返回 "Give me something that's not useless next time."你可以使用ifwhile字符串操作Unit1的所有内容加分:自认学过Conputer science 101 的家伙,有种一行给我写出来def fix_machine(debris, product):### WRITE YOUR CODE HERE ###### TEST CASES ###print "Test case 1: ", fix_machine('UdaciousUdacitee', 'Udacity') == "Give me something that's not useless next time."print "Test case 2: ", fix_machine('buy me dat Unicorn', 'Udacity') == 'Udacity'print "Test case 3: ", fix_machine('AEIOU and sometimes y... c', 'Udacity') == 'Udacity'print "Test case 4: ", fix_machine('wsx0-=mttrhix', 't-shirt') == 't-shirt'英语捉鸡还混Udacity?你前几棵都怎么过来的?
我表示只是这个题目单词太多 不想认真看 就来这边求助求助,省得烦了
引用 的话:我表示只是这个题目单词太多 不想认真看 就来这边求助求助,省得烦了唉。。。。。。。。。。。第一段Copyright直接略过,第二段就只有几十个字么。。。。。。。。。
google翻译不用?
智能科学专业
引用 的话:google翻译不用?也真是难得你有耐心。。。。下次遇到这种直接伸手的完全应该拒绝。。。。居然懒得自己看要麻烦别人看。。。别人的时间也是时间啊。。。
引用 的话:也真是难得你有耐心。。。。下次遇到这种直接伸手的完全应该拒绝。。。。居然懒得自己看要麻烦别人看。。。别人的时间也是时间啊。。。重点是我看过没多久。。。。。。。这是Udacity上的Introduction to CS主要就是讲Python和基本编程思想的作为一个在GAE上入门Python的野生程序员,偶尔也想找找组织,理理结构,重新发明一下轮子的(感叹Google的例程写得真够好,VPS平台的Doc居然能教语言。。。)(还是应该感叹Python是真-业界良心,真正为程序员设计的语言,其他语言的程序员学Python一点就通呢?)Udacity上直接挑Quiz看。。。。。。
(C)2016果壳网&&&&京ICP证100430号&&&&京网文[-239号&&&&新出发京零字东150005号第1章计算机与程序设计/11.1什么是计算机/11.2如何存储程序/41.2.1存储单位/41.2.2存储方式/41.2.3存取操作/51.2.4存储器分类/51.2.5文件与目录/51.3软件与程序设计/71.4典型程序演示/91.5程序设计方法/101.5.1结构化方法/101.5.2面向对象方法/111.6程序设计语言/111.7C/C++语言简介/141.8C/C++结构化程序设计基本环境/16小结/18概念理解/18基本功训练/19第2章数据类型与变量——程序设计入门/202.1在屏幕上输出文字信息/202.1.1C语言程序的基本框架/212.1.2注释/222.1.3预处理指令/222.1.4主函数——应用程序的入口/232.1.5转义序列/232.1.6保留字与分隔符/242.1.7标准输出函数/242.2计算两个固定整数的和与积/252.2.1输出列表和占位符/272.2.2数据类型——整型/282.2.3常量与变量/292.2.4算术运算和算术表达式/312.2.5赋值语句/312.2.6程序设计的风格/322.3计算任意两个整数的和与积/332.3.1标准输入函数/342.3.2测试用例/352.3.3程序的顺序结构/362.4温度转换/372.4.1变量的初始化/392.4.2运算的优先级和结合性/412.5求两个整数的平均值/422.5.1浮点型数据/442.5.2浮点型数据的...
直属事业部
扫描关注官方微博
扫描关注官方微信
版权所有(C)2014 清华大学出版社有限公司 京ICP备号 京公网安备48号VB编程题 (有答案)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
VB编程题 (有答案)
上传于||文档简介
&&V​B​编​程​题​答​案
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 遗传算法求解tsp问题 的文章

 

随机推荐