贪心算法案例、np完全问题及java代码实现
贪心算法(greedyalgorithm)是指在解决问题时,每一步都采用最好的或最优的选项(即最有利的),所以是可取的。如果结果是最好或最优的算法。
贪心算法得到的结果往往不是最优结果(有时是最优解),而是相对(接近)最优解。
- 贪心算法没有固定的算法求解框架。该算法的关键是贪心策略的选择。根据不同的问题选择不同的策略。
- 需要注意的是,策略的选择必须没有副作用,即特定国家的选择不会影响之前的情况,而只与当前的情况有关。因此,所采用的贪心策略必须仔细分析,看其是否令人满意且没有后遗症。
比如最短路径问题(第一广度,狄克斯特拉),前面介绍的就是贪心算法,但是在问题策略的选择上,是可以得到最优解的。
基本思路
解决问题的基本思路是:
1.创建一个数学模型来描述问题
2。将要解决的问题分成几个子问题
3。对每个子问题求解,得到子问题
4的局部最优解。将子问题对应的局部最优解组合成所有原问题的近似最优解
假设下面有一门课程,我们希望在一个班级中管理多门课程:
| 课程 | 时间开始 | 结束时间 | 10 |
|---|---|---|---|
| 英语 | 9:30AM | 10:30AM | |
| 数学 | 10AM 11:30AM | 10:30AM :30AM | |
| 音乐 | 11AM | 12PM |
这个问题看似需要花很多心思,但算法其实很简单:
1。选择结束最早的班是本班第一个上课的班。 2、接下来选择第一节课结束后开始的课,最早结束该课。这将是该班的二年级。
重复此操作即可找到答案。这里的选择策略是排序先结束且与上一课不冲突的课程。因为每次都是最早选择最后一个,所以后面的就没有时间了。您拥有的越多,您可以安排的课程就越多。
每节课的选择都是该策略的局部最优解(直到最长时间),所以最终的结果也是近似最优解(本例中就是最优解)。(本案例的代码实现是一个简单的时间对比过程)
案例2
背包问题:有一个容量为35公斤的背包。提供以下物品:
| 商品 | 重量 | 价格 |
|---|---|---|
| 吉他 | 15 | 1500 |
| 音频 | 30 | 3000 |
| 笔记本电脑M❀笔记本电脑M | 1 | 200 |
所需目标是最大化总价值包装好背包,并且不要超过重量。
很容易数,所以只有3项,但实际情况可能有数千项。
与上面使用贪心算法相同。由于总值必须是最大值,因此每次加载最贵的,然后加载下一个最贵的。选择结果如下:
选择:音箱+笔,总价值3000+200=3200
不是最优方案:吉他+笔记本电脑,总价值1500+2000=3500♿策略选择课程有时不太固定,可以如下:
(1)每次选择数值最高的一项,最终权重不超过:
选择:音箱+笔,总值3000+200=3200
(2)每次选择重量最大的,不超过最终重量(有可能只有需要最大重量的才会优先):
选择:音箱+笔,合计值3000 + 200 = 3200
(3) 每次选择数值最大的单位(价格/重量),最终重量不超过:
选择:笔+显示器,总值200 + 2999 = 3199
上面的最终结果并不是最优解。在这种情况下,贪心算法无法得到最优解,只能得到一个近似的最优解,也可以认为是该算法的局限性之一。如果需要得到此类问题的最优解,可以使用动态规划算法(以后更新也可以关注密码公众号,第一时间获取更新信息)。 ?如何选择最少的广播电台,让所有区域都能收到信号。
| 广播站 | 覆盖区域 |
|---|---|
| K1 | ID,NV,UT |
| K2 | WA,ID,MT3NV,CA |
| K4 | NV,UT |
| K5 | CA,AZ |
| ... | ... |
如何找到一组覆盖所有地区的广播电台?听起来很简单,但是却实现了。非常复杂,使用完整方法实现:
(1) 列出每个可能的广播电台的集合,称为功率集。假设总共有n个广播电台,总共有2ⁿ广播电台组合
(2) 在这些集合中,选择覆盖整个区域的最小集合,假设n不存在,但当n太时较大,假设每秒可以计算 10 个子集
| 广播电台数量 n | 子集总数 2ⁿ | 所需时间 | ||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 5 | 32 | 3.2 秒 ♶ ♶1 所需时间 | ||||||||||||||||||||||||||
| 5 | 32 | 3 .2秒♶1年 | ||||||||||||||||||||||||||
| 100 | 1.26 * 100³°?最小设置: (1) 选择广播电台,即覆盖面积最少的电台。如果包含一些覆盖区域也没关系(2)重复第一步,直到覆盖所有区域 这是一个近似算法(近似算法,贪心算法的一种)。如果需要很长时间才能得到精确的最优解,可以使用近似算法。判断近似算法好坏的标准如下:
在这个例子中,贪心算法是一个不错的选择。它不仅运行速度快,而且这个例子的运行时间是 O(n²)。在最坏的情况下,假设有n个广播站,每个广播站覆盖1个区域。 n个区域,总共要查询n*n=O(n²)个。具体实现可以看下面的java代码。
现在,算法选择K1、K2、K3 和 K3。K3、K2、不是所有期望的区域 K5(也许想要的更便宜、更容易实现等) 完整问题 NP案例 4: 旅行商问题 应该从三个城市的推销员开始。如何规划路线以获得最近的道路。 有3个! (阶乘)= 6种可能的条件: 这个与以往寻找最短路径的算法(宽度搜索、狄克斯特拉、Bellman-Ford)最大的区别在于没有固定的源点(起始点),每个节点它可以是一个源点,它必须经过每一个节点,所以如果完整的规则必须找到每一个可能性并进行比较。 如果城市数量为n,则概率为n!,假设每秒处理判断一条路线
使用贪心算法,随机选择从一个城市出发,比如A,每次选择从最近的未到达的城市出发,都可以得到最优解。 首次比较n-1个城市。第二次比较n-2个城市...第n-1次比较1个城市。任何人都不应该进行第n次比较。 0+1+ 2+3+..+(n-1) ≈ O(n²/2)
与上面提到的问题和旅行商问题的集合相同。在数学领域中没有快速获得最优解的解决方案。贪心算法是最好的解决方案。适合解决此类问题。 如何判断问题是否NP完全:1。当元素较少时,运行速度一般都很快,但是随着元素数量的增加,速度会变得很慢。 2.它包括需要计算和比较“所有组合”的情况“通常是一个NP完全问题 3.它不能分成小问题,可能需要考虑各种情况。这可以是一个NP完全问题 4.如果问题包含顺序(如旅行商问题中城市的顺序)且难以求解,则可能是 NP 完全问题 5. 如果问题涉及集合(如广播电台的集合)且为很难解决,可能是 NP 完全问题 6. 如果问题可以转化为覆盖集问题或者旅行商问题,那么问题一定是 NP 完全问题 总结1. 贪心算法可以求局部最优解并尝试这样求解得到全局最优解 2.得到的解可能是近似最优解,但也可能是最优解(区间调度问题、最短路径问题(宽度优先、 狄克斯特拉)) 3.对于NP完全问题,目前没有解决方案可以快速获得最优解 4。面对NP完全问题时,最好的办法就是使用近似算法 5。贪心算法(近似算法)在很多情况下很容易实现。而且效率还不错。 |
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网