青岛科技大学算法设计与分析实验报告-算法实训-背包问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构与算法分析2 课程设计报告书

班级

学号

姓名

指导教师庞志永

课程设计项目名称:背包问题的多项式时间近似方案

1.问题描述:

背包问题可描述为如下的整数规划形式,其中M 为背包的容量,P 为物体的价值,W 为物体的体积。

2.基本要求:

(1)在给定参数K 的条件下,设计背包问题的满足近似性能比不大于1+1/(k+1)的多项式时间近似方案,并选择适当的编程语言在计算机上实现。

(2)程序能够正常运行,计算结果正确,满足设计要求。

3.算法描述:

将装入背包的物体进行多次尝试,其方法是:

取K 为确定的非负整数,考虑背包问题的实例I 中的n 个物体的合的K 元素子集C ,|C|=K 。

(1)尝试将每个K 元素子集C 中的物体优先装入背包;

(2)利用解答背包问题的贪心算法A 将(n-K)个物体尝试装入背包。合并先装入的K 个物体和用算法A 装入的剩余物体作为算法的最终解。

过程如下:

Procedure ε-APPROX(P,W,M,n,K)

(1) P MAX =0;

(2) For all combinations C of size=K & weight≤M do

(3) P C =∑i∈C P i

(4) P MAX =max{P MAX ,P C + L(I, P, W, M, n)};

(5) End for

(6) End ε-APPROX

Procedure L(I,P,W,M,n)

(1) S 1=0; T=M - ∑i∈C W i ;

(2) For i=1 to n do

(3) If i ∉C and W i ≤T then

(4) S 1=S 1+P i , T=T – W i

(5) End if

(6) End for

11max {0,1},1n i i i i n i i i Px x i n W x M

==⎧⎪∈≤≤⎨≤⎪⎩∑∑

(7) S=max{S1,max{P i| i ∉C}};

(8) Return (S)

(9) End L

4.模块划分(仅供参考):

(1)输入及存储原始数据模块

(2)ε-APPROX(P,W,M,n,K)模块

(3)L(I,P,W,M,n)模块

(4)存储及输出结果模块

5.本课程设计中遇到的关键问题及其解决方法:

背包使用面向对象方法:

package knapsack;

public class Knapsack {

/** 背包重量 */

private int weight;

/** 背包物品价值 */

private int value;

/***

* 构造器

*/

public Knapsack(int weight, int value) {

this.value = value;

this.weight = weight;

}

public int getWeight() {

return weight;

}

public int getValue() {

return value;

}

public String toString() {

return"[weight: "+ weight+ "\t"+ "value: "+ value + "]";

}

}

获取最优解:

package knapsack;

import java.util.ArrayList;

import java.util.List;

import javax.swing.JOptionPane;

import algorithm.dynamicplan.Knapsack;

/**

* 背包

* 首先将最多 k件物品放人背包,

* 如果这k件物品重量大于 c,则放弃它。

* 否则,剩余的重量用来考虑将剩余物品按价值重量比递减的顺序装入。

* 通过考虑最多为 k件物品的所有可能的子集来得到最优解。

*

* @author

*

*/

public class KSMethod {

/**

* 输入及存储原始数据模块

* @param n

* @return P

*/

static List InputData(int n){

String weight = JOptionPane.showInputDialog("Input W(空格隔开):");

String value = JOptionPane.showInputDialog("Input P(空

格隔开):");

String[] values = value.split(" ");

String[] weights = weight.split(" ");

List P = new ArrayList();

for (int i = 0; i < n; i++) {

P.add(new Knapsack(Integer.valueOf(weights[i]), Integer

.valueOf(values[i])));

}

System.out.println("原始数据:");

printlist(P);

return P;

}

/**

* e-APPROX(P,W,M,n,K)模块

*

* @param bags1

* @param M

* @param n

* @param K

* @return 解

*/

static int Solve(Knapsack[] bags1, int M, int n, int K) {

List> allSubLists = getSubLists(bags1);

List P = new ArrayList();

for (Knapsack knapsack : bags1) {

P.add(knapsack);

}

int Pmax = 0;

for (List I : allSubLists) {

int weight = 0;

for (Knapsack knapsack : I) {

weight = weight + knapsack.getWeight();

相关文档
最新文档