关于烘焙面包问题主要思路

1、从问题本身上来看,很容易认为这是一道很简单的0-1整数规划问题。其模型很好得到。三个约束条件,一个目标方程,最终要求解得到的是一个51*51的0-1矩阵,使面包的整体烘焙时间最短。约束条件为:一同烘焙的面包完成时间相差必须在5分钟内,面包箱的体积为40,51个面包都必须烘焙。

2、而事实上,这道题并不简单。最开始以为他是一个背包问题的扩展,体积对应背包的容积,时间对于背包物品的价值。不过,这里的时间不累加,而是取其最大。但是后来我发现这样想是我太单纯了。。。。因为这个问题在求取最优中也包含了分组问题,是一个NP难问题,如果我们穷举所有可能性,这可是n的n次方啊,当然经过一些化简和减枝后,复杂度会降低一些,但是并不能本质改变其不可求解的XX。在lingo计算了6个小时,我睡醒后,我依旧不死心的相尽各种方法求解最优解,才回头。。。

3、不甘心的开始想办法算局部优解,于是觉得0-1背包的贪心还是蛮好的,于是就自己制定了关于烘焙面包的贪心策略,大体意思是,首先极限考虑,本题的最糟糕解为51个面包51次烘烤,在此基础上,我们进行合并,即,求解50烤箱的最优,49个,48个,。。。。n个知道不能合并为止,此时我们认为便得到了我们的“最”优解。由于每一步只减少了一个烤箱,其实,就是相当于,将烤箱中的某个面包合并到其他烤箱中,使这个抵消时间最大即可,如果遍历寻找的话,这个子问题的复杂度貌似也不小,可是,经分析,我们知道,两个较大合并,抵消时间最大,因此按时间排序,是问题转化为O(n)的复杂度,于是整个问题的求解,就真的转化为了O(n2)的复杂度问题。实验证明,速度很快,基本不用等待。

4、当然这样做,漏洞多多的,最大的问题也就是,贪心只保证了每一步求解为最优,而全局却不能保证最优,求得的解到底与最优解差多少,这无从考量。

5、第二问在第一问的基础上求解,即默认装箱的面包不再开箱,保持这样的面包烘烤组合,这个想法很多人都认为他不是觉得最优的,即很可能需要从新组合。但是,我试想用一个反例推翻我的想法,证明需要拆分,没有成功,于是我更加预感强烈的它就是不用拆箱的。等有时间,一定要试着证明一下。

6、后来,老师说这个问题虽然复杂度很高,但是在lingo中,所有运算都是初等运算,那么还是可以求解的,即使变量再多,因此问题就转化为了,将max和min的这种XX,转化初等运算。后来,我试了下,貌似lingo还是解不出来,是我哪里写错了还是老师说的有偏差。。。。

7、本来以为,问题再复杂,用遗传算法这种启发式搜索都是可以求出近似解的,但是这次貌似不是很灵光,应该是我对遗传掌握的不到家吧。。。。有时间在好好看看。

8、最后,针对于这次别人做的东东,想告诫自己一句,凑出来的永远不是你想要的,可扩展的模型才是真XX,不要嫉妒别人硬凑出来比你好一点点的结果,你知道什么是实在的干货。

 

 

补充---2012.8.24

-----------------------

对于用lingo求解,除了将运算全部转为基本运算外,还可以通过减少变量来实现。具体实现是,我们先将面包按照烘焙时间进行排序,然后每个面包向下看齐,即,他只可以和比自己烘焙时间少5分钟以内的面包一起烤。这样,我们每行代表一次烘烤,每一列代表一个面包,则每一行都针对了一个指定的面包,这个面包可以一起烤的对象也是确定的那几个(很少),其他的都可以直接置为0,因此这样便大大减少了变量数量。

 

 

 

 

posted on 2012-08-22 19:45  Vanior  阅读(495)  评论(0编辑  收藏  举报

导航