实验二 软件工程个人项目
==========
时间:2021-3-18

项目 内容
课程班级博客链接 课程链接
这个作业要求链接 作业要求
我的课程学习目标 1.了解软件工程过程中个人项目的开发流程
2. 理解PSP的重要性
3.提高个人编码能力
这个作业在哪些方面帮助我实现学习目标 1.通过本次作业的具体流程,使得我了解到了软件工程中个人开发流程
2.填写PSP表格
3.个人进行学习相关算法及编码
项目Github的仓库链接地址 D{0-1}Problem

1实验目的与要求

(1)掌握软件项目个人开发流程。

(2)掌握Github发布软件项目的操作方法。

2实验内容和步骤

任务1:阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评班级博客中已提交相关至少3份作业。

任务2:详细阅读《构建之法》第1章、第2章,掌握PSP流程,

任务3:项目开发背景:背包问题(Knapsack Problem,KP)是NP Complete问题,也是一个经典的组合优化问题,有着广泛而重要的应用背景。{0-1}背包问题({0-1 }Knapsack Problem,{0-1}KP)是最基本的KP问题形式,它的一般描述为:从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?

​ D{0-1} KP 是经典{ 0-1}背包问题的一个拓展形式,用以对实际商业活动中折扣销售、捆绑销售等现象进行最优化求解,达到获利最大化。D{0-1}KP数据集由一组项集组成,每个项集有3项物品可供背包装入选择,其中第三项价值是前两项之和,第三项的重量小于其他两项之和,算法求解过程中,如果选择了某个项集,则需要确定选择项集的哪个物品,每个项集的三个项中至多有一个可以被选择装入背包,D{0-1} KP问题要求计算在不超过背包载重量 的条件下,从给定的一组项集中选择满足要求装入背包的项,使得装入背包所有项的价值系数之和达到最大;D{0-1}KP instances数据集是研究D{0-1}背包问题时,用于评测和观察设计算法性能的标准数据集;动态规划算法、回溯算法是求解D{0-1}背包问题的经典算法。查阅相关资料,设计一个采用动态规划算法、回溯算法求解D{0-1}背包问题的程序,程序基本功能要求如下:

1.可正确读入实验数据文件的有效D{0-1}KP数据;

2.能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;

3.能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;

4.用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);

5.任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。

任务4:完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中。(50分)

3实验完成情况

任务1:评论其他同学博客(已完成

​ 本次评论博客成功评论了三位同学的博客,评论截图如下

任务2:阅读了解PSP(已完成

​ 通过阅读了解到了个人项目在实施的过程中,PSP的思想及重要性,下面表格为展示的 本次个人项目中的PSP项目规划表格。

PSP 各个阶段 自己预估的时间(分钟) 实际的记录(分钟)
计划: 明确需求和其他因素,估计以下的各个任务需要多少时间 120 150
开发 (包括下面 8 项子任务) 31*60 35*60
· 需求分析 (包括学习新技术、新工具的时间) 3*60 3*60
· 生成设计文档 (整体框架的设计,各模块的接口,用时序图,快速原型等方法) 2*60 2*60
· 设计复审 (和同事审核设计文档,或者自己复审) 1*60 1*60
· 代码规范 (为目前的开发制定或选择合适的规范) 20 20
· 具体设计(用伪代码,流程图等方法来设计具体模块) 3*60 3*60
· 具体编码 20*60 24*60
· 代码复审 1*60 1*60
· 测试(自我测试,修改代码,提交修改) 1*60 1*60
报告
测试报告(发现了多少bug,修复了多少)
计算工作量 (多少行代码,多少次签入,多少测试用例,其他工作量)
事后总结, 并提出改进计划 (包括写文档、博客的时间)
总共花费的时间 (分钟) 48*60 50*60

任务3:程序设计(完成一部分

  • 需求分析:

    1)实现对于已有数据集的.txt文件的读取以及对于字符流的处理,使它能够变成我们所能够使用的数据;

    2)实现对于一组数据的可视化,即以表格或者图形的样式进行呈现给用户;

    3)对于一些数据按照一定顺序的排序;

    4)实现算法,并且比较算法,将结果存入文件。

  • 功能设计

    1)可正确读入实验数据文件的有效D{0-1}KP数据;

    2)能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;

    3)能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;

    4)用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);

    5)任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。

  • 设计实现

  • 测试运行

    1.读取相应的文件,选择文件中的数据进行图表的绘制

2.在读取的数据中选择某一项数进行按照重量比进行非递增排序

3.分别对于一组数据进行回溯算法和动态规划算法进行计算最优解,并将其结果保存至文件中

  • 代码截图

    主要代码截图即代码片段:

    1.主函数截图:

    2.菜单选择

    3.字符串转换模块代码

/**
* 字符串数组转int数组
*/
private static int[] paseStringToInt(String[] splitString) {
int[] ints = new int[splitString.length];
for (int i = 0; i < ints.length; i++) {
ints[i] = Integer.parseInt(splitString[i]);
}
return ints;
} /**
* 字符串分割转存为字符数组
*/
private static String[] convertStrToArray(String str) {
String[] strArray = null;
strArray = str.split(","); //拆分字符为"," ,然后把结果交给数组strArray
return strArray;
}

4.读文件模块代码

/**
* 读取数据
*/
public static int readTxtFile(String filePath) {
try {
String encoding = "GBK";
File file = new File(filePath);
if (file.isFile() && file.exists()) { //判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file), encoding);//考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
profitList = new ArrayList<>();
weightList = new ArrayList<>();
volumeStringList = new ArrayList<>();
while ((lineTxt = bufferedReader.readLine()) != null) {
if (lineTxt.contains("the cubage of knapsack is")) {
volumeStringList.add(lineTxt);
}
if (lineTxt.equals("The profit of items are:")) {
String profit = bufferedReader.readLine();
profitList.add(profit);
}
if (lineTxt.equals("The weight of items are:")) {
String weight = bufferedReader.readLine();
weightList.add(weight);
}
}
read.close();
return 1;
} else {
System.out.println("找不到指定的文件");
return 0;
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
return 1;
}

5.绘制散点图模块代码

/**
* 绘制图表
*/
public static int drawchart(int[] profit, int[] weight) throws IOException { if (profit.length != 0 && weight.length != 0) {
//设置散点图数据集
XYSeries firefox = new XYSeries("weight/profit");
for (int i = 0; i < profit.length; i++) {
firefox.add(profit[i], weight[i]);
}
//添加到数据集
XYSeriesCollection dataset = new XYSeriesCollection();
dataset.addSeries(firefox);
//实现简单的散点图,设置基本的数据
JFreeChart freeChart = ChartFactory.createScatterPlot(
"数据散点图",// 图表标题
"weight",//y轴方向数据标签
"profit",//x轴方向数据标签
dataset,//数据集,即要显示在图表上的数据
PlotOrientation.VERTICAL,//设置方向
true,//是否显示图例
true,//是否显示提示
false//是否生成URL连接
);
//以面板显示
ChartPanel chartPanel = new ChartPanel(freeChart);
chartPanel.setPreferredSize(new java.awt.Dimension(560, 400));
//创建一个主窗口来显示面板
JFrame frame = new JFrame("Chart");
frame.setLocation(500, 400);
frame.setSize(600, 500);
//将主窗口的内容面板设置为图表面板
frame.setContentPane(chartPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
return 1;
} else {
return 0;
}
}

6.dP算法模块代码截图

7.回溯算法模块代码截图

  • 项目总结

    由于个人的编程水平有限以及在个人项目前期的对于PSP的安排不重视,导致对于该项目在截止日期之前几个小时内才完成,在本次个人项目中完成了题目所要求的大部分功能,但对于要求5的一小部分(即解向量的输出)没有完成,在自己查阅了相关资料之后,还是不太明白。如果在之后的企业的项目开发中,这样的状态无疑是会对公司以及个人造成比较大的损失,我将会记住这次个人项目失败的案例,从中吸取经验及教训,认识到自己的不足,争取在下次项目中做的更好。

任务4:本次项目提交Github(已完成

​ 本次实验项目的源码详情,参见我的github仓库

* github push截图

201871010111-刘佳华 实验二 个人项目—《D[01]背包问题》项目报告的更多相关文章

  1. 201871030108-冯永萍 实验二 个人项目— D{0-1}背包问题项目报告

    项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-dai ...

  2. 201871030118-雷云云 实验二 个人项目—D{0-1}背包问题项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业链接 我的课程学习目标 1.了解并掌握psp2.掌握软件项目个人开发流程3.掌握Github发布软件项目的操作方法 这个作业在哪些方面帮助 ...

  3. 201871030102-崔红梅 实验二 个人项目—— D{0-1}KP 项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 实验二作业链接 我的课程学习目标 1.熟练掌握将本地代码保存至GitHub中2.掌握折扣背包问题3.回顾动态规划算法和回溯算法4.对java语 ...

  4. 201871010130-周学铭 实验二 个人项目—D{0-1}问题项目报告

    项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 实验二 软件工程个人项目 我的课程学习目标 掌握软件项目个人开发流程.掌握Github发布软件项目的操作方法. 这个作业在哪些方面帮助我实 ...

  5. HDU - 2159 FATE(二维dp之01背包问题)

    题目: ​ 思路: 二维dp,完全背包,状态转移方程dp[i][z] = max(dp[i][z], dp[i-1][z-a[j]]+b[j]),dp[i][z]表示在杀i个怪,消耗z个容忍度的情况下 ...

  6. 201871030127-王明强 实验二 个人项目—《D{0-1}背包问题 》项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 (1)详细阅读<构建之法>学习并掌握PSP的具体流程(2)掌握背包问题,通过查阅相关资料,设计一个采用 ...

  7. 201871010203-陈鹏昱 实验二 个人项目—《D{0-1}KP问题》项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 运用科学高效的方法学习软件工程的理论和知识 这个作业在哪些方面帮助我实现学习目标 掌握软件项目个人开发流程,掌握G ...

  8. 201871030139-于泽浩 实验二 个人项目D{0-1} KP

    201871030139-于泽浩 实验二 个人项目D{0-1} KP 项目 内容 课程班级博客连接 2018级卓越班 这个作业要求连接 软件工程个人项目 我的课程学习目标 (1)掌握软件项目个人开发流 ...

  9. 201871010110-李华 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 (1)理解并掌握代码风格及设计规范:(2)通过任务3进行协作开发,尝试进行代码复审,在进行同伴复审的过程中体会结对 ...

  10. 201871030125-王芬 实验二 个人项目-《D{0-1}问题》软件项目报告

    实验二 个人项目-<D{0-1}问题>软件项目报告 项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 ...

随机推荐

  1. django动态创建表和动态选择实体

    开发有时需要动态创建表,创建完成后需要动态选择model对应的表,该需求如何实现 1.model层   TestBlock为了动态创建表.getBlockModel为了动态选择表 from djang ...

  2. S3C2440移植linux3.4.2内核之内核框架介绍及简单修改

    目录 uboot启动内核分析 简单配置内核 编译内核 设置机器ID 修改晶振 uboot启动内核分析   进入cmd_bootm.c,找到对应的bootm命令对应的do_bootm(): int do ...

  3. freeswitch APR库内存池

    概述 freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性. apr库中的大部分API都需要依赖于内存池,使用内存池简化内存管理,提高内存分配效率,减少内存操作中出错的概 ...

  4. java项目实践-请求转发以及重定向-day18

    目录 1. 中文乱码问题 2. 请求的转发servlet 3. 登录后的重定向 4 总结 1. 中文乱码问题 创建一个工程secondweb 添加jar包依赖 new servlet web.xml添 ...

  5. Android之AMS原理分析

    在学习android框架原理过程中,ams的原理非常重要,无论是在面试中还是在自己开发类库过程中都会接触到. 1 简述 ActivityManagerService是Android最核心的服务,负责管 ...

  6. 【TouchGFX】代码结构

    生成代码与用户代码 代码结构图示如下 据上图显示代码结构分为三层 引擎 这是TouchGFX提供的标准类,作为生成类的基类 生成 这是touchgfx designer生成的类,作为用户类的基类,这部 ...

  7. MySQL 8.2.0部署安装验证

    MySQL 8.2.0部署安装验证 背景 昨天捯饬了半天Oracle23c Free版本发现自己白忙活了. 然后想着继续看一下 MySQL8.2. 看看会不会又继续白忙活 下载与安装 https:// ...

  8. [转帖]Web技术(七):如何使用并实现MQTT 消息订阅-发布模型?

    文章目录 一.什么是发布-订阅消息模型? 二.订阅-发布消息模型有哪些应用? 2.1 应用于IP 物联网络中的消息传递 2.2 应用于操作系统进程间的消息传递 2.3 应用于MESH 自组网中的消息传 ...

  9. [转帖]013 Linux 搞懂「文件所属者更改及权限的赋予」从未如此简单 (chmod、chgrp、chown)

    https://my.oschina.net/u/3113381/blog/5435014   01 一图详解「ls -l」 02 两种符号区分表示文件和目录 -(横线) # 表示非目录文件 d # ...

  10. [转帖]谈 JVM 参数 GC 线程数 ParallelGCThreads 合理性设置

    https://my.oschina.net/u/4090830/blog/7926038 1. ParallelGCThreads 参数含义 在讲这个参数之前,先谈谈 JVM 垃圾回收 (GC) 算 ...