设计模型的基本步骤:
1、整理手头资料,将“甲方”的需求文档归为“目标”和“约束”两部分。
2、根据目标的内容,再把“显性”的目标,“隐性”的目标全部找出来。有时候甲方不了解数学模型结构,可能把一部分目标隐藏在文字里了,要自己去理解和挖掘清楚。
3、把可以用数学公式刻画的目标全部整理出来,并尝试给出刻画公式的一个“母版”,目标确定的话也就意味着决策变量定下来了。
4、把可以纳入优化问题一起求解的目标函数和只适合做实验完成后对“求解方案”做测验的“困难”目标分离开来,构造出这部分“困难”目标的简单的“近似”的目标,添加到优化目标组里。
5、整理约束,尽量把能够用数学公式刻画的约束全部整理出来,并刻画清楚。把不能够用,或者不适合用数学公式刻画的约束作为筛选可行解的“规则”,这部分“规则”约束一般都是通过结合一些“启发式”算法求解的。“规则”里常常带有一些行业经验在里面,有些经验有用但是不是说的很清楚,要通过一些“模拟”实验以统计的方式掌握到一些关键数据,因为就算是“规则”性约束,其本质一定是可以用数学去量化后,再刻画的。启发式算法一个很大优势就是可以在一个非常非常庞大的求解空间里,根据“规则”条件快速地找到一些不错的可行解,相当于把一个大海缩小成了一个湖泊。而且这个湖泊中的解都是比较不错的。但是启发式算法在寻找“最优解”上先天不足,没理论保证,既不能保证一定找到最优解,不能了解最优解的性质,也不能保证收敛到最优解的算法复杂度。所以原问题经启发式算法辅助求解后,从“大海捞针”问题转变成了“湖泊捞针”或者“池塘捞针”,这时候有理论保证的较成熟的优化技术就可以上场了。
我们一起讲解一下数学模型的三个基本部件,即目标、约束、变量。
目标:
对于优化目标组里的目标,我们要知道什么是“好目标”或者“易求解目标”,什么是“坏目标”或者是“难求解目标”?按从好到坏区分可以排列如下:
线性目标>二次凸目标>一般非线性凸目标>有结构特点的非凸目标(凸目标+非凸目标的组合目标,且非凸部分可以比较容易找到还可以的凸逼近)>结构特点不清晰的非凸目标
约束:
对于约束条件,我们也要大致分清楚什么是“好约束”,什么是“坏约束”?
首先好约束一般说的是线性约束。线性约束里又有很多内在区别。我们可以通过例子来大致体会一下那些约束是好的,哪些约束不好?
1:网络优化问题中,有一类约束其对应的矩阵是全单模的,这种约束就是好约束,因为这样的问题有成熟的快速求解算法,而且其整数解与实数解一致,不惧怕变量从小数变成整数。
2:背包约束,相对于上面这个约束就会显得稍微差些。如果这两种约束出现在同一个优化问题中,一般用Danzig-Wolfe方案分离成主问题和子问题,然后“交替”求解。
3:约束一定要“紧”,意思是说一旦变量由小数空间变成整数空间,那么小数解和整数解的“距离”不太远。例如:“clique约束”这种捆绑式约束就比将其拆开成一个个小约束,然后排列在一起要好得多,因为前者这个约束做得更“紧”
变量:
这个很好理解,整数变量肯定比小数变量要求解困难。一旦这两种变量出现在同一个优化问题中时,一般采用Benders-Decomposition方案将这种变量分开出来,做成主问题和子问题的形式,然后“交替”求解。
优化理论既核心又较难以理解的部分:
能够化解同时具备“简单约束”和“困难约束”、“整数变量”和“实数变量”矛盾,将他们恰当“分离”求解的优化理论就是对偶理论,所以对偶理论对于求解实际问题是非常重要的。