题目来源见文章《帮一个朋友征集算法代码,大家都来开动你的脑袋发挥你的智慧参与吧》,大家提出了很多算法,很多人说类似百钱买百鸡,这里要讨论一下,拼木头问题和百钱买百鸡问题是很不一样的。
百钱买百鸡问题,每种鸡的数目没有限定,所以你可以用穷举法。
拼木头问题,每一种木头的数目一开始已经给出来了,这样,选用哪些种类的木头,最后会相互影响,如果你一开始总是选择最方便的数据来组合,很有可能陷入局部最优。
拼木头问题是一种典型的优化组合问题,应该用典型的优化算法来解决,例如:模拟退火、禁忌搜索、遗传算法等等。 |
下面的程序用禁忌搜索算法,每次得到的最终组合序列可能都不一样,但是组合个数基本上总是最大(最优)的,不保证每次都是,但是能保证大概率得到最优解,这也是优化算法的一个特点。
原始数据选用了原文中的数据,您可以修改数据,验证算法是否正确
一般情况下程序一分钟左右即可发现最优解,到结束需要运行三分钟左右,运行期间浏览器响应可能会变慢一点,正常现象!
最终答案是可以得到 48 个21米的木头 ,但是组合方法则是数不胜数,可以看出,这里5米木头的数目决定了最终结果。
提示:必须在 Chrome 中跑,别的浏览器没有测试
种类 | 根数 | 长度 |
第一种 | ||
第二种 | ||
第三种 | ||
第四种 | ||
第五种 | ||
拼接长度 | 米 | |
|
相关阅读:
《模拟退火算法应用于最优排列问题和最优组合问题 之 排列篇》
《“十滴水”游戏——求解算法挑战赛:模拟退火,用Javascript跑》
//==========================================