最优装载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实 验 报 告
一、实验目的 通过算法的程序实现和执行时间测试、并与理论上的结论进行对比分析,深入理解算法时间复杂度分析中对于输入数据考虑其等价类的意义,理解算法时间复杂度渐进性态和和增长率的概念,为后续学习和实验奠定基础,同时也学习程序效率测试的基本思路。
二、实验内容与实验步骤
(1)了解贪心算法的基本思想并编写解决最优装载问题;
(2)打开一台装有MyEclipse-10.7.1的PC ;
(3)把已经写好的代码在Java 环境下运行并调试;
(4)记录运行结果。
三、实验环境
Windows 7家庭普通版,MyEclipse-10.7.1
四、阐述最优装载问题
有一批集装箱要装上一艘载重量为c 的轮船。其中集装箱i 的重量为Wi ,最优装载问题要求在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
该问题可形式化描述为:
∑=n 1i max i x ;∑=≤n 1
i i i c x w ,{}{n i x i ≤≤∈1,1,0}
式中,变量i x =0表示不装入集装箱i ,i x =1表示装入集装箱i 。
五、问题分析
从集装箱中选择重量最小的集装箱,这种选择次序可以保证所选的集装箱总重量最小从而可以装载更多的集装箱。根据这种贪心策略首先选择最轻的集装箱然后选择次轻的如此下去直到所有集装箱均装上轮船或轮船上不能容纳其他任何一个集装箱。
六、问题解决
课程名称:算法设计与分析
班级:12软工一班 实验成绩: 实验名称:最优装载
学号:1242159101 批阅教师签字: 实验编号:二
姓名:陈双飞 实验日期:2014年12月15日 指导教师:陈平
组号: 实验时间: 时 分- 时 分
设集装箱已依其重量从小到大排序,()n x x x ,...,,21是最优装载问题的一个最优解。又{}1|min i 1==≤≤i n
x i k 。易知,如果给定的最优装载问题有解,则n k ≤≤1。 (1)当k=1时,)
(n x x x ,...,,21是一个满足贪心选择性质的最优解。 (2)当k>1时,取y 1=1;y k =0;y i =x i ,1
∑∑∑===≤≤+-=n i n i n
i i
i i i k i i i c x w x w w w y w 111 因此,(y 1,y 2,...,y n )是所给最优装载问题的可行解。
设)
(n x x x ,...,,21是最优装载问题的满足贪心选择性质的最优解,则易知x 1=1,)
(n x x x ,...,,32是轮船重量为c-w 1,待装船集装箱为{2,3,...,n}时相应最优装载问题的解。也就是说最优装载问题具有最优子结构性质。
七、实验结果总结
实现算法代码:
/**
* 最优装载贪心法
***
*/
i mport java.util.*;
public class Greedy {
public static void main(String[] args) {
Scanner in = new Scanner(System.in );
System.out .println("请输入集装箱的数量:");
int n = in.nextInt();
int [] w = new int [n]; // 物品重量数组
System.out
.println("现在请输入这些集装箱的重量:");
for (int i = 0; i < n; i++) {
w[i] = in.nextInt();
}
System.out
.println("现在请输入轮船的载重量:"); int c = in.nextInt();
/**
排序用到了选择排序,详情请查看选择排序*/
double[] r = new double[n];
int[] index = new int[n];
for (int i = 0; i < n; i++) {
index[i] = i;
}
double temp = 0;
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (r[i] < r[j]) {
temp = r[i];
r[i] = r[j];
r[j] = temp;
int x = index[i];
index[i] = index[j];
index[j] = x;
}
}
}
/**
* 排序后的重量w1[]
*/
int[] w1 = new int[n];
for (int i = 0; i < n; i++) {
w1[i] = w[index[i]];
}
/**
* 初始化解向量x[n]
*/
int[] x = new int[n];
for (int i = 0; i < n; i++) {
x[i] = 0;
}
/**
* 求解并打印解向量
*/
for (int i = 0; i < n; i++) {
if (w1[i] < c) {
x[i] = 1;
c = c - w1[i];
}
}