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. ...
随机推荐
- ASP封装DLL 直接上代码
ASP转DLL 基本引用类库 OLE Automation Com+ services Type Library Microsoft Active Server Pages Object Micros ...
- php引入html文件(或php文件)的方法
php引入html文件(或php文件)的方法 一.使用fopen()函数 此函数主要传入的是头两个参数(第一个是文件地址,第二个是打开方式),可以读取任何一个文本文件,然后用while将fopen函 ...
- SpringCloud之服务网关Gateway,入门+实操
SpringCloudAlibaba微服务实战教程系列 Spring Cloud 微服务架构学习记录与示例 一. GateWay简介 Spring Cloud GateWay是Spring Cloud ...
- POJ2391 Floyd+离散化+二分+DINIC
题意: 有n个猪圈,每个猪圈里面都有一定数量的猪(可能大于当前猪圈的数量),每个猪圈都有自己的容量,猪圈与猪圈之间给出了距离,然后突然下雨了,问多久之后所有的猪都能进圈. 思路: ...
- Day007 递归
递归 定义 A方法调A方法!就是自己调自己 作用 利用递归可以用简单的程序来解决一些复杂的问题.它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程 ...
- MBG:mybatis逆向工程使用
一:如果是Maven工程可在pom.xml文件中添加插件 <build> <plugins> <plugin> <groupId>org.mybatis ...
- 【vue-02】基础语法
插值操作 插值运算符 语法:{{数据}} 插值运算符可以对数据进行显示{{msg}},也可以在插值运算符中进行表达式计算{{cnt*2}}. v-html 希望以html格式进行输出 htmlData ...
- web.xml常用配置详解
web.xml常用配置详解 context-param 指定 ServletContext(上下文) 配置文件路径,基本配置一般是Spring配置文件,或者是spring-security的配置文件. ...
- JPEG头部解析
6.3 JPEG格式 6.3.1简介 微处理机中的存放顺序有正序(big endian)和逆序(little endian)之分.正序存放就是高字节存放在前低字节在后,而逆序存放就是低字 ...
- 通过LinkedHashMap实现LRU算法
一.基于LinkedHashMap源码分析 方法调用流程(这里只是以put方法位例) put() -> putVal() -> afterNodeInsertion() -> rem ...