Code前端首页关于Code前端联系我们

贪心算法案例、np完全问题及java代码实现

terry 2年前 (2023-09-27) 阅读数 64 #数据结构与算法

贪心算法(greedyalgorithm)是指在解决问题时,每一步都采用最好的或最优的选项(即最有利的),所以是可取的。如果结果是最好或最优的算法。

贪心算法得到的结果往往不是最优结果(有时是最优解),而是相对(接近)最优解。

  • 贪心算法没有固定的算法求解框架。该算法的关键是贪心策略的选择。根据不同的问题选择不同的策略。
  • 需要注意的是,策略的选择必须没有副作用,即特定国家的选择不会影响之前的情况,而只与当前的情况有关。因此,所采用的贪心策略必须仔细分析,看其是否令人满意且没有后遗症。

比如最短路径问题(第一广度,狄克斯特拉),前面介绍的就是贪心算法,但是在问题策略的选择上,是可以得到最优解的。

基本思路

解决问题的基本思路是:

1.创建一个数学模型来描述问题

2。将要解决的问题分成几个子问题

3。对每个子问题求解,得到子问题

4的局部最优解。将子问题对应的局部最优解组合成所有原问题的近似最优解

假设下面有一门课程,我们希望在一个班级中管理多门课程:

课程 时间开始 结束时间 10
英语9:30AM10:30AM
数学10AM 11:30AM 10:30AM :30AM
音乐11AM12PM

这个问题看似需要花很多心思,但算法其实很简单:

1。选择结束最早的班是本班第一个上课的班。 2、接下来选择第一节课结束后开始的课,最早结束该课。这将是该班的二年级。 贪婪算法案例、np完全问题及java代码实现

重复此操作即可找到答案。这里的选择策略是排序先结束且与上一课不冲突的课程。因为每次都是最早选择最后一个,所以后面的就没有时间了。您拥有的越多,您可以安排的课程就越多。

每节课的选择都是该策略的局部最优解(直到最长时间),所以最终的结果也是近似最优解(本例中就是最优解)。(本案例的代码实现是一个简单的时间对比过程)

案例2

背包问题:有一个容量为35公斤的背包。提供以下物品:

商品重量价格
吉他151500
音频303000
笔记本电脑M❀笔记本电脑M1200

所需目标是最大化总价值包装好背包,并且不要超过重量。

很容易数,所以只有3项,但实际情况可能有数千项。

与上面使用贪心算法相同。由于总值必须是最大值,因此每次加载最贵的,然后加载下一个最贵的。选择结果如下:

选择:音箱+笔,总价值3000+200=3200

不是最优方案:吉他+笔记本电脑,总价值1500+2000=3500♿策略选择课程有时不太固定,可以如下:

(1)每次选择数值最高的一项,最终权重不超过:

选择:音箱+笔,总值3000+200=3200

(2)每次选择重量最大的,不超过最终重量(有可能只有需要最大重量的才会优先):

选择:音箱+笔,合计值3000 + 200 = 3200

(3) 每次选择数值最大的单位(价格/重量),最终重量不超过:

选择:笔+显示器,总值200 + 2999 = 3199

上面的最终结果并不是最优解。在这种情况下,贪心算法无法得到最优解,只能得到一个近似的最优解,也可以认为是该算法的局限性之一。如果需要得到此类问题的最优解,可以使用动态规划算法(以后更新也可以关注密码公众号,第一时间获取更新信息)。 ?如何选择最少的广播电台,让所有区域都能收到信号。

广播站覆盖区域
K1ID,NV,UT
K2WA,ID,MT3NV,CA
K4 NV,UT
K5CA,AZ
......
贪婪算法案例、np完全问题及java代码实现

如何找到一组覆盖所有地区的广播电台?听起来很简单,但是却实现了。非常复杂,使用完整方法实现:

(1) 列出每个可能的广播电台的集合,称为功率集。假设总共有n个广播电台,总共有2ⁿ广播电台组合

(2) 在这些集合中,选择覆盖整个区域的最小集合,假设n不存在,但当n太时较大,假设每秒可以计算 10 个子集

广播电台数量 n 子集总数 2ⁿ 所需时间
5323.2 秒 ♶ ♶1 所需时间
5323 .2秒♶1年
100 1.26 * 100³°?最小设置:

(1) 选择广播电台,即覆盖面积最少的电台。如果包含一些覆盖区域也没关系(2)重复第一步,直到覆盖所有区域

这是一个近似算法(近似算法,贪心算法的一种)。如果需要很长时间才能得到精确的最优解,可以使用近似算法。判断近似算法好坏的标准如下:

  • 速度有多快?
  • 得到的近似解与最优解有多接近?度

在这个例子中,贪心算法是一个不错的选择。它不仅运行速度快,而且这个例子的运行时间是 O(n²)。在最坏的情况下,假设有n个广播站,每个广播站覆盖1个区域。 n个区域,总共要查询n*n=O(n²)个。具体实现可以看下面的java代码。

广播电台数量n子集总数2ⁿ劳累需要时间贪心算法
5323’秒3.2秒。 102.4 秒 10 秒
3232 13.6 年 102.4 秒
100324x10²3 年1000 秒

现在,算法选择K1、K2、K3 和 K3。K3、K2、不是所有期望的区域 K5(也许想要的更便宜、更容易实现等)

完整问题 NP

案例 4:

旅行商问题

应该从三个城市的推销员开始。如何规划路线以获得最近的道路。 贪婪算法案例、np完全问题及java代码实现

有3个! (阶乘)= 6种可能的条件:

A->B->C
A->C->B
B->A->C
B->C->A
C->A->B
C->B->A
复制代码

这个与以往寻找最短路径的算法(宽度搜索、狄克斯特拉、Bellman-Ford)最大的区别在于没有固定的源点(起始点),每个节点它可以是一个源点,它必须经过每一个节点,所以如果完整的规则必须找到每一个可能性并进行比较。

如果城市数量为n,则概率为n!,假设每秒处理判断一条路线

n个共n!♿♿♸1 2秒需要42

使用贪心算法,随机选择从一个城市出发,比如A,每次选择从最近的未到达的城市出发,都可以得到最优解。

首次比较n-1个城市。第二次比较n-2个城市...第n-1次比较1个城市。任何人都不应该进行第n次比较。

0+1+ 2+3+..+(n-1) ≈ O(n²/2)

总计 n总计 n!累了需要时间‸累了需要时间 120秒12.5秒
103242天50秒

与上面提到的问题和旅行商问题的集合相同。在数学领域中没有快速获得最优解的解决方案。贪心算法是最好的解决方案。适合解决此类问题。

如何判断问题是否NP完全:

1。当元素较少时,运行速度一般都很快,但是随着元素数量的增加,速度会变得很慢。 2.它包括需要计算和比较“所有组合”的情况“通常是一个NP完全问题 3.它不能分成小问题,可能需要考虑各种情况。这可以是一个NP完全问题 4.如果问题包含顺序(如旅行商问题中城市的顺序)且难以求解,则可能是 NP 完全问题 5. 如果问题涉及集合(如广播电台的集合)且为很难解决,可能是 NP 完全问题 6. 如果问题可以转化为覆盖集问题或者旅行商问题,那么问题一定是 NP 完全问题

总结

1. 贪心算法可以求局部最优解并尝试这样求解得到全局最优解

2.得到的解可能是近似最优解,但也可能是最优解(区间调度问题、最短路径问题(宽度优先、 狄克斯特拉))

3.对于NP完全问题,目前没有解决方案可以快速获得最优解

4。面对NP完全问题时,最好的办法就是使用近似算法

5。贪心算法(近似算法)在很多情况下很容易实现。而且效率还不错。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门