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. ...
随机推荐
- 老Python总结的字典相关知识
字典 Python中的字典(dict)也被称为映射(mapping)或者散列(hash),是支持Python底层实现的重要数据结构. 同时,也是应用最为广泛的数据结构,内部采用hash存储,存储方式为 ...
- 一文读懂eBPF/XDP
XDP概述 XDP是Linux网络路径上内核集成的数据包处理器,具有安全.可编程.高性能的特点.当网卡驱动程序收到数据包时,该处理器执行BPF程序.XDP可以在数据包进入协议栈之前就进行处理,因此具有 ...
- 基于FOC伺服电机驱动的Parallel Scara Robot的设计及实现
上个学期做了一个BLDC的FOC驱动后,我便开始了基于此类电机驱动的机器人项目尝试.之前想做的是串联机械臂,奈何找不到合适的电机并且串联机械臂十分需要减速机,使得项目对于我来说(经济方面)很艰难,恰巧 ...
- php 简易日志函数应用 debug_backtrace()
1 public static function writeILogs($datas) 2 { 3 $bt = debug_backtrace(); 4 $caller = array_shift($ ...
- hdu3234 带权并查集(XOR)
题意: 给你n个未知的正整数,有三总操作 I P V P的值是V I P Q V P XOR Q = V Q K ...
- PAT 乙级 -- 1010 -- 一元多项式求导
题目简述 设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为n*xn-1.) 输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出 ...
- Sqli 注入点解析
目录 Less-1: 字符型注入 Less-2: 数字型注入 Less-3: 单引号字符型+括号 Less-4: 双引号字符型+括号 Less-5: 单引号字符型+固定输出信息 (floor报错注入& ...
- YII框架中的srbac权限管理模块的安全与使用(版本是1.1.20)
0x01 前言 srbac的原理: YII框架的srbac模块是一个专门管理权限的一个模块,那它是怎么管理权限的呢.我们知道YII框架的网页显示是由控制器实现的,控制器继承父类CController和 ...
- Intel汇编语言程序设计学习-第五章 过程-下
5.3.3 库测试程序 测试程序#1:整数I/O 该测试程序把输出文本的颜色改为蓝底黄字,然后以十六进制数显示七个数组的内容,最后提示用户输入一个有符号整数,再分别以十进制.十六进制和二进制格式重复 ...
- 【JavaScript】Leetcode每日一题-二叉搜索树的范围和
[JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...