贪心算法与应用
我们遇到各种类型的计算问题,每一种都需要不同的技术来解决。需要最大或最小结果的问题是优化问题。
解决优化问题的方法大致有三种:
1.贪心法
2.动态规划
3. 分支定界技术
本文将介绍贪心方法、贪心算法的属性以及在任何问题上实现贪心方法的步骤。
什么是贪心算法?
它只是意味着选择一个目前看起来最好的选择/解决方案(贪婪)。当我们想要一个即时的情况时,这种技术最适合。它有助于解决优化问题,即给出最小结果或最大结果。
满足问题中条件的解是可行解。在所有可能的可行解中具有最小成本的解是最优解,即它是最佳解。
贪心算法的目标是找到最优解。只能有 1 个最优解。
例如:
让我们考虑集装箱装载问题的例子。
在集装箱装载问题中,一艘大型船舶装载货物。货物有大小相同但重量不同的集装箱。该船的载货量为cp。
我们需要将集装箱装载到船上,以使船上有最大的集装箱。
例如,假设总共有 4 个容器的重量:w1=20, w2=60, w33=40, w4=25。
让 cp = 80。然后,为了加载最大容器,我们将加载 container-1、3、4。
贪心算法的历史
贪心算法最初是由荷兰计算机科学家和数学家 Edsger W. Dijkstra 在计算最小生成树时创造的。许多贪心算法的主要目的是解决基于图的问题。
贪心算法在 1950 年代首次出现。当时的科学家 Prim 和 Kruskal 在这十年中也实现了最小化图成本的优化技术。
几年后,在 1970 年代,许多美国研究人员提出了解决贪心问题的递归策略。2005 年,NIST 记录将贪心范式注册为单独的优化策略。
从那时起,贪心算法被广泛应用于多个领域,包括开放最短路径优先(OSPF)等网络协议和许多其他网络数据包交换协议。
贪心算法的工作
贪心算法在不同阶段工作,并在进行时一次考虑一个输入。在每个阶段,我们都试图为我们的问题找到一个可行的解决方案,一个对那个时候的算法有好处的解决方案。这意味着我们为每个子任务做出局部最优选择。这些局部最优选择最终导致我们为我们的问题找到全局最优选择,我们称之为最终最优解。
最简单的贪心算法的伪代码如下所示:
算法贪心( A,n )
{
解决方案:= φ; //初始化解决方案
对于i:= 1到 n做
{
x :=选择(一) ;
如果可行( solution,x )那么
解决方案:=联合(解决方案,x );
}
返回解决方案;
}