贪心选择算法为算法分析中一种常用算法,通过一系列的选择来得到一个问题的解。它所作的每一个选择都是当前状态下某种意义的最好选择,即贪心选择。希望通过每次所作的贪心选择导致最终结果是问题的一个最优解。这种启发式的策略并不总能奏效,然而在许多情况下确能达到预期的目的。对于可利用贪心算法解决的问题需要同时满足:最优子结构性质和贪心选择性质。

1.贪心选择性质

所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。在动态规划算法中,每步所作的选择往往依赖于相关子问题的解。因而只有在解出相关子问题后,才能作出选择。而在贪心算法中,仅在当前状态下作出最好选择,即局部最优选择。然后再去解作出这个选择后产生的相应的子问题。贪心算法所作的贪心选择可以依赖于以往所作过的选择,但决不依赖于将来所作的选择,也不依赖于子问题的解。正是由于这种差别,动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为一个规模更小的子问题。

对于一个具体问题,要确定它是否具有贪心选择性质,我们必须证明每一步所作的贪心选择最终导致问题的一个整体最优解。通常可以用我们在证明活动安排问题的贪心选择性质时所采用的方法来证明。首先考察问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始。而且作了贪心选择后,原问题简化为一个规模更小的类似子问题。然后,用数学归纳法证明,通过每一步作贪心选择,最终可得到问题的一个整体最优解。其中,证明贪心选择后的问题简化为规模更小的类似子问题的关键在于利用该问题的最优子结构性质。

2.最优子结构性质

当一个问题的最优解包含着它的子问题的最优解时,称此问题具有最优子结构性质。问题所具有的这个性质是该问题可用动态规划算法或贪心算法求解的一个关键特征。在活动安排问题中,其最优子结构性质表现为:若a是对于正的活动安排问题包含活动1的一个最优解,则相容活动集合a’=a—{1}是对于e’={i∈e:si≥f1}的活动安排问题的一个最优解。

3.贪心算法与动态规划算法的差异

贪心算法和动态规划算法都要求问题具有最优子结构性质,这是两类算法的一个共同点。但是,对于一个具有最优子结构的问题应该选用贪心算法还是动态规划算法来求解?是不是能用动态规划算法求解的问题也能用贪心算法来求解?下面我们来研究两个经典的组合优化问题,并以此来说明贪心算法与动态规划算法的主要差别。

最优装载问题问题描述:

有一批集装箱要装上一艘载重量为C的轮船,其中集装箱i的重量为Wi。要求在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。

算法分析:采用重量轻者先装的贪心选择策略,可产生最优装载问题的最优解。

代码实现:

1: class LContainer implements Comparable {

2: private int id; //编号

3: private double weight; //重量

4: private boolean loadFlag = false; //是否装船标识

5:

6: public LContainer(int id,double weight) {

7: this.id = id;

8: this.weight = weight;

9: }

10:

11: /**

12: * 因为要对对象进行排序,所以要实现java.util.Comparator接口的compareTo(T obj)方法,在该方法中自定义排序算法。

13: */

14: public int compareTo(Object obj) {

15: double ww = ((LContainer) obj).getWeight();

16: if (this.weight > ww) {

17: // 当方法返回 1 时 :把参数对象往前放。(前o.weight , 后this.weight)

18: return 1;

19: } else if (this.weight < ww) {

20: // 当方法返回 -1 时 :把参数对象往后放。(前this.weight , 后o.weight)

21: return -1;

22: } else {

23: return 0;

24: }

25: }

26:

27: public void setId(int id) {

28: this.id = id;

29: }

30:

31: public int getId() {

32: return id;

33: }

34:

35: public double getWeight() {

36: return weight;

37: }

38:

39: public void setWeight(double weight) {

40: this.weight = weight;

41: }

42:

43: public void setLoadFlag(boolean loadFlag) {

44: this.loadFlag = loadFlag;

45: }

46:

47: public boolean getLoadFlag() {

48: return loadFlag;

49: }

50: }

51:

52: public class OptLoading {

53: static int count;

54: static LContainer[] container ;

55:

56: static int loading(double[] weight, double c) {

57: container = new LContainer[weight.length] ;

58: for(int i=0;i

59: {

60: container[i] = new LContainer(i,weight[i]);

61: }

62:

63: Arrays.sort(container); // 实现数组排序

64:

65: for (int i = 0; i < container.length&&container[i].getWeight()<=c; i++)

66: {

67: container[i].setLoadFlag(true);

68: count++;

69: c -= container[i].getWeight();

70: }

71: return count;

72: }

73:

74: public static void main(String[] args) {

75: double c = 1000;

76: double[] weight = { 800, 1000, 1001, 200, 100, 400, 600, 50 };

77: int result = loading(weight,c);

78: System.out.println("最优装载集装箱的数量:\n"+result);

79: System.out.println("依次装载的顺序编号如下:");

80: for (int i = 0; i < container.length; i++)

81: {

82: if (container[i].getLoadFlag())

83: {

84: System.out.print(container[i].getId() + " ");

85: }

86: }

87: }

88:

89: }

贪心算法两船装载问题Java_贪心算法-最优装载问题相关推荐

  1. 加勒比海盗船——最优装载问题-贪心算法

    文章目录 加勒比海盗船--最优装载问题 问题分析 算法设计 伪代码详解 代码 加勒比海盗船--最优装载问题  在北美洲东南部,有一片神秘的海域,那里碧海蓝天.阳光明媚,这,正式传说中海盗最活跃的加勒比 ...

  2. 贪心算法下的两大经典问题:最优装载问题、最小延迟调度问题

    上一篇主要介绍了贪心算法的内容和活动选择问题.本篇主要介绍最优装载问题和最小延迟调度问题 1.最优装载问题 什么是最优装载问题 类似于0-1背包问题那样,有n个集装箱1,2,-,n装上轮船,集装箱i的 ...

  3. 贪心算法--加勒比海盗船--最优装载问题

    一.问题描述 在北美洲南部,有一篇神秘的海域,那里碧海蓝天.阳光明媚.这正是传说中海盗最活跃的加勒比海.17世纪时,这里更是欧洲大陆的商旅舰队到达美洲的必经之地,所以当时的海盗活动非常猖獗,海盗不仅攻 ...

  4. 【贪心算法】加勒比海盗船——最优装载问题

    目录 一.贪心本质 二.贪心的两大重要性质 三.贪心秘籍 四.最优装载问题 五.小结 一.贪心本质 一个贪心算法总是做出当前最好的选择,也就是说,它通过局部最优选择从而得到全局最优的解决方案. --& ...

  5. 贪心算法:最优装载问题(C++实现)

    概念: 当一个问题具有最优子结构性质时,可用动态规划算法,有时会有更简单有效的算法,那就是贪心算法,贪心算法是通过一系列的选择来得到问题的解,贪心算法并不从整体最优上加以考虑,所做的选择只是在某种意义 ...

  6. 贪心算法-加勒比海盗船——最优装载问题

    实际问题:一群海盗截获了一艘装满各种金银珠宝和古董的货船,每一件宝物都价值连城一旦打碎就失去了价值.海盗船的载重量为C,每件宝物的重量为Wi,海盗们应该如何把尽可能多的宝物装上船? 问题分析:这是一个 ...

  7. 算法设计与分析【第七周】贪心算法 最优装载问题

    最优装载问题 有一批集装箱要装上一艘载重量为c的轮船.其中,集装箱i的重量为Wi. 最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船. 另外,单源最短路径(Dijistra算 ...

  8. 【贪心算法】最优装载问题C++语言

    文章目录 问题描述 问题分析 算法步骤 举例 代码 问题描述 有一批集装箱要装上一艘重量为c的轮船.已知集装箱i(1<=i<=n)的重量为Wi,最优装载问题要求在装载体积不受限制的情况下, ...

  9. 贪心算法 | 最优装载问题——加勒比海盗船

    贪心算法的本质: 它是解决问题的策略上"目光短浅",只根据当前已有信息就做出选择,而且一旦做出选择,不管将来有什么结果,这个结果都不会发生改变.换言之,贪心算法并不是从整体最优考虑 ...

最新文章

  1. Amazon、Google、 Microsoft和IBM如何将人工智能作为一项服务出售
  2. python中else什么意思_python中的else语句
  3. CTime COleDateTime的常用操作和比较
  4. DevExpress.XtraReports报表,动态设置报表布局
  5. JavaScript常用方法(工具类的封装)
  6. Python-多线程编程
  7. 动图图解 | Go 的 timer 是如何被Runtime调度的?
  8. android so文件不混淆_Android studio 混淆打包时如何忽略依赖库中的第三方.so文件...
  9. JavaScript:画廊案例
  10. android 今日头条布局,Android今日头条UI适配完善版
  11. html中meta的设置
  12. 将文件下载到谷歌云盘 google driver
  13. 社区发现 louvain(fast unfolding)算法
  14. Dubbo 的集群容错模式:Failsafe Cluster
  15. oracle adpatch 回退,Oracle EBS使用adpatch工具打patch过程【Z】 - huak
  16. 实时渲染入门:静态光照和动态光照
  17. 论文笔记(1):Efficient Convex Completion of Coupled Tensors using Coupled Nuclear Norms
  18. 提取音乐用什么软件哪个好
  19. PTA--基础编程题目集(7-10 计算工资) Python版
  20. DC-DC PCB layout 指导

热门文章

  1. “Remote server returned error: (405) method not allowed.”的解决方案
  2. C#LeetCode刷题之#206-反转链表(Reverse Linked List)
  3. javascript测试_了解有关JavaScript承诺的更多信息:25次测试中从零到英雄
  4. 编码 面试_在学习编码面试时如何取得进步
  5. Java中的equals和==的差别 以及Java中等价性和同一性的讨论
  6. linux怎么打开pak文件怎么打开,在elementary OS系统中开启Flatpak应用程序支持
  7. mfc编写鼠标键盘_黑客为什么都不用鼠标?进来你就懂了!
  8. Privoxy安装及配置
  9. Python数据可视化之Excel气泡图
  10. 这几个冷门却实用的 Python 库,我爱了!