贪心算法 未完
核心思想
假设一个问题比较复杂,暂时找不到全局最优解,那么我们可以考虑把原问题拆分成几个小问题(分而治之思想),分别求每个小问题的最优解,将这些局部最优解当作原问题的解,注意: 这样得到的解不一定是原问题全局的最优解。
总的来说,可以分为三步:
第一步
明确到底什么是最优解
第二步
明确什么是子问题的最优解
第三步
分别求出子问题的最优解再堆叠出全局最优解
例子
有一个背包,最多能承载150斤的重量,现在有7个物品
重量依次为 35,30,60,50,40,10,25
价值依次为 10,40,30,50,35,40,30
应该怎么选择才能使得我们的背包背走最大价值的物品?
我们按照上面的三步来分析:
第一步
问题的最优解是:在重量限制范围内,选择价值最大的物品
第二步
子问题的定义有很多种 ,以下列举三种:
一:认为的局部最优解是:每次都选择当前价值最多的物品
二:认为的局部最优解是:每次都选择当前重量最小的物品
三:认为的局部最优解是:每次都选择当前价值密度最大的物品,也就是物品单位重量的价值:价值/重量
第三步
按照制订的规则(价值最大)进行计算,顺序是:4 2 6 5
最终的总重量是:130
最终的总价值是:165
按照制订的规则(重量最小)进行计算,顺序是:6 7 2 1 5
最终的总重量是:140
最终的总价值是:155
按照制订的规则(单位密度最大)进行计算,顺序是:6 2 7 4 1
最终的总重量是:150
最终的总价值是:170
可以看到,单位密度这个策略比之前的价值策略和重量策略都要好。
贪心算法三个核心问题
一:为什么不直接求原问题的最优解
答 因为原问题过于复杂,无法直接计算全局最优解
这里总结一下使用贪心算法的前提:
1、原问题复杂度过高,求全局最优解的数学模型难以建立;
2、求全局最优解的计算量过大;没有太大必要一定要求出全局最优解,“比较优”就可以。那么几乎都可以使用贪心算法的思想来解决问题。
二:怎么将原问题分解成小问题
答
按串行任务分
时间串行的任务,按子任务来分解,即每一步都是在前一步的基础上再选择当前的最优解。
按规模递减分
规模较大的复杂问题,可以借助递归思想,分解成一个规模小一点点的问题,循环解决,当最后一步的求解完成后就得到了所谓的“全局最优解”。
按并行任务分
这种问题的任务不分先后,可能是并行的,可以分别求解后,再按一定的规则(比如某种配比公式)将其组合后得到最终解。
三:怎么判断贪心算法结果是否接近最优解
答 这个其实没有绝对的判断标准,因为正是因为全局最优解难以计算,所以才选择的贪心算法去求局部最优解,根据计算局部最优解的规则不同,所求的结果也可能有所不同,只能在程序能接受的范围内、以及不同计算规则所得结果来进行取舍
你是故意找茬儿是不是?你要不要吧!