`

最优组合之背包算法

阅读更多

 

背包问题(Knapsackproblem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。这个问题涉及到了两个条件:一是物品总的大小小于或等于背包的大小,二是物品总的价值要尽量大。

如果我们用子问题定义状态来描述的话可以这样解释

f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。用公式表示:


                       f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} f[v]=max{f[v],f[v-c[i]]+w[i]}


    具体的解释可以理解为将前i件物品放入容量为v的背包中,只考虑第i件物品的策略(放或不放),那么就可以转化为一个只涉及前i-1件物品和第i件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。v表示背包的最大容量,c[i]表示第i件物品的大小,w[i]表示第i件物品的价值)


算法如下:

 

[plain] view plaincopy
  1. class Fruit{  
  2.     private String name;  
  3.     private int size;  
  4.     private int price;  
  5.       
  6.     public Fruit(String name,int size,int price){  
  7.         this.name=name;  
  8.         this.size=size;  
  9.         this.price=price;  
  10.     }  
  11.     public String getName(){  
  12.         return name;  
  13.     }  
  14.     public int getPrice(){  
  15.         return price;  
  16.     }  
  17.     public int getSize(){  
  18.         return size;  
  19.     }  
  20. }  
  21.   
  22. public class Knapsack{  
  23.     public static void main(String[] args){  
  24.         final int MAX=8;  
  25.         final int MIN=1;  
  26.         int[] item=new int[MAX+1];  
  27.         int[] value=new int[MAX+1];  
  28.         Fruit fruits[]={  
  29.             new Fruit("李子",4,4500),  
  30.             new Fruit("苹果",5,5700),  
  31.             new Fruit("橘子",2,2250),  
  32.             new Fruit("草莓",1,1100),  
  33.             new Fruit("甜瓜",6,6700)  
  34.         };  
  35.         for(int i=0;i<fruits.length;i++){  
  36.             for(int s=fruits[i].getSize();s<=MAX;s++){//s表示现在背包的大小  
  37.                 int p=s-fruits[i].getSize();//表示每次增加单位背包空间,背包所剩的空间  
  38.                 int newvalue=value[p]+fruits[i].getPrice();//value[p]表示增加的背包空间可以增加的价值,fruits[i].getprice()表示原有的背包的价值  
  39.                 if(newvalue>value[s]){//现有的价值是否大于背包为s时的价值  
  40.                     value[s]=newvalue;  
  41.                     item[s]=i;//将当前的水果项添加到背包的物品中  
  42.                 }  
  43.             }  
  44.         }  
  45.         System.out.println("物品\t价格");  
  46.         for(int i=MAX;i>MIN;i=i-fruits[item[i]].getSize()){  
  47.             System.out.println(fruits[item[i]].getName()+  
  48.                 "\t"+fruits[item[i]].getPrice());  
  49.         }  
  50.         System.out.println("合计\t"+value[MAX]);  
  51.     }  
  52. }  


 

程序运行的过程如下:

 

i=0时放入李子

背包负重

1

2

3

4

5

6

7

8

s

4

5

6

7

8

p

0

1

2

3

4

value

0

0

0

4500

4500

4500

4500

9000

item

0

0

0

0

0

i=1时放入蘋果

背包负重

1

2

3

4

5

6

7

8

s

5

6

7

8

p

0

1

2

3

value

0

0

0

4500

5700

5700

5700

9000

item

0

1

1

1

0

i=2放入橘子

背包负重

1

2

3

4

5

6

7

8

s

2

3

4

5

6

7

8

p

0

1

2

3

4

5

6

value

0

2250

2250

4500

5700

6750

7950

9000

item

2

2

0

1

2

2

0

i=3放入草莓

背包负重

1

2

3

4

5

6

7

8

s

1

2

3

4

5

6

7

8

p

0

1

2

3

4

5

6

7

value

1100

2250

3350

4500

5700

6800

7950

9050

item

3

2

3

0

1

3

2

3

i=4放入甜瓜

背包负重

1

2

3

4

5

6

7

8

s

6

7

8

p

0

1

2

value

1100

2250

3350

4500

5700

6800

7950

9050

item

3

2

3

0

1

3

2

3

 

    由最后一个表格可以知道,在背包负重8的时候,最多得到价值9050的水果,这个时候可以得到装入的水果是3号水果草莓,那么剩下的(8-1=7)个大小空间,可以知到为2号水果也就是橘子,同理下一步可以知道放入的水果是1号水果苹果。此时获得的最优解的价值就是9050,放入的水果是草莓、橘子和苹果。

更多信息请查看 java进阶网 http://www.javady.com

分享到:
评论

相关推荐

    java背包算法例子

    原先在网上找到某位大虾写的一个简单的背包算法,于是在其基础上改成适合我们目前项目中要求的背包算法。此算法要求传入一组对象集合(其中的对象中只包含主键和值)和某个条件值,然后能打印sum(对象.值)条件的1个...

    论文研究-多选择背包问题的人工蜂群算法.pdf

    多选择背包问题是组合优化中的NP难题之一,采用一种新的智能优化算法——人工蜂群算法进行求解。该算法通过雇佣蜂、跟随蜂和侦察蜂的局部寻优来实现全局最优。基于算法实现的核心思想,用MATLAB编程实现,对参考文献...

    遗传算法0-1背包问题论文

    01背包问题属于组合优化问题的一个例子,求解01背包问题的过程可以被视作在很多可行解当中求解一个最优解。...遗传算法(Genetic Algorithms)则是一种适合于在大量的可行解中搜索最优(或次优)解的有效算法。

    遗传算法求解01背包问题——问题分析

    01背包问题属于组合优化问题的一个例子,求解01背包问题的过程可以被视作在很多可行解当中求解一个最优解。...遗传算法(Genetic Algorithms)则是一种适合于在大量的可行解中搜索最优(或次优)解的有效算法。

    论文研究-基于改进的蜂群遗传算法求解多选择背包问题.pdf

    多选择背包问题是组合优化中的典型NP难题之一。针对传统蜂群算法存在的收敛速度慢、易陷入局部最优的缺点,提出改进策略。改进的算法通过设置两个自适应变化的种群雄蜂群和雌蜂群,雄蜂群负责与蜂后交叉操作以保持...

    基于python实现贪心算法、蛮力法、动态规划法解决分数背包问题和0-1背包问题源码+项目说明及注释.zip

    设置一个记录最大价值的变量maxvalue,遍历所有子集,计算每个子集物品的总重量,若能装入背包,且当前的背包价值大于maxvalue,则将当前值赋值给maxvalue,最后循环遍历完所有的物品组合得到最优解 【备注】 1、该...

    基于python实现贪心算法、蛮力法、动态规划法解决分数背包问题和0-1背包问题源码+项目说明.zip

    基于python实现贪心算法、蛮力法、动态规划法解决分数背包问题和0-1背包问题源码+项目说明.zip # 背包问题算法设计 问题要求在一个物品集合中选择合适的物品放入背包,在放入背包中的物品总重量不超过背包容量的...

    算法设计与分析 王红梅

    7 第 8 章 回溯法 8 .1 概述 8 .2 图问题中的回溯法 8 .3 组合问题中的回溯法 8 .4 实验项目— — —0/ 1 背包问题 阅读材料— — —禁忌搜索算法 习题 8 第 9 章 分支限界法 9 .1 概述 9 .2 图问题中的分支限界法 9...

    算法设计与分析 综合性实验报告

    0 1背包问题是一例典型的组合优化的NP完全问题 问题可以描述为:给定一组共n个物品 每种物品都有自己的重量wi i 1 n和价值vi i 1 n 在限定的总重量(背包的容量C)内 如何选择才能使得选择物品的总价值之和最高 选择...

    算法设计与分析综合设计性实验报告

    0-1背包问题的多种算法设计与分析 0-1背包问题是一例典型的组合优化的NP完全问题。问题可以描述为:给定一组共n个物品,每种物品都有自己的重量wi, i=1~n和价值vi, i=1~n,在限定的总重量(背包的容量C)内,如何...

    背包问题9讲PDF详细说明

    背包问题(Knapsack Problem)是一种组合优化的NP完全问题。该问题可以被描述为:给定一组物品,每种物品都有自己的重量和价值,在限定的总重量内,如何选择,才能使得物品的总价值最大。问题的名字来源于如何选择最...

    排列组合.zip

    贪心算法:贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法。常见的贪心算法包括最小生成树算法中的Prim算法、Dijkstra算法等。 字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个...

    模拟退火算法最早由N. Metropolis等人于1953年提出,随后在1983年由S. Kirkpatrick等人成功应用于组

    模拟退火算法最早由N. Metropolis等人于1953年提出,...此外,该算法还可以用于解决其他类型的组合优化问题,如旅行商问题、背包问题等。由于其强大的全局搜索能力和鲁棒性,模拟退火算法已成为一种重要的优化工具。

    ACM算法模版大集合

    背包问题 动态规划的优化 四边形不等式 函数的凸凹性 状态设计 规划方向 线性规划 常用思想 二分 最小表示法 串 KMP Trie结构 后缀树/后缀数组 LCA/RMQ 有限状态自动机理论 排序 选择/冒泡 ...

    旅行商问题的认识和模拟退火浅谈.zip

    另介绍模拟退火算法和阐述该算法的优势和劣势及其原理,并列举出模拟退火算法适用于哪些类型的问题,如组合优化问题:如旅行商问题、背包问题、调度问题等,这些问题需要在有限的选项中找到最优的组合。 函数优化...

    高斯量子粒子群算法 Matlab实现 QPSO

    高斯量子粒子群算法 Matlab实现 QPSO适合研究生学习,粒子群优化(PSO)是一种基于种群的群体智能算法,它与进化计算技术有许多相似之处。然而,PSO是由鸟类和其他社会生物的集体行为所激发的社会心理隐喻的模拟驱动的...

    ACM算法模板和pku代码

    r-组合生成算法 r-排列生成算法 r-错位排列生成算法 图论 传递闭包 欧拉回路判定 有向图欧拉路径 二分图最大匹配 匈牙利算法 二分图最大匹配 HK算法 二分图最大权匹配 KM算法 割边 强连通分量 缩点 ...

    求解棘手背包问题的新颖的量子启发式二进制Wolf Pack算法

    0-1背包问题是经典的组合优化问题,通常用于验证二进制智能算法的搜索性能。 尽管传统的二进制Wolf Pack算法(BWPA)可以为一般背包问题提供有效的解决方案,但是对于诸如高维KP01等困难的背包问题,它无法获得满意...

    Algorithm-basis:算法基础,一些学习时的cpp源代码-源码时代

    算法基础 算法基础,一些学习时的cpp源代码。算法的思路以及原理全在cpp代码中。 1.递归与分治 棋盘覆盖 全排序问题 整体划分问题 2.动态规划 0-1背包问题 数字三角形问题 ...计算组合数 ...5.贪心算法 ...最优装载

    CARA:一种采用组合拍卖的智能电视终端多资源分配机制 (2013年)

    然后,将组合拍卖竞胜标问题转化为多维多选择背包问题,提出一种竞胜标求解算法,在投标集中用贪心法搜索最优投标,并利用共享型资源增加时边际效用递减的特征缩小搜索空间,降低算法复杂度。仿真实验表明,CARA的竞胜标...

Global site tag (gtag.js) - Google Analytics