201871030138-杨蕊媛 实验二 个人项目—《D{0-1}背包问题》项目报告
| 项目 | 内容 |
|---|---|
| 课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/2018CST |
| 这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/14552393.html |
| 我的课程学习目标 | 1.掌握软件项目个人开发流程 2.掌握Github发布软件项目的操作方法 |
| 这个作业在哪些方面帮助我实现学习目标 | 1.通过阅读《构建之法》中PSP的相关内容,结合本次个人项目设计,掌握了软件项目个人开发流程 2.通过将本次个人项目提交到Github仓库,掌握了Github发布软件项目的操作方法 |
| 项目Github的仓库链接地址 | https://github.com/Yangrui-coco/hello-world |
任务1:阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评班级博客中已提交相关至少3份作业。
下面是三位同学的博客链接:
https://www.cnblogs.com/123456789wq/p/14545426.html
https://www.cnblogs.com/YQY128/p/14522586.html
https://www.cnblogs.com/lomzn/p/14522775.html
任务2:详细阅读《构建之法》第1章、第2章,掌握PSP流程。
已阅读,在下面的任务3中,有关于本次个人项目的PSP。
任务3:查阅相关资料,设计一个采用动态规划算法、回溯算法求解D{0-1}背包问题的程序。
项目开发背景:
背包问题(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}背包问题的程序。
需求分析
- D{0-1} KP数据存储在txt文件中,需要将txt文件中的有效数据提取出来并且存储;
- 对数据进行可视化操作,绘制以重量为横轴、价值为纵轴的散点图;
- 对一组数据按照每个项集中的第三项的价值/重量比进行非递增排序;
- 设计动态规划算法和回溯法求解指定D{0-1} KP数据的最优解,并且输出求解时间,设置选项,用户可以自主选择用哪一种算法求解。在求解最优解时需要注意,每个项集的三项物品中至多只有一个可以被装入背包;
- D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
功能分析
- 正确读入实验数据文件的有效D{0-1}KP数据;
- 能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
- 能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
- 用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);
- 任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
代码片段
// 按项集第三项的价值/重量比进行非递增排序
void Bubble_sort(int len)
{
int tmp1 = 0,tmp2 = 0,tmp3 = 0,tmp4 = 0,tmp5 = 0,tmp6 = 0;
bool swap = false;//加判断条件,减少比较次数
for(int i=0;i<len-1;i++)
{
for(int j=0;j<len-1-i;j++)
{
if((j+1)%3 == 0 && ((idkp0[0][j]/idkp0[1][j]) < (idkp0[0][j+3]/idkp0[1][j+3])))
{
tmp1 = idkp0[0][j];
idkp0[0][j] = idkp0[0][j+3];
idkp0[0][j+3] = tmp1;//交换
tmp2 = idkp0[0][j-1];
idkp0[0][j-1] = idkp0[0][j+2];
idkp0[0][j+2] = tmp2;//交换
tmp3 = idkp0[0][j-2];
idkp0[0][j-2] = idkp0[0][j+1];
idkp0[0][j+1] = tmp3;//交换
tmp4 = idkp0[1][j];
idkp0[1][j] = idkp0[1][j+3];
idkp0[1][j+3] = tmp4;//交换
tmp5 = idkp0[1][j-1];
idkp0[1][j-1] = idkp0[1][j+2];
idkp0[1][j+2] = tmp5;//交换
tmp6 = idkp0[1][j-2];
idkp0[1][j-2] = idkp0[1][j+1];
idkp0[1][j+1] = tmp6;//交换
swap = true;
}
}
if (!swap)
{
return;
}
}
}
测试运行
- 读取一组数据并对数据按项集第三项的价值:重量比进行非递增排序:

- 对这组数据以重量为横轴、价值为纵轴的绘制数据散点图:

总结
- 模块化编程就是把一整个项目分成很多模块(比如一个学生成绩查询可以分为,登陆,查询,修改保存,退出等模块),而一个程序工程包含多个源文件( .c 文件和 .h 文件),每个 .c 文件可以被称为一个模块,每一个模块都有其各自的功能,而每一个.h 文件则是声明该模块,相当于功能说明书。
- 模块化的核心是各个模块独立封装,多个 .c 和 .h 使得整个工程变得易于阅读,逻辑清晰。
- 当一个项目比较大时,采用模块化编程可以使得整个项目分工明确,条理清晰,易于阅读,便于移植。
PSP
PSP参考:http://www.cnblogs.com/xinz/archive/2011/10/22/2220872.html
| PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
|---|---|---|---|
| Planning | 计划 | 30 | 30 |
| Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 30 | 30 |
| Development | 开发 | 940 | 1205 |
| Analysis | 需求分析 (包括学习新技术) | 120 | 140 |
| Design Spec | 生成设计文档 | 30 | 30 |
| Design Review | 设计复审 (和同事审核设计文档) | 20 | 20 |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 35 |
| Design | 具体设计 | 60 | 50 |
| Coding | 具体编码 | 600 | 750 |
| Code Review | 代码复审 | 20 | 30 |
| Test | 测试(自我测试,修改代码,提交修改) | 60 | 150 |
| Reporting | 报告 | 130 | 100 |
| Test Report | 测试报告 | 60 | 40 |
| Size Measurement | 计算工作量 | 40 | 30 |
| Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 30 | 30 |
在整个的项目开发流程中,具体编码环节耗时最多,具体编码以及测试的这部分估计时间与实际消耗时间出入是比较大的,具体编码消耗时间很多的原因是没有做好前期的准备工作,导致在程序编写过程中耗费了一定的时间去学习要用到许多新知识;测试消耗许多时间的原因是测试时出现Bug需要许多时间去调试、修改。
任务4:完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中。
已提交至Github的项目仓库中。
本次作业的感想体会:
本次作业还是有难度的,涉及到有效数据提取、可视化操作、回溯算法、动态规划算法等一系列的知识,在具体做的时候需要不断地对不会的知识查缺补漏,最开始看到大量的数据还有一大段的题目感觉无从下手,最后慢慢地才稍微理清了思路,对于要求的功能并没有全部实现。
个人知识的掌握与积累上尚且路途遥远。
201871030138-杨蕊媛 实验二 个人项目—《D{0-1}背包问题》项目报告的更多相关文章
- 201871030138-杨蕊媛 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-daizh ...
- 20155219&20155224 《信息安全系统设计基础》实验二 固件程序设计
实验二 固件程序设计-1-MDK 0. 注意不经老师允许不准烧写自己修改的代码 1. 两人(个别三人)一组 2. 参考云班课资源中"信息安全系统实验箱指导书.pdf "第一章,1. ...
- 201671010449 杨天超 实验十四 团队项目评审&课程学习总结
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 作业学习目标 1.掌握软件评审流程及内容 2.个人总结 实验一问题解答 实验一问题链接:https://ww ...
- 201871030108-冯永萍 实验二 个人项目— D{0-1}背包问题项目报告
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-dai ...
- 201871030125-王芬 实验二 个人项目-《D{0-1}问题》软件项目报告
实验二 个人项目-<D{0-1}问题>软件项目报告 项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 ...
- 201871030127-王明强 实验二 个人项目—《D{0-1}背包问题 》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 (1)详细阅读<构建之法>学习并掌握PSP的具体流程(2)掌握背包问题,通过查阅相关资料,设计一个采用 ...
- 201871030131-谢林江 实验二 个人项目—《D{0-1} KP》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.学习编写PSP2.完成个人项目实验要求3.在Github建仓 这个作业在哪些方面帮助我实现学习目标 1.首次编 ...
- 201871030126-王会娟 实验二 个人项目—《D{0-1} KP》项目报告
项目 内容 课程班级博客链接 https://home.cnblogs.com/u/wanghuijuan815 这个作业要求链接 https://www.cnblogs.com/nwnu-daizh ...
- 201871030106-陈鑫莲 实验二 个人项目-《D{0-1} KP 问题》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.掌握软件项目个人开发流程2.掌握Github发布软件项目的操作方法 这个作业在哪些方面帮助我实现学习目标 1. ...
随机推荐
- 06- Linux Ubuntu下sublime下载与使用与安装包
我有Linux下全套的安装包,如sublime,pycharm等.不用再苦逼的下软件了.需要的加我微信:chimu sublime text 3文本编辑器 启动命令:Linux命令行输入subl 或者 ...
- hdu1529 差分约束(好题)
题意: 超市在每个时间都有需要的人数(24小时)比如 1 0 0 0 0 ....也就是说在第0个小时的时候要用一个人,其他的时间都不用人,在给你一些人工作的起始时间,如果雇佣了这个人,那 ...
- Python中数据类型的转换
bytes<-->str a="hello" #str字符型 #str转换为bytes类型 b=a.encode("utf-8") 或 b=byte ...
- POJ1364基本的查分约束问题
题意: 给了由n个数组成的一个数列,然后给你各种区间的和是大于ci还是小于ci啥的,最后问你是否冲突. 思路: 差分约束水题,不过wa了两次,原因处理区间问题的细节马虎了,说下 ...
- SqlServer数据库主从同步
分发/订阅模式实现SqlServer主从同步 在文章开始之前,我们先了解一下几个关键的概念: 分发服务器分发服务器是负责存储在同步过程中所用复制信息的服务器.可以比喻成报刊发行商. 分发数据库分发数据 ...
- 【java--反射】注解(反射解析注解+注解应用)
创建实体类 package cn.com.codingce.iocannotation; /** * @Author: Jiangjun * @Date: 2019/10/7 9:54 */ publ ...
- linux命令的使用 以及基本docker命令及docker镜像安装
以linux CentOS-7 64位 系统为例 查看ip ifconfig 固定ip 输入vim /etc/sysconfig/network-scripts/ifcfg-ens3 其中vim是修 ...
- utf8字符集下的比较规则
前言: 在MySQL中,比较常用的字符集是utf8和utf8mb4.这两个字符集是类似的,utf8是utf8mb3的别名,所以之后在MySQL中提到utf8就意味着使用1~3个字节来表示一个字符,如果 ...
- Spring Cloud Gateway之动态路由(数据库版)
1.实现动态路由的关键是RouteDefinitionRepository接口,该接口存在一个默认实现(InMemoryRouteDefinitionRepository) 通过名字我们应该也知道该实 ...
- Django(31)模板中常用的过滤器
模版常用过滤器 在模版中,有时候需要对一些数据进行处理以后才能使用.一般在Python中我们是通过函数的形式来完成的.而在模版中,则是通过过滤器来实现的.过滤器使用的是|来使用. add 将传进来的参 ...