青岛科技大学算法设计与分析实验报告-算法实训-背包问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
String weight = JOptionPane.showInputDialog("Input W(空格隔开):");
String value = JOptionPane.showInputDialog("Input P(空
格隔开):");
String[] values = value.split(" ");
String[] weights = weight.split(" ");
List
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
for (Knapsack knapsack : bags1) {
P.add(knapsack);
}
int Pmax = 0;
for (List
int weight = 0;
for (Knapsack knapsack : I) {
weight = weight + knapsack.getWeight();