前言
有人问我,什么是启发式算法?这个说来就话长了。那么,什么是呢?咱今天就来聊聊,并且,假定屏幕前的你只有大一刚学完谭浩强红本本的水平。
从背包问题说起
所谓算法嘛,肯定是要用来求解问题的。因此我们接下来的展开都需要围绕一个问题展开,那么我就用最简单的0-1背包问题( 1-0 knapsack problem)来给大家讲讲吧。
你手头上有个背包,背包的容量有限,只能装 C C C kg的物品。
现在有 N N N个物品摆在你面前,每个物品都有自己的重量 w i w_i wi和价值 v i v_i vi。
好了,现在要你做成决策了:究竟选哪些物品装进背包,才能使得在不超过背包容量的情况下,获得最大的价值呢?
作为一名优秀的大学生,这个问题不会有人看不懂的吧,不会的吧。
好了,现在我们遇到了一个问题,得想想办法来解决它!在此之前我们再讲一点东西,观察上面的问题,能发现什么特点呢?
一般而言,算法所需要解决的问题,都能分成两个部分:
- 目标:什么是目标呢?简单点说就是要优化的东西,比如在上述背包问题中,要优化的就是所选物品的价值,使其最大。
- 决策:顾名思义就是根据目标所作出的决策,比如在这里就是决定选取哪些物品装进我们的背包。
- 约束:那么何又为约束呢?就是说再进行决策时必须遵循的条件,比如上面的背包问题,我们所选取的物品总的重量不能超过背包的容量。要是没有容量的约束,小学生才做选择呢,我全都要!
算例
知道了问题以后,就可以生成问题的算例了。那么什么又是问题的算例呢?就是问题参数的具体化,比如在上述的0-1背包问题中,背包的容量 C = 10 C = 10 C=10,物品个数为 N = 3 N = 3 N=3,各个物品重量为$W=[4, 5, 9] ,