悄然无声的 Blog
不是我不明白,这世界变化快!

题目来源见文章《帮一个朋友征集算法代码,大家都来开动你的脑袋发挥你的智慧参与吧》,大家提出了很多算法,很多人说类似百钱买百鸡,这里要讨论一下,拼木头问题和百钱买百鸡问题是很不一样的

 

百钱买百鸡问题,每种鸡的数目没有限定,所以你可以用穷举法。

 

拼木头问题,每一种木头的数目一开始已经给出来了,这样,选用哪些种类的木头,最后会相互影响,如果你一开始总是选择最方便的数据来组合,很有可能陷入局部最优。

 

拼木头问题是一种典型的优化组合问题,应该用典型的优化算法来解决,例如:模拟退火、禁忌搜索、遗传算法等等。

 

下面的程序用禁忌搜索算法,每次得到的最终组合序列可能都不一样但是组合个数基本上总是最大(最优)的,不保证每次都是,但是能保证大概率得到最优解,这也是优化算法的一个特点。

 

原始数据选用了原文中的数据,您可以修改数据,验证算法是否正确

 

一般情况下程序一分钟左右即可发现最优解,到结束需要运行三分钟左右,运行期间浏览器响应可能会变慢一点,正常现象!

 

最终答案是可以得到 48 个21米的木头 ,但是组合方法则是数不胜数,可以看出,这里5米木头的数目决定了最终结果。

 

提示:必须在 Chrome 中跑,别的浏览器没有测试

种类 根数 长度
第一种
第二种
第三种
第四种
第五种
拼接长度


相关阅读:

《模拟退火算法应用于最优排列问题和最优组合问题 之 排列篇》

《“十滴水”游戏——求解算法挑战赛:模拟退火,用Javascript跑》 

//==========================================
posted on 2011-06-22 22:08  左洸  阅读(2115)  评论(2编辑  收藏  举报