201871030134-余宝鹏 实验二 个人项目一 《D{0-1}KP》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 班级博客 |
这个作业要求链接 | 作业要求 |
我的课程学习目标 | 1、掌握软件项目个人开发流程 2、掌握Github发布软件项目的操作方法 |
这个作业帮助我在哪些方面实现学习目标 | 1、通过阅读都《构建之法》前2章,掌握PSP流程 2、通过开发项目D{0-1}KP掌握软件项目个人开发流程 3、通过提交个人软件项目到Github,掌握Github发布软件项目的操作方法 |
项目Github的仓库链接地址 | Github仓库链接 |
任务1的作业点评链接
作业1点评
作业2点评
作业3点评
任务2:PSP流程
- 内容:总结详细阅读《构建之法》第1章、第2章,掌握PSP流程。
- PSP参考:https://www.cnblogs.com/xinz/archive/2011/10/22/2220872.html
个人软件过程(PSP)
中文名 个人软件过程 外文名 Personal Software Process 简称 PSP 作用 确定过程的改变 影响 含义:个人软件过程(Personal Software Process,PSP)是一种可用于控制、管理和改进个人工作方式的自我持续改进过程,是一个包括软件开发表格、指南和规程的结构化框架。PSP与具体的技术(程序设计语言、工具或者设计方法)相对独立,其原则能够应用到几乎任何的软件工程任务之中。PSP能够说明个体软件过程的原则; 帮助软件工程师作出准确的计划;确定软件工程师为改善产品质量要采取的步骤;建立度量个体软件过程改善的基准;确定过程的改变对软件工程师能力的影响。
具体运用:在下面的任务中,使用PSP来展示自己对于任务的估计以及实际消耗时间,以此对于软件工程个人项目开发有更为深刻的认识。
任务3:个人软件项目开发
项目开发背景:D{0-1}KP是经典{0-1}背包问题的一个拓展形式,用以对实际商业活动中折扣销售、捆绑销售等现象进行最优化求解,达到获利最大化。
D{0-1}KP数据集由一组项集组成,每个项集有3项物品可供背包装入选择,其中第三项价值是前两项之和,第三项的重量小于其他两项之和,算法求解过程中,如果选择了某个项集,则需要确定选择项集的哪个物品,每个项集的三个项中至多有一个可以被选择装入背包,D{0-1} KP问题要求计算在不超过背包载重量C的条件下,从给定的一组项集中选择满足要求装入背包的项,使得装入背包所有项的价值系数之和达到最大。
D{0-1} KP instances数据集是研究 D{O-1}背包问题时,用于评测和观察设计算法性能的标准数据集;动态规划算法、回溯算法是求解D{0-1}背包问题的经典算法。
需求分析
- 算法要求:动态规划算法、回溯算法
- 程序要求:查阅相关资料,设计一个采用动态规划算法、回溯算法求解D{0-1}背包问题的程序
- 技术要求:需要掌握动态规划算法和回溯算法,要对0-1背包问题熟练掌握,要学会数据可视化技术以及python的切片,保存数据到文本等操作
- 语言要求:项目未规定语言,所以在解决过程中可使用学过的编程语言。项目要求对数据进行读取以及数据可视化,故初步设想使用python语言实现。
功能设计
- 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文件。
设计实现
说明:对于D{0-1}KP问题,我未能在实验中将其解决,实验时遇到的问题首先是对于数据的切片读取,我在实验过程中查找了很多资料,知网上有不同于动态规划和回溯算法的解决算法,我阅读了几篇论文,但是这些算法太过高深,我未能理解。因此,我将0-1背包问题进行了深一步的学习,具体内容如后面博客。
问题描述:有5个物品,其重量分别是{2, 2, 6, 5, 4},价值分别为{6, 3, 5, 4, 6},背包的容量为10,计算背包所能装入物品的最大价值。
动态规划算法:在0/1背包问题中,物品i或者被装入背包,或者不被装入背包,设xi表示物品i装入背包的情况,则当xi=0时,表示物品i没有被装入背包,xi=1时,表示物品i被装入背包。根据问题的要求,有如下约束条件和目标函数:
\[\begin{cases} \sum_{1}^{n}{W_iX_i}\leq{C}\\ X_i\epsilon\big\{0,1\big\},(1\leq{i}\leq{n})\end{cases}
\]\[max\sum_{i=1}^{n}{V_iX_i}
\] 于是,问题归结为寻找一个满足约束条件式1,并使目标函数式2达到最大的解向量X=(x1, x2, …, xn)。0/1背包问题可以看作是决策一个序列(x1, x2, …, xn),对任一变量xi的决策是决定xi=1还是xi=0。按下述方法来划分阶段:第一阶段,只装入前1个物品,确定在各种情况下的背包能够得到的最大价值;第二阶段,只装入前2个物品,确定在各种情况下的背包能够得到的最大价值;依此类推,直到第n个阶段。
用回溯算法解决时主要注意以下几点:
- 如何建立解空间树
- 如何进行剪枝
- 是否需要达到最优
测试运行
运行截图(动态规划算法):
运行截图(回溯算法):
代码片段
动态规划算法
int KnapSack(int n, int w[], int v[]){
int i, j; //1.初始化第0列
for ( i = 0; i <=n; i++)
{
V[i][0] = 0;
} //2.初始化第0行
for ( j = 0; j <=C; j++)
{
V[0][j] = 0;
} //3.初始化第i行,进行i次迭代
for (i = 1; i <=n; i++)
{
for ( j = 1; j <= C; j++)
{
if (j<w[i-1])
{
//第j个物品重量大加不进去
V[i][j] = V[i - 1][j];
}
else
{
V[i][j] = max(V[i - 1][j], V[i-1][j-w[i-1]]+v[i-1]);
}
}
} //4.求装入的物品
for ( j = C,i=n; i>0; i--)
{
if (V[i][j]>V[i-1][j])
{
x[i-1] = 1;
j = j - w[i-1];
}
else
{
x[i-1] = 0;
}
} //5.返回背包的最大价值
return V[n][C];
}
回溯算法(dfs)
void dfs(int i)
{
if(i > n){
if(valueofPackage >= maxTotalValue){
for(int i = 1 ; i <= n ; i++){
optimal[i] = selected[i];
}
maxTotalValue = valueofPackage;
}
return;
}else{
residualCapacity -= weight[i];
if(residualCapacity >= 0){ //遍历左子树
selected[i] = 1;
valueofPackage += value[i];
dfs(i+1);
selected[i] = 0;
valueofPackage -= value[i];
residualCapacity += weight[i];
}else{//不满足原路返回
residualCapacity += weight[i];
}
}
//遍历右子树
dfs(i+1);
}
总结
任务3是D{0-1}KP,D{0-1}KP是经典{0-1}背包问题的一个拓展形式,用以对实际商业活动中折扣销售、捆绑销售等现象进行最优化求解,达到获利最大化。在解决此问题的过程中,我未能正确读入实验数据文件的有效D{0-1}KP数据,导致此次实验的失败。但是,我在此次实验的过程中,将PSP流程用到解决0-1背包问题的时候,体会到了软件设计的“模块化”原则。具体体现如下说明:
- 运用两种不同的算法:动态规划算法和回溯算法解决0-1背包问题
- 首先进行项目的需求分析,清晰的了解项目的需求
- 其次对项目进行功能设计,了解项目需要满足的基本功能
- 再次对项目进行设计实现,此时代码部分会有明显的类,需要明确这些类的功能以及它们之间的关系
- 然后对项目进行测试运行,此时需要测试各种不同类型的数据以验证程序的正确性
- 最后对工程项目进行反思总结,思考今后遇到此类问题时自己能够如何简化解决方法
PSP展示
PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min) Planning 计划 15 13 Estimate 估计这个任务需要多少时间,并规划大致工作步骤 15 13 Development 开发 235 277 Analysis 需求分析(包括学习新技术) 50 60 Design Spec 生成设计文档 25 30 Design Review 设计复审(和同事审核设计文档) 10 15 Coding Standard 代码规范(为目前的开发制定合适的规范) 10 10 Design 具体设计 30 35 Coding 具体编码 60 70 Code Review 代码复审 20 22 Test 测试(自我测试,修改代码,提交修改) 30 35 Reporting 报告 40 34 Test Report 测试报告 15 12 Size Measurement 计算工作量 10 12 Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 15 10 反思:
- 通过任务1点评同学们的博客,我认识到了自己的不足之处,同学们的博客对我而言有很大的指导作用,在今后的学习中,我希望自己能够取长补短,书写博客时能够在内容和排版上更进一步;
- 通过任务2阅读《构建之法》前2章,我对于PSP流程有了一定的认识。PSP流程对于我们今后开发软件项目有很大的指导作用,使过程更加清晰,结果的可预见性增强;
- 通过任务3个人软件项目D{0-1}KP开发,我认识到自己在编程这一方面的严重不足,虽然自己对于0-1背包问题已经熟练掌握,但是只要问题一变形,自己就陷入进退两难的处境,导致此次作业对于任务3未能解决。我将在今后《软件工程》的学习中,加深自己对于《软件工程》的认识,努力提高自己的编程能力。“编程不牢,地动山摇”将是我今后学习的动力。
- 通过任务4将项目源码的完整工程文件提交到Github账号的项目仓库中,我再次学习了对于Github的使用,体会到这个源代码管理工具的优势。
在提交项目源码的完整工程文件的时候我查找了资料,配置了Git(参考这篇博客),然后使用了命令行方式进行了一些尝试操作,最后失败了,但还是了解到了很多git bush的命令,希望在今后的学习过程中查缺补漏,更进一步。
- git下载配置及文件夹创建
- git bush命令行操作
- git下载配置及文件夹创建
201871030134-余宝鹏 实验二 个人项目一 《D{0-1}KP》项目报告的更多相关文章
- 201871030134-余宝鹏 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.体验软件项目开发中的两人合作,练习结对编程(Pair programming) 2.掌握GitHub协作开发程 ...
- 201871010203-陈鹏昱 实验二 个人项目—《D{0-1}KP问题》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 运用科学高效的方法学习软件工程的理论和知识 这个作业在哪些方面帮助我实现学习目标 掌握软件项目个人开发流程,掌握G ...
- 201871030127-王明强 实验二 个人项目—《D{0-1}背包问题 》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 (1)详细阅读<构建之法>学习并掌握PSP的具体流程(2)掌握背包问题,通过查阅相关资料,设计一个采用 ...
- 201871030125-王芬 实验二 个人项目-《D{0-1}问题》软件项目报告
实验二 个人项目-<D{0-1}问题>软件项目报告 项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 ...
- 201871030131-谢林江 实验二 个人项目—《D{0-1} KP》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.学习编写PSP2.完成个人项目实验要求3.在Github建仓 这个作业在哪些方面帮助我实现学习目标 1.首次编 ...
- 201871030106-陈鑫莲 实验二 个人项目-《D{0-1} KP 问题》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.掌握软件项目个人开发流程2.掌握Github发布软件项目的操作方法 这个作业在哪些方面帮助我实现学习目标 1. ...
- 201871030102-崔红梅 实验二 个人项目—— D{0-1}KP 项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 实验二作业链接 我的课程学习目标 1.熟练掌握将本地代码保存至GitHub中2.掌握折扣背包问题3.回顾动态规划算法和回溯算法4.对java语 ...
- 201871010130-周学铭 实验二 个人项目—D{0-1}问题项目报告
项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 实验二 软件工程个人项目 我的课程学习目标 掌握软件项目个人开发流程.掌握Github发布软件项目的操作方法. 这个作业在哪些方面帮助我实 ...
- 201871030135-姚辉 实验二 个人项目—《D{0-1} KP》项目报告
项目 内容 课程班级博客链接 课程班级博客链接 这个作业要求链接 这个作业要求链接 我的课程学习目标 (1)掌握软件项目个人开发流程.(2)掌握Github发布软件项目的操作方法. 这个作业在哪些方面 ...
随机推荐
- 为什么说NGK引领全球数字资产财富革命
进入2020年,区块链万业迸发出巨大的能量,事实上区块链和数字经济正是未来全球财富的新方向.区块链和数字货币的增值空间巨大,是数字时代新的经济增长点.目前,全球衍生品市场价值532万亿美元,全球债务市 ...
- NDK android Error:Expected caller to ensure valid ABI: MIPS
android studio 安装NDK之后,报错 Error:Expected caller to ensure valid ABI: MIPS 环境: android studio 2.3 gra ...
- C++算法代码——纪念品分组[NOIP2007 普及组]
题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1099 https://www.luogu.com.cn/problem/P1094 ...
- 01.Numpy数组的基本应用
数组的创建 数组的访问 数组的合并 数组的分割 数组创建 >>> import numpy as np 创建一维数组 >>> x = np.arange(10) & ...
- C#从1970年开始到现在时间的总秒数
TimeSpan timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1)); string timeStamp = ((int)timeSpan. ...
- idea添加汉化包之后出现的一些问题 解决方案
先把原链接放在这:https://jingyan.baidu.com/article/fb48e8bef2bcb66e622e14d2.html 关掉idea之后,一定要记住是在压缩软件中打开,而不是 ...
- docker+tomcat+jenkin实现立即构建Springboot项目
一.创建一个Springboot项目 1.编写pom.xml <groupId>com.zwhxpp</groupId> <artifactId>springboo ...
- python进阶(12)闭包
闭包 首先了解一下:如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数. 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用 ...
- PHP代码审计_用==与===的区别
目录 背景介绍 如何审计 绕过案例1 绕过案例2 背景介绍 比较==与===的差别 == 是等于符号,=== 是恒等于符号,两个符号的功能都是用来比较两个变量是否相等的,只不过两个符号的比较维度不一样 ...
- Oracle VM VirtualBox的下载和安装
软件介绍 VirtualBox 是一款开源虚拟机软件,由德国 Innotek 公司开发,由Sun Microsystems公司出品的软件,使用Qt编写,在 Sun 被 Oracle 收购后正式更名成 ...