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. ...
随机推荐
- Mybatis(一)Porxy动态代理和sql解析替换
JDK常用核心原理 概述 在 Mybatis 中,常用的作用就是讲数据库中的表的字段映射为对象的属性,在进入Mybatis之前,原生的 JDBC 有几个步骤:导入 JDBC 驱动包,通过 Driver ...
- 1017. Convert to Base -2
Given a number N, return a string consisting of "0"s and "1"s that represents it ...
- The 2014 ACM-ICPC Asia Mudanjiang Regional First Round J
题意: 是个模拟题,就是给你一个字符串,问你他是不是"ABABA" 或者"ABABCAB"的模式,ABC是三个长度不为0且不同的串. 思路: ...
- Python中zipfile压缩文件模块的使用
目录 zipfile 压缩一个文件 解压文件 高级应用 利用 zipfile 模块破解压缩文件口令:Python脚本破解压缩文件口令 zipfile Python 中 zipfile 模块提供了对 z ...
- LA3027简单带权并查集
题意: 有n个点,一开始大家都是独立的点,然后给出一些关系,a,b表示a是b的父亲节点,距离是abs(a-b)%1000,然后有一些询问,每次询问一个节点a到父亲节点的距离是多少? 思路: ...
- Intel汇编语言程序设计学习-第三章 汇编语言基础-上
汇编语言基础 3.1 汇编语言的基本元素 有人说汇编难,有人说汇编简单,我个人不做评价,下面是一个简单的实例(部分代码): main PROC mov eax,5 ;5送EAX寄存器 add ...
- 计算机网络-OSI参考模型
通信分层的好处 1.每一层的更改不会影响其他层2.有利于不同网络设备厂商生产出标准的网络设备 分层方法(比喻) OSI参考模型
- [BUAA2021软工]结对第一阶段博客作业小结
作业链接 结对项目-第一阶段 优秀作业推荐 本次博客作业虽然是简单总结,但是以下作业中都不乏有思考.有亮点的精彩内容,推荐给同学们阅读学习. 山鸣谷应,相得益彰--杰对项目-第一阶段总结 该组对于可能 ...
- Jenkins 基础篇 - 任务分类
从前面的小节中我们看到在创建 Jenkins 任务的时候有好几种类型,如果你专门安装了 Maven 相关插件,可能还会有一个[构建一个 maven 项目]的任务类型,那这些任务类型究竟有何区别,以及我 ...
- NumPy之:ndarray中的函数
NumPy之:ndarray中的函数 目录 简介 简单函数 矢量化数组运算 条件逻辑表达式 统计方法 布尔数组 排序 文件 线性代数 随机数 简介 在NumPy中,多维数组除了基本的算数运算之外,还内 ...