201871030126-王会娟 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 | 内容 |
课程班级博客链接 | https://home.cnblogs.com/u/wanghuijuan815 |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/14604444.html |
我的课程学习目标 | (1)体验软件项目开发中的两人合作,练习结对编程。 (2)掌握Github协作开发程序的操作方法 |
这个作业在哪些方面帮助我实现学习目标 | (1)通过阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程的概念 (2)对于人机交互界面GUI界面有了了解和实现,同时也对于遗传算法有了深入了解,并用运此算法尝试解决实际问题 (3)通过结对完成这次项目,深切体会到结对完成任务的利弊,也掌握了合作过程中需要注意的问题,对于个人的合作能力有了很大的提升。 |
结对方学号-姓名 | 201871030122-牛建疆 |
结对方本次博客作业链接 | https://www.cnblogs.com/niujianjiang/p/14649441.html |
本项目Github的仓库链接地址 | https://github.com/niujianjiang/-00Sirius |
任务一
《现代软件工程—构建之法》第3-4章内容阅读记录
一,第三章
1、代码规范与代码复审
代码风格的原则是:简明,易读,无二义性。
缩进——建议使用4个空格
行宽——可为100字符
分行——不要把多行语句放在一行上
注释——复杂的注释应该放在函数头,注释应只用ASCII字符
命名——“匈牙利命名法”,能方便程序员看到变量的类型。
下划线问——用来分割变量名字中的作用域标注和变量的语义。
大小写问题——变量名由多个单词组成时,为方便区分,可使用大小写区分。
2、结对编程和两人合作
(1)结对编程的优点
-
在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。
-
对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
-
在心理上, 当有另一个人在你身边和你紧密配合, 做同样一件事情的时候, 你不好意思开小差, 也不好意思糊弄。
-
在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。
(2)代码复审
-
代码复审的定义:看代码是否在“代码规范”的框架内正确地解决了问题。
-
复审的形式
-
自我复审:自己vs自己。
-
同伴复审:复审中vs开发者(软件工程中最基本的复审方法)。
-
团队复审:团队vs开发者。
-
-
不间断地复审:结对编程让两个人所写的代码不断地处于“复审”的过程,正如前所述,复审是不断地审核,提高设计和编码质量的过程,结对编程让复审随时随地发生,这样才能及时地发现问题和解决问题,避免把问题拖到后面的阶段。
(3)要避免的误区
-
处于探索阶段的项目,需要深入地研究,在这种情况下,一个人长时间的独立钻研是有必要的。
-
在做后期维护的时候,如果维护的技术含量不高,只需要做有效的复审即可,不必拘泥于形式,硬拉一个人来结对唱二人转。
-
如果验证测试需要运行很长时间,那么两个人在那里等待结果是有点浪费时间。
-
如果团队的人员要在多个项目中工作,不能充分保证足够的结对编程时间,那么成员要经常处于等待的状态,反而影响效率。
-
关键是如何最大限度地发挥“领航员”的作用,如果用处不大,也就无需结对。
二、第四章软件过程/方法论
-
团队有共同的特点—— 团队有一致的集体目标, 团队要一起完成这目标。 团队成员有各自的分工, 互相依赖合作, 共同完成任务。
-
软件团队形式——一窝蜂模式,主治医师模式,社区模式,社区模式,业余剧团模式,秘密团队,特工团队,交响乐团模式,爵士乐模式,功能团队模式,官僚模式。
任务二
评价结对方《实验二 软件工程个人项目》的项目成果
-
结对方博客链接
-
博客评论
-
代码核查表概要部分
概要部分 完成情况 代码能符合需求和规格说明么? 代码完成了部分需求,代码编写基本规范 代码设计是否有周全的考虑? 代码设计考虑和需求分析完成较好 代码可读性如何? 代码简单易读 代码容易维护么? 代码名命不够规范,逻辑不清楚,导致代码维护较为困难 代码的每一行都执行并检查过了吗? 主要代码有明确的标注,每行代码都有认真检查 设计规范部分 完成情况 设计是否遵从已知的设计模式或项目中常用的模式? 设计基本遵循已知的设计模式 有没有硬编码或字符串/数字等存在? 没有 代码有没有依赖于某一平台,是否会影响将来的移植? 代码没有依赖与某一平台,不会影响到将来的移植 开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?
在本项目中是否存在类似的功能可以调用而不用全部重新实现?否 有没有无用的代码可以清除? 没有无用的代码可以清除代码规范部分 - 修改的部分符合代码标准和风格么(详细条文略)
修改部分基本符合代码标准和风格
- 具体代码部分
代码可读性如何?有没有足够的注释?
代码有较好的可读性,重要代码部分缺少注释
代码是否需要更新或创建新的单元测试?
不用更新和创建新的单元测试
任务三
一、需求分析称述:
(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数据的最优解和求解时间(以秒为单位);
-
任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件
(2)需要将D{0-1}KP 实例数据集存储在数据库,有利于数据持久化,易于查询,并能控制冗余,提高数据的利用率。
(3)实现平台可动态嵌入任何一个有效的D{0-1}KP 实例求解算法,并保存算法实验日志数据;
(4)实现完成人机交互界面,并要求人机交互界面要求为GUI界面或WEB页面或APP页面都可;
(5)利用遗传算法求解D{0-1}KP,并利用此算法测试要求(3);
二、:软件设计说明
-
实现用户界面设计,
-
将所有有关的数据导入数据库,减少数据冗余,提高数据的利用率。
-
了解遗传算法,利用遗传算法实现求解D{0-1}KP,并且进行算法测试。
(1)基因编码:在这个过程中,尝试对一些个体的基因做一个描述,构造这些基因的结构,有点像确定函数自变量的过程。
(2)设计初始群体:在这里需要造一个种群出来,这些种群有很多生物个体但基因不同。
(3)适应度计算(剪枝):这里对那些不符合要求的后代进行剔除,不让他们产生后代。否则他们产生的后代只会让计算量更大而对逼近目标没有增益。
(4)产生下一代:有3种方法,即:直接选择,基因重组,基因突变
而后回到步骤(3)进行循环,适应度计算,产生下一代,这样一代一代找下去,直到找到最优解为止。
遗传算流程图
三、:软件实现及核心功能代码展示
-
用户界面实现:
-
连接数据库
四、:程序运行
-
用户界面
-
建立数据库
五:合作记录
六:本次作业PSP
任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|
计划 | 30 | 40 |
· 估计这个任务需要多少时间,并规划大致工作步骤 | 20 | 35 |
开发 | 735 | 880 |
需求分析 (包括学习新技术) | 20 | 60 |
生产设计文档 | 15 | 20 |
· 设计复审 (和同事审核设计文档) | 10 | 10 |
代码规范 (为目前的开发制定合适的规范) | 50 | 40 |
具体设计 | 50 | 80 |
具体编码 | 540 | 600 |
· 代码复审 | 20 | 30 |
· 测试(自我测试,修改代码,提交修改) | 30 | 40 |
报告 | 120 | 180 |
· 事后总结 ,并提出过程改进计划 | 10 | 20 |
七:小结感受
通过这次的结对和作完成项目,深切体会到结对的诸多好处,两个人对于问题的分析和理解会更加深入,不会像一个人考虑时那么片面,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。两个人在一起会相互学习,传递经验,取长补短;配合工作能够提高工作效率,结对工作能带来更多的信心。当然在这个过程中当中也遇到了一些问题,有时候两个的时间上会有冲突,这就需要相互协调,也有时候两个人的想法不一致等问题,但是我觉得结对编程利远大于弊。