精华内容
下载资源
问答
  • 搜索最优解算法之贪心算法

    万次阅读 2016-05-03 21:21:21
    贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。[1]  贪婪算法可解决的问题通常大部分都
    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解迪杰斯特拉算法是贪心算法的一个典型案例。
    贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。[1] 
    ⑴随着算法的进行,将积累起其它两个集合:一个包含已经被考虑过并被选出的候选对象,另一个包含已经被考虑过但被丢弃的候选对象。
    ⑵有一个函数来检查一个候选对象的集合是否提供了问题的解答。该函数不考虑此时的解决方法是否最优。
    ⑶还有一个函数检查是否一个候选对象的集合是可行的,也即是否可能往该集合上添加更多的候选对象以获得一个解。和上一个函数一样,此时不考虑解决方法的最优性。
    ⑷选择函数可以指出哪一个剩余的候选对象最有希望构成问题的解。
    ⑸最后,目标函数给出解的值。
    ⑹为了解决问题,需要寻找一个构成解的候选对象集合,它可以优化目标函数,贪婪算法一步一步的进行。起初,算法选出的候选对象的集合为空。接下来的每一步中,根据选择函数,算法从剩余候选对象中选出最有希望构成解的对象。如果集合中加上该对象后不可行,那么该对象就被丢弃并不再考虑;否则就加到集合里。每一次都扩充集合,并检查该集合是否构成解。如果贪婪算法正确工作,那么找到的第一个解通常是最优的。

    基本思路

    编辑
    迪杰斯特拉算法:
    1.建立数学模型来描述问题
    ⒉把求解的问题分成若干个子问题。
    ⒊对每一子问题求解,得到子问题的局部最优解。
    ⒋把子问题的解局部最优解合成原来解问题的一个解。
    实现该算法的过程:
    从问题的某一初始解出发;
    while 能朝给定总目标前进一步
    do
    求出可行解的一个解元素;
    由所有解元素组合成问题的一个可行解。
    下面是一个可以试用贪心算法解的题目,贪心解的确不错,可惜不是最优解。

    例题分析

    编辑
    例题1、
    [0-1背包问题]有一个背包,背包容量是M=150。有7个物品,物品不可以分割成任意大小。
    要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
    物品 A B C D E F G
    重量 35kg 30kg 6kg 50kg 40kg 10kg 25kg
    价值 10$ 40$ 30$ 50$ 35$ 40$ 30$
    分析:
    目标函数:∑pi最大
    约束条件是装入的物品总重量不超过背包容量:∑wi<=M(M=150)
    ⑴根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优?
    ⑵每次挑选所占重量最小的物品装入是否能得到最优解?
    ⑶每次选取单位重量价值最大的物品,成为解本题的策略。
    值得注意的是,贪心算法并不是完全不可以使用,贪心策略一旦经过证明成立后,它就是一种高效的算法。
    贪心算法还是很常见的算法之一,这是由于它简单易行,构造贪心策略不是很困难。
    可惜的是,它需要证明后才能真正运用到题目的算法中。
    一般来说,贪心算法的证明围绕着:整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的。
    对于例题中的3种贪心策略,都是无法成立(无法被证明)的,解释如下:
    ⑴贪心策略:选取价值最大者。
    反例
    W=30
    物品:A B C
    重量:28 12 12
    价值:30 20 20
    根据策略,首先选取物品A,接下来就无法再选取了,可是,选取B、C则更好。
    ⑵贪心策略:选取重量最小。它的反例与第一种策略的反例差不多。
    ⑶贪心策略:选取单位重量价值最大的物品。
    反例:
    W=30
    物品:A B C
    重量:28 20 10
    价值:28 20 10
    根据策略,三种物品单位重量价值一样,程序无法依据现有策略作出判断,如果选择A,则答案错误。
    【注意:如果物品可以分割为任意大小,那么策略3可得最优解】
    对于选取单位重量价值最大的物品这个策略,可以再加一条优化的规则:对于单位重量价值一样的,则优先选择重量小的!这样,上面的反例就解决了。
    但是,如果题目是如下所示,这个策略就也不行了。
    W=40
    物品:A B C
    重量:25 20 15
    价值:25 20 15
    附:本题是个DP问题,用贪心法并不一定可以求得最优解,以后了解了动态规划算法后本题就有了新的解法。
    初始位置坐标x,y;




    展开全文
  • 贪心算法最优解

    2011-12-09 16:12:03
    贪心算法最优解
  • 贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的 近似解 。(来源360百科)注:贪心算法是一种高性能算法,复杂度低,简单易用。 贪心算法求出来的结果...

    贪心算法,又称“贪婪算法”。 在对问题求解时,总是做出在当前看来是最好的选择。(局部最优解) 也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的 局部最优解 。 贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的 近似解 。(来源360百科)

    注:贪心算法是一种高性能算法,复杂度低,简单易用。 贪心算法求出来的结果不一定都是最优解。对于某些问题,它能求出最优解。而还有些问题,它能求出最优解的**“近似解”**。

    二、算法思想

    “大事化小,小事化了”。

    • 大事化小:一个较大的问题,通过找到与子问题的重叠,把复杂的问题划分为多个小问题;
    • 小事化了:从小问题找到决策的核心,确定一种局部最优解的策略。
    • 通过计算出局部的最优解,来推出全局的最优解或近似解。

    伪代码如下:

    从问题的某一初始解出发 while (能朝给定总目标前进一步)  do 选择当前最优解作为可行解的一个解元素; 由所有解元素组合成问题的一个可行解。复制代码

    三、找零问题

    这是一个求得 最优解 的贪心算法例子。

    场景:一名收银员,需要找零 88 元。 怎么找零,所需要的纸/硬币的数量最少。

    思路:依次找最大的纸币, 例如:找零88元, ¥88 = ¥50 + ¥20 + ¥10 + ¥5 + ¥1 * 3

    # arr的每一位:分别对应100块、50块、20块、10块、5块、1块纸币。arr = [0,0,0,0,0,0]def change(money): while money >= 1: if money >= 100: money -= 100 arr[0] += 1 elif money >= 50: money -= 50 arr[1] += 1 elif money >= 20: money -= 20 arr[2] += 1 elif money >= 10: money -= 10 arr[3] += 1 elif money >= 5: money -= 5 arr[4] += 1 elif money >= 1: money -= 1 arr[5] += 1change(88)print arr复制代码

    结果输出:

    13c2bba85a527302fadad14603c53d78.png

    四、0-1背包问题

    这是一个求得最优解的 近似解 的贪心算法例子。 而如果要想求得最优解,就要用到DP策略。而动态规划将在 下篇 介绍。

    场景:一个小偷去商场偷东西,在背包称重有限下,如何拿能使得获得收益越大?(每件商品只有一个,只能选择拿与不拿)

    • 贪心策略1:每次取当前能拿得下的 最值钱 的商品。
    • 贪心策略2:每次取当前重量 最轻 的商品。
    • 贪心策略3:每次取 性价比最高 的商品。(即 价格/重量 的值最大的商品)

    接下来我们依次分析,并且找出不是最优解的反例。

    贪心策略1:选取价值最大的商品。

    反例: 背包最大重量 W = 4kg

    商品价格重量商品A3000元4kg商品B2000元3kg商品C1500元1kg

    根据策略,首先选取商品A,接下来就无法再选取了,可是明明选取商品B、C更好。

    贪心策略2:选取重量最轻的商品。

    与策略1类似,举反例: 背包最大重量 W = 4kg

    商品价格重量商品A3500元4kg商品B2000元3kg商品C1000元1kg

    根据策略,首先选取商品C,接下来选取商品B,可是明明选取A更好。

    展开全文
  • 贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。基本思路:1...

    贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。即,不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。

    7ae7ba06d7395c38989b3517f18f67b5.png

    贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。

    2604f52d8fd17567027c8eeca7039949.png

    基本思路:

    1、建立数学模型来描述问题。

    2、把求解的问题分成若干个子问题。

    3、对每一子问题求解,得到子问题的局部最优解。

    4、把子问题的解局部最优解合成原来解问题的一个解。

    0bed945fefabfbdd0dd08ed259b8ff3b.png

    适用的问题

    贪心策略适用的前提是:局部最优策略能导致产生全局最优解。实际上,贪心算法适用的情况很少。对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。

    849fc1161bb3e0adcf64f5bf67380ebc.png

    实现框架

    从问题的某一初始解出发,

    while (能朝给定总目标前进一步)

    {

    利用可行的决策,求出可行解的一个解元素;

    }

    由所有解元素组合成问题的一个可行解。

    6681c9b4523743a3d036dc08ecf313d6.png

    贪心策略的选择

    因为用贪心算法只能通过解局部最优解的策略来达到全局最优解,因此,一定要注意判断问题是否适合采用贪心算法策略,找到的解是否一定是问题的最优解。

    7c2ae9711dfbd4801f49696b3a62ae4c.png

    实例分析

    [背包问题]有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。

    物品 A B C D E F G

    重量 35 30 60 50 40 10 25

    价值 10 40 30 50 35 40 30

    6ac0f1540f5cbdeb00e2995415ea4970.png

    分析:

    目标函数: ∑pi最大。

    约束条件是装入的物品总重量不超过背包容量:∑wi<=M( M=150)。

    (1)根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优?

    (2)每次挑选所占重量最小的物品装入是否能得到最优解?

    (3)每次选取单位重量价值最大的物品,成为解本题的策略。

    7bf95cdf8a688e84539dd20e66854902.png

    对于例题中的3种贪心策略,都是无法成立(无法被证明)的,解释如下:

    (1)贪心策略:选取价值最大者。反例:

    W=30

    物品:A B C

    重量:28 12 12

    价值:30 20 20

    根据策略,首先选取物品A,接下来就无法再选取了,可是,选取B、C则更好。

    (2)贪心策略:选取重量最小。它的反例与第一种策略的反例差不多。

    (3)贪心策略:选取单位重量价值最大的物品。

    32a1c4d0f99120acbb1d226999f5f90b.png

    根据策略,三种物品单位重量价值一样,程序无法依据现有策略作出判断,如果选择A,则答案错误。

    贪心算法并不是完全不可以使用,贪心策略一旦经过证明成立后,它就是一种高效的算法。上面实例试用贪心算法求解,贪心解的确不错,可惜不是最优解。

    ab8826881e2db800a44e2c63bf878756.png
    展开全文
  • 贪心算法Part 1贪心算法简介贪心算法是从某一个初始状态出发,每次通过选取局部最优解向目标前进,并最终期望取得整体最优解的一种算法。由这个定义可知,贪心选择标准就是选择“当前最好”的决策,贪心算法根据这个...
    eacd77c13c33ecefd920965c1c07ae33.png

    贪心算法

    Part 1

    贪心算法简介

    贪心算法是从某一个初始状态出发,每次通过选取局部最优解向目标前进,并最终期望取得整体最优解的一种算法。由这个定义可知,贪心选择标准就是选择“当前最好”的决策,贪心算法根据这个标准进行决策,将原问题变成一个相似但规模更小的子问题,而后每一步选出来的一定是原问题整体最优解的一部分。

    如果一个问题贪心后只剩下一个子问题且有最优子结构,那么该问题就可以使用贪心算法。当一个问题的整体最优解包含其子问题的最优解时,我们称次问题具有最优子结构性质。

    0bee4fcb7f016139a9cc25423ad5c3c8.png

    Part 2

    解题一般步骤

    1、 设计数据找规律;

    2、 进行贪心猜想;

    3、 正确性证明(包括列举反例和严格的 数学证明);

    4、 程序实现。

    cbf77bed90b4b482a0212abd81b02191.png

    Part 3

    例题(洛谷P1080国王游戏):

    题目描述

    恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

    国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

    输入格式

    第一行包含一个整数n,表示大臣的人数。

    第二行包含两个整数 a和 b,之间用一个空格隔开,分别表示国王左手和右手上的整数。

    接下来 n行,每行包含两个整数a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。

    输出格式

    一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。

    输入输出样例

    8c394f147e2d0f9f13e5c5971a197267.png

    说明/提示

    【输入输出样例说明】

    按1、2、3 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;

    按 1、3、2 这样排列队伍,获得奖赏最多的大臣所获得金币数为2;

    按 2、1、3 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;

    按2、3、1这样排列队伍,获得奖赏最多的大臣所获得金币数为9;

    按 3、1、2这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;

    按3、2、1 这样排列队伍,获得奖赏最多的大臣所获得金币数为9。

    因此,奖赏最多的大臣最少获得 2个金币,答案输出 2。

    【数据范围】

    对于 20%的数据,有 1≤ n≤ 10,0 < a,b < 8;

    对于 40%的数据,有1≤ n≤20,0 < a,b < 8;

    对于 60%的数据,有 1≤ n≤100;

    对于 60%的数据,保证答案不超过 10^9;

    对于 100%的数据,有 1 ≤ n ≤1,000,0 < a,b < 10000。

    6cddc1b5092b6f4d8b49f933ee2fb59a.png

    Part 4

    解题思路

    不妨先讨论相邻的二元组。由题意可知,相邻两个大臣交换位置不会对前面和后面的其他人的金币数造成影响。也就是说相邻两人位置交换只会对这两个人产生影响我们以此为切入点,分析调换相邻的两个人对答案的影响。

    设这两个人位置分别为i和i+1,左手数字为a[i]和a[i+1],右手数字为b[i]和b[i+1],两人的金币数为w[i]和w[i+1]。记 P[i]=a[1]*a[2]*a[3]*...*a[i]。

    未调换顺序时,k1=w[i]=P[i-1]/b[i]; k2=w[i+1]=P[i-1]*a[i]/b[i+1];则

    ans1=max(k1,k2)

    调换顺序后k3=P[i-1]/b[i+1]; k4=P[i-1]*a[i+1]/b[i]; 则ans2=max(k3,k4)

    显然有k1

    所以,为了ans取到最小值,我们需要将a[i]*b[i]较小的放在前面那么我们以a[i]*b[i]为关键字排序即可。同时,统计答案时一定不要忘了写高精度。

    ca6431b4ec541cdc5231d60a9326cbd0.png

    小结

    贪心算法的核心问题是选择能产生问题最优解的最优度量标准,即具体的贪心策略。

    特点是快,在运行过程中无回溯过程,每一步都是当前的最佳选择

    往期推荐:

    刷Github时发现了一本阿里大神的算法笔记!标星70.5K

    END

    展开全文
  • 贪心算法Part 1贪心算法简介 贪心算法是从某一个初始状态出发,每次通过选取局部最优解向目标前进,并最终期望取得整体最优解的一种算法。由这个定义可知,贪心选择标准就是选择“当前最好”的决策,贪心算法根据这...
  • (局部最优解,而不是整体最优解)贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性(即某个状态以后的过程...
  • 贪心算法最优解条件

    千次阅读 2020-05-14 22:29:36
    条件 证明每次的局部最优解必须在全局最优解序列中,否则不可能到达全局最优
  • 1、贪心算法介绍 贪心算法,又称贪婪法,是寻找最优解算法的常用算法。当面对没有快速算法的问题(NP完全问题)时,贪心算法则可以化解危机,这种方法的模式一般是将问题求解分割成若干步骤,每个步骤都去应用贪心原则...
  • 解贪心算法

    2019-08-14 15:55:32
    2.心算法解题核心就是 “贪 ”,解决问题就当前来看不管全局的问题,因此,贪心只能取局部的最优解,从而达到全局最优解,但是往往贪心算法不一得到到最优的解, 对于有些问题能得到最优的解,因此贪心算法,要看...
  • 贪心算法(Gre小编开始自学,开始理解与学习算法,如果内容有误,欢迎大家评论,互动。 贪心算法(Greedy): 一:求解优化问题(最多,最少等) 解题步骤: 1,遍历备选元素 2,制定贪心策略选择一个元素 贪心策略...
  • 贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果应用场景-集合覆盖问题假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让...
  • 最近在看《编程之美》这本书,在讲到书的折扣问题的时候想了一个问题:当每一步都是最优解的时候为什么总体却不是最优解,也就是说如何判断贪心算法是不是最优解? 子问题最优->整体最优 和动态规划之间的问题---...
  • 贪心算法

    2019-12-23 20:06:08
    贪心算法(Greedy Algorithm),是一种在每一步选择中都采取在...贪心算法不保证得到最优解,但是对很多问题确实可以得到最优解 贪心算法比动态规划简单很多,所以能用贪心算法解决的事,不该使用动态规划去解决 一...
  • 贪心算法最优解

    千次阅读 2015-01-31 20:08:23
    题目:有 m 元钱,n 种物品;每种物品有 j 磅,总价值 f 元,可以 ...算法思想:,每次都买性价比最高的产品,性价比的计算公式为(重量\价格),性价比的含义为用最少的钱买到最多的东西 #include #include #inclu
  • 贪心算法一定能得到最优解的证明 按照老师说法是 分为三步: 证明总存在一个以贪心选择开始的最优解。 此问题具有最优子结构的性质。 用数学归纳法,总结得到结论。 以活动安排为例,首先,我们按照按照活动结束...
  • 如果使用贪心算法求解,第一艘船装载的方式只可能有一种最优解,就是装载的物品都是以从轻到重的顺序装载,所能装的最大重量,那么问题就来了,从轻到重这样装,不一定是最满的。比如{10,20},c1=20,根据贪心算法...
  • 贪心算法就是利用这种贪心思想而得出一种算法。贪心算法作为五大算法之一,在数据结构中的应用十分广泛。例如:在求最小生成树的 Prim 算法中,挑选的顶点是候选边中权值最小的边的一个端点。在 Kruskal 算法中,...
  • 活动安排问题解决了n个活动同时占用资源时最优安排的情况
  • 方法一: 贪心算法(O(n)) 这个题的tag是贪心,贪心策略是我们每次都选取最优的策略,然后前面已经选好了的就不用管了。 这个题的贪心方法是,我们使用一个变量max保存当前能到达的 最后位置 索引,那么在每个...
  • L2-算法基础-第14课 贪心❝真正厉害的人,往往都比较“贪心”.❞「所谓贪心算法是指,...必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响...
  • 贪心解的选择策略 我们定义贪心解的选择策略如下: 首先,不失一般性,我们忽略掉所有单个体积大于背包容积的物品,这些物品是一定不会被选中的。 再将所有物品按照单位价值由大到小排序,分别为itemitemitem1,...
  • 一路向贪心算法

    2016-05-08 00:34:03
    但是大多数情况下局部最优并不一定是全局最优,所以贪心算法并不一定可以得到全局最优解。相反的,如果你可以确定一个系统的局部最优一定可以推出全局最优的话,那么毫无疑问,直接使用贪心算法,因为贪心算法的效率...
  • 会场安排问题:假设在足够多的会场里安排一批活动(N个活动),每个活动事先给定活动的开始时间和结束时间,试用贪心算法求出最少需要多少会场,并求出每个活动安排在第几个会场。 这题与csdn里面的问题都多了条件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,802
精华内容 1,520
关键字:

最优解贪心算法