项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/2018CST?filter=all&page=7 |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/14552393.html |
我的课程学习目标 | 1. 熟悉和掌握github的操作 2.增强自己的动手能力 |
这个作业在哪些方面帮助我实现学习目标 | 1. 更加熟练git的相关操作 2. 熟练Typora编辑器的使用方法 |
项目Github的仓库链接地址 | GitHub仓库链接 |
博客正文
任务一:
已按照作业要求,对四名同学的Blog作业点评链接
任务二:
详细阅读《构建之法》第1章、第2章,掌握PSP流程。
- 通过阅读《构建之法》后,学习了第1章主要讲的开发的不同阶段:玩具阶段、业余爱好阶段、探索阶段、成熟的产业阶段;软件工程的定义是:把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程;软件的特殊性:复杂性、不可见性、易变性、服从性、非连续性。计算基础、数学基础、工程基础是软件工程的三大类基础知识领域;我了解到软件工程真正的样子是软件=程序+软件工程。软件工程不仅仅是简单的软件开发的过程。
- 第二章主要讲了单元测试、回归测试、效能分析、个人软件开发流程。这一章讲述了一个好的软件工程师应该怎样合理分析软件错误并明确各个模块功能和提高效能还有如何管理自己的源代码。并且这一章还给了我们锻炼编程基本功的方法和如何实践的过程。学习结束之后对 PSP 有了相关重点的总结如下:
1. 什么是PSP
- 它是一个自我改进的过程,它帮助控制、管理和改进自己的工作方式
- 它是一个结构化的框架,包括了软件开发中使用的表格、准则和规程
- 它提供了一个度量和分析框架,用来检验和管理你的个人工作
- 它还是一个已定义过程,用来帮助你改善自己的个人绩效
2. 软件的特性:软件具有复杂性、不可见性、易变性、服从性、非连续性,这些特性是由软件的本质所决定的,它还有其他特性:
- 有许多不同的程序设计语言、软件工具和软件开发平台;
- 存在许多不同的软件开发流程 ;
- 软件团队中存在许多不同的角色 ;
- 软件通常既可以存储在磁带上,也可以存储在。
3.通过理论学习和具体项目的练习要做到三点
- 研发出符合用户需求的软件说明;
- 通过一定的软件流程,在预计的时间内发布“足够好”的软件说明;
- 并通过数据和其他方式展现所开发的软件是可以维护和继续发展的说明。
4.PSP的特点
- 不局限于某一种软件技术(如编程语言),而是着眼于软件开发的流程,这样,开发不同应用的软件工程师可以互相比较。
- 不依赖于考试,而主要靠工程师自己收集数据,然后分析,提高。
- 在小型、初创的团队中,很难找到高质量的项目需求,这意味着给程序员的输入质量不高。在这种情况下,程序员的输出(程序/软件)往往质量也不高,然而这并不能全部由程序员负责。
- PSP依赖于数据。
- 需要工程师输入数据,记录工程师的各项活动,这本身就需要不小的时间代价。
- PSP的目的是记录工程师如何实现需求的效率,而不是记录顾客对产品的满意度。)
psp
任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|
计划 | 80 | 60 |
查阅相关资料 | 40 | 30 |
规划PSP流程 | 50 | 30 |
开发 | 600 | 720 |
实现问题求解 | 120 | 160 |
排错 | 100 | 130 |
报告 | 120 | 100 |
编写博客 | 60 | 70 |
上传代码 | 10 | |
总结流程 | 30 | 20 |
任务三:
项目开发背景:
-
背包问题(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}背包问题的程序。
动态规划就是通过采用递推(或者分而治之)的策略,通过解决大问题的子问题从而解决整体的做法。动态规划的核心思想是巧妙的将问题拆分成多个子问题,通过计算子问题而得到整体问题的解。而子问题又可以拆分成更多的子问题,从而用类似递推迭代的方法解决要求的问题。基本思想:若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次(将结果存储起来),从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。 这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。 -
回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
功能设计
- 读入文件
- 将txt中的数据存入列表
- 动态规划法求解背包问题
- 画出关于重量与价值的散点图
设计实现:
重要代码:
{
int i,j;
for(i=0; i<=n; i++)
V[i][0]=0;
for(j=0; j<=C; j++)
V[0][j]=0;
for(i=0; i<=n-1; i++)
for(j=0; j<=C; j++)
if(j<w[i])
V[i][j]=V[i-1][j];
else
V[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]);
j=C;
for(i=n-1; i>=0; i--)
{
if(V[i][j]>V[i-1][j])
{
x[i]=1;
j=j-w[i];
}
else
x[i]=0;
}
cout << "选中的物品时:" << endl;
for(i=0; i<n; i++)
cout << x[i];
cout << endl;
return V[n-1][C];
}
代码提交
由于网络的原因代码未能成功上传到GitHub仓库。
实验总结
这次的实验内容多并且复。在完成作业的过程中,我遇到了很多的困难,,在这个过程中,我通过上网查阅了很多的资料以及询问了同学,收获颇多。任务一和任务二没有什么难度,主要是任务三难度比想象中的困难及复杂,因为自己大的编程水平不是很好,完成了一部分的要求,加之网络的原因代码未能成功的上传到GitHub库里面,所以就没有按时完成,后续我会继续努力学习并完善,提高自己的编程水平。