201871010129-郑文潇 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 | 内容 |
---|---|
课程班级博客 | https://edu.cnblogs.com/campus/xbsf/2018CST |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/14604444.html |
我的课程学习目标 | 1.双人合作完成项目 2.通过github作对同伴个人项目仓库的源码 3.学习遗传算法 |
这个作业在哪些方面帮助我实现学习目标 | 通过这个作业,我知道了合作的重要性,对自己代码和同伴代码的查看与操作 |
结对方学号-姓名 | 谢金鑫-201871010127 |
结对方本次博客作业链接 | https://www.cnblogs.com/xiejinxin/p/14656025.html |
项目GitHub仓库地址 |
任务一
代码风格规范
包括:缩进、 行宽、括号(用括号清楚地表示逻辑优先级)、 断行与空白的{}行、分行、命名精简,会意、下划线、大小写 、注释等。
代码风格的原则是:简明,易读,无二义性。
代码设计规范
代码设计规范不光是程序书写的格式问题,而且牵涉到程序设计、模块之间的关系、设计模式等方方面面,要遵守下面的规定:
1.函数 现代程序设计语言中的绝大部分功能,都在程序的函数中实现。
2.goto 函数最好有单一的出口,为了达到这一目的,可以使用goto。只要有助于程序逻辑的清晰体现,什么方法都可以使用。
3.错误处理 当程序的主要功能实现后,给代码加一些错误处理。
4.参数处理 在Debug版本中,所有的参数都要验证其正确性。在正式版本中,对从外部(用户或别的模块)传递过来的参数,要验证其正确性。
5.断言 当你觉得某事肯定如何时,就可以用断言。
代码复审
- 找出代码的错误
- 发现逻辑错误
- 发现算法错误
- 发现潜在的错误和回归性错误
- 发现可能需要改进的地方
- 开发人员,传授经验,在交流中不断提升能力。
结对编程
结对编程:结对编程是软件开发过程中所使用的一种技术,两名程序开发人员共享同一台工作站。其中一个扮演驾驶者(Driver)的角色,进行代码编写,另一个扮演观察员(Observer)或导航员(Navigator)的角色,对代码进行评测。他们可以轮流编写代码和测试案例,还可以坐在一起交流思想,解决问题,而不会想偷懒去刷手机。
任务二
1.已对我的结对放谢金鑫实验二进行了中肯的评价
2.克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
核查项目 | 情况分析 |
---|---|
概要部分 | 代码符合设计需求和规格,功能未能完全实现,可读性和安全性有待提高。建议统一代码的格式规范,优化功能性和安全性。 |
设计规范部分 | 能遵从设计模式,存在无用代码。建议:尽可能实现系统功能,删除无用代码。 |
代码规范部分 | 修改部分符合代码规范和风格。 |
具体代码部分 | 代码的错误均已处理,但数据库的安全性有待提高。建议:改善程序与数据库的连接方式,提高安全性能。 |
效能 | 代码能正常编译,无超时情况 |
可读性 | 代码可读性较强,但是注释不清晰。建议:增加代码的功能注释,统一格式。 |
可测试性 | 建议:代码可增添新的单元测试。 |
任务三
1.需求分析
背包问题是一个经典的组合优化问题,有着广泛而重要的应用背景。{0-1}背包问题是最基本的KP问题形式,它的一般描述为:从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?
在处理到第i个物品时,可以假设一共只有i个物品,如果前面i-1个物品的总的最大价值已经定下来了,那么第i个物品选不选将决定这1~i个物品能带来的总的最大价值。刚刚是自顶向下,接下来反过来自底向上,第1个物品选不选可以轻松地用初始化解决,接下来处理第i个物品时,假设只有2个物品就好,那他处理完后前2个物品能带来的最大总价值就确定了,这样一直推下去,就可以推出前n个物品处理完后能带来的最大总价值。
对于每个背包,都只有0和1的情况,也就是拿或者不拿两种情况
如果拿:那么空间就会减一点,比如说现在在考虑第i个物品拿不拿,如果说当前剩余空间为j,那么拿了之后空间就变为j-c[i],但是总价值却会增加一点,也就是增加w[i]
如果不拿:那么空间不会变,还是j,但是总价值也不会变化。
2.核心代码:
(1)初始界面
</head>
<body>
<font size="5">
<a href="sandain.html" title="读者你好,单击这里可以发电子邮件。">散点图</a><br />
<a href="dongtai.html" title="读者你好,欢迎进入FTP服务器。">动态规划</a><br />
<a href="huisu.html" title="读者你好,欢迎进入Telnet服务器。">回溯法</a><br />
<a href="yichuan.html" title="读者你好,欢迎进入Telnet服务器。">遗传算法</a>
</font>
</body>
</html>
(2)动态规划
def dp(num, maxWeight):
l = []
profitArr = []
profitArr = profit[num]
weightArr = []
weightArr = weight[num]
for i in range(maxWeight + 1):
l.append(0)
for i in range(len(profit[num])):
for j in range(maxWeight, -1, -1):
for k in range(3):
if j >= weightArr[i][k]:
l[j] = max(l[j], l[j - weightArr[i][k]] + profitArr[i][k])
print(l[maxWeight])
(3)回溯法
def huisu(num, maxWeight, x, y, totalP, totalW): # 访问一个节点 x,y 计算当前价值
if y != 3:
totalP = totalP + profit[num][x][y]
totalW = totalW + weight[num][x][y]
if x == len(profit[num]) - 1:
# 总价值和总重量
if totalW > maxWeight:
# print(totalP)
pathList.append(totalP)
return 0
else:
endMax.append(totalP)
pathList.append(totalP)
return 0
else:
for i in range(4):
huisu(num, maxWeight, x + 1, i, totalP, totalW)
return 0
(4)遗传算法
# coding=utf-8
import random
#背包问题
# 物品 重量 价格
X = {
1: [10, 15],
2: [15, 25],
3: [20, 35],
4: [25, 45],
5: [30, 55],
6: [35, 70]}
#终止界限
FINISHED_LIMIT = 5
#重量界限
WEIGHT_LIMIT = 80
#染色体长度
CHROMOSOME_SIZE = 6
#遴选次数
SELECT_NUMBER = 4
max_last = 0
diff_last = 10000
#判断退出
def is_finished(fitnesses):
global max_last
global diff_last
max_current = 0
for v in fitnesses:
if v[1] > max_current:
max_current = v[1]
print 'max_current:',max_current # 得到当前最大的价值
diff = max_current - max_last # 价值差,也就是适应度的改变的大小
# 这里判断连续两代的改变量如果都小于5,则停止迭代
if diff < FINISHED_LIMIT and diff_last < FINISHED_LIMIT:
return True
else:
diff_last = diff
max_last = max_current
return False
#初始染色体样态
def init():
chromosome_state1 = '100100'
chromosome_state2 = '101010'
chromosome_state3 = '010101'
chromosome_state4 = '101011'
chromosome_states = [chromosome_state1,
chromosome_state2,
chromosome_state3,
chromosome_state4]
return chromosome_states
#计算适应度
def fitness(chromosome_states):
fitnesses = []
for chromosome_state in chromosome_states: # 遍历所有的染色体
value_sum = 0 # 物品重量
weight_sum = 0 # 物品价值
# 将一个可遍历的数据对象组合为一个索引序列,同时列出数据和数据下标
for i, v in enumerate(chromosome_state):
# 对染色体中的1,即存在的物品体重和价格求和
if int(v) == 1:
weight_sum += X[i + 1][0]
value_sum += X[i + 1][1]
fitnesses.append([value_sum, weight_sum])
return fitnesses
#筛选
def filter(chromosome_states, fitnesses):
#重量大于80的被淘汰
index = len(fitnesses) - 1
while index >= 0:
index -= 1
if fitnesses[index][1] > WEIGHT_LIMIT:
chromosome_states.pop(index) # 弹出不符合条件的染色体
fitnesses.pop(index) # 弹出不符合条件的适应度
#print chromosome_states,'\n',fitnesses
#遴选
selected_index = [0] * len(chromosome_states) # 如果[0]*3得到的是[0,0,0]
for i in range(SELECT_NUMBER):
# 随机选择染色体,然后得到相应的索引
j = chromosome_states.index(random.choice(chromosome_states))
selected_index[j] += 1
return selected_index
# 交叉产生下一代
def crossover(chromosome_states, selected_index):
chromosome_states_new = []
index = len(chromosome_states) - 1
#print 'index:',index
while index >= 0: # 遍历完所有的染色体组的染色体(其中下标-1代表最后一个染色体的索引)
print 'index:',index
index -= 1
chromosome_state = chromosome_states.pop(index)
print 'chromosome_states_3:',chromosome_states # 弹出后的染色体组
print 'chromosome_state:',chromosome_state # 弹出的染色体
for i in range(selected_index[index]):
chromosome_state_x = random.choice(chromosome_states) # 随机选择一个染色体
print 'chromosome_state_x:',chromosome_state_x
pos = random.choice(range(1, CHROMOSOME_SIZE - 1)) # 随机[1, 2, 3, 4]其中的一个数
print 'pos:',pos
chromosome_states_new.append(chromosome_state[:pos] + chromosome_state_x[pos:])
print 'chromosome_states_new:',chromosome_states_new
chromosome_states.insert(index, chromosome_state) # 恢复原染色体组
print 'chromosome_states_4:', chromosome_states
return chromosome_states_new # 返回得到的新的染色体组
if __name__ == '__main__':
# 初始群体
chromosome_states = init() # 是全局的
print 'chromosome_states:',chromosome_states
n = 100 # 迭代次数
while n > 0:
n -= 1
#适应度计算
fitnesses = fitness(chromosome_states)
#print 'fitnesses:',fitnesses
if is_finished(fitnesses):
break # 如果符合条件,立刻停止循环
print '1:', fitnesses
#遴选
selected_index = filter(chromosome_states, fitnesses)
print '2:', selected_index
print 'chromosome_states_2:',chromosome_states
#产生下一代
chromosome_states = crossover(chromosome_states, selected_index)
print '3:', chromosome_states
print str(n)+'..................................' # 迭代次数
fitnesses = fitness(chromosome_states)
print 'fitnesses:',fitnesses
print chromosome_states
3.运行结果:
(1)初始界面:
(2)散点图
(3)动态规划
(4)回溯
(5)遗传
4.结对编程
小结感受:两人合作真的能够带来1+1>2的效果吗?通过这次结对合作,请谈谈你的感受和体会。
在本次结对编程的过程中,我了解了合作是十分重要的,通过相互的讨论和监督使得代码更规范,功能更完善,逻辑较为严谨,特别是在单元测试和代码复审时,能更快的发现代码的错误,结对编程的效率比较高,在代码规范方面,意识到随意编写的危害,读代码改代码都很费劲,在按编写规范写程序后,逐渐改善了这种情况,但在结对编程中也遇到了问题,比如刚开始分工上打算一人主导一人辅助,但发现主导的人思维有时会混乱,所以就交换充当主导者的角色。本次项目做出改进在编程的过程中经常会出现事与愿违的事情,这样使得讨论陷入僵局,这时我们相互讨论取长补短解决问题
201871010129-郑文潇 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告的更多相关文章
- 201871030125-王芬 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
实验三 软件工程结对项目 项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs ...
- 201871030110-何飞 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
201871030110-何飞 实验三 结对项目-<D{0-1}KP 实例数据集算法实验平台>项目报告 项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 ...
- 201871030137-杨钦颖 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
201871030137-杨钦颖 实验三 结对项目-<D{0-1}KP 实例数据集算法实验平台>项目报告 项目 内容 课程班级博客链接 班级连接 这个作业要求链接 作业连接 我的课程学习目 ...
- 201871030139-于泽浩 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
201871030139-于泽浩 实验三 结对项目-<D{0-1}KP 实例数据集算法实验平台>项目报告 项目 内容 课程班级博客链接 2018级卓越班 这个作业要求链接 软件工程结对项目 ...
- 201871010110-李华 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 (1)理解并掌握代码风格及设计规范:(2)通过任务3进行协作开发,尝试进行代码复审,在进行同伴复审的过程中体会结对 ...
- 201871030108-冯永萍 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
实验三 软件工程结对项目 项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs ...
- 201871030116-李小龙 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-dai ...
- 201871010113-贾荣娟 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 实验三-软件工程结对项目 这个课程学习目标 掌握软件开发流程,提高自身能力 这个作业在哪些方面帮助我实现了学习目标 本次实验让我对软件工程 ...
- 201871030127-王明强 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 实验三 软件工程结对项目 我的课程学习目标 1.熟悉PSP流程2. 熟悉github操作3.加深对D{0-1}问题的解法的理解4.熟悉ja ...
- 201871030114-蒋鑫 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接☛ 班级博客 这个作业要求链接☛ 作业要求 我的课程学习目标☛ 1. 体验软件项目开发中的两人合作,练习结对编程(Pair programming).2. 掌握Github ...
随机推荐
- git & Angular git commit 规范
git & Angular git commit 规范 https://github.com/angular/angular/commits/master https://github.com ...
- asm 查看字节码
a.asm global Start section .text inc dword [esi] push edi mov edi,[esp+0x14] λ nasm -f win32 a.asm - ...
- NGK新加坡峰会:超级节点和开源代码为DeFi生态带来新曙光!
据伦敦金融时报以及纽约商业报等多家媒体报道的消息,1月31日,2021 NGK区块链峰会于新加坡正式开幕,全球多位区块链研究所专家线上受邀出席参会,NGK灵石技术研发Clifton先生,法国区块链专家 ...
- NGK公链助力医疗行业数据安全
近年来医疗领域的数据泄露事件时有发生,医疗行业数据面临着医疗数据获得不易及缺乏有效管理和数据安全机制问题.而区块链的去中心化.分布式账本等特点正好契合医疗领域的需求点. 医疗数据市场痛点 一.医疗信息 ...
- [转]关于特征点法、直接法、光流法slam的对比
转载网址:https://blog.csdn.net/weixin_38203573/article/details/79787499 特征点法: 通过特征点匹配来跟踪点,计算几何关系得到R,t,BA ...
- 哪些原因会导致JAVA进程退出?
本文转载自哪些原因会导致JAVA进程退出? 导语 JAVA进程消失可能有哪些原因? 那我们就开一篇文章说一下这个问题,其实很easy的,无外乎三种情况. linux的OOM killer杀死 JVM自 ...
- Flex实现左右布局
html <div class="business-content-1"> <div class="item"> 111 </di ...
- Mac上的Redis安装和使用
redis简介 REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库. Re ...
- 那些容易犯错的c++保留字
本文首发 | 公众号:lunvey 目前正在学习vc++6.0开发,而这里面使用的是c++98标准. 保留字,也称关键字,是指在变量.函数.类中不得重新声明的名称. c++98中大致有48个保留字,这 ...
- Linux解压缩相关命令
Linux解压缩相关命令 运行级别: 0:关机 1:单用户 2:多用户无网络连接 3:多用户有网络连接 4:系统保留 5:图形界面 6:系统重启 通过init[0123456]来切换不同的运行级别 g ...