比如有以下数组:
[0,0,0,0,0,0,1,0]
[1,1,0,1,0,1,1,1]
[0,0,0,1,0,0,1,0]
[1,0,0,0,0,0,1,1]
[1,1,0,1,0,1,1,1]
[1,1,0,1,0,0,1,1]
[1,0,1,0,1,1,1,0]
[0,0,0,0,0,0,0,0]
数组的每一位代表一个测试结果。
三个数组的组合保证三个数组每一位都至少有一个1。
原数组不可变异,只能变异数组标号。
每个新的子代要打印出被组合在一起的是第几个数组。

请问如何用python模拟基于遗传算法的回归测试?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- soar3033 2019-10-16 20:50关注
代码和运行结果已给出,请采纳
我的博客内有一篇关于遗传算法的粗略解释,有兴趣也可以看一下。https://blog.csdn.net/soar3033/article/details/101682243import random source=[[0,0,0,0,0,0,1,0], [1,1,0,1,0,1,1,1], [0,0,0,1,0,0,1,0], [1,0,0,0,0,0,1,1], [1,1,0,1,0,1,1,1], [1,1,0,1,0,0,1,1], [1,0,1,0,1,1,1,0], [0,0,0,0,0,0,0,0]] #基因源 fathers=[] #父代list childs=[] #子代list values=[] #评分list l=[] #去重list flag=False #出现符合基因配合 def makeFathers(): for i in range(10): #随机生成10个父代 fathers.append([random.randint(0,7),random.randint(0,7),random.randint(0,7)]) #随机生成父代的基因号 def change(father): #对父代进行变异 for i in range(1): #每个父代产生1个子代 child=father.copy() #子代复制父代基因 for i in range(3): #遍历父代的三个基因组 if(random.randint(0,10)>7): #每个基因组30%的概率变异 child[i]=random.randint(0,7) #变异为基因源内的某个基因组 print("子代三个基因分别为第%d,%d,%d号基因" %(child[0],child[1],child[2])) childs.append(child) #向子代list添加子代 def calculate(child): #评判函数 global flag value=0 #初始评分 for i in range(8): #对父代目标的各个基因位进行遍历 if(not(source[child[0]][i]==1 or source[child[1]][i]==1 or source[child[2]][i]==1)): #如果某个基因位三个基因组都不为1,则评分+1 value+=1 if value==0: #评分为零说明基因符合要求 flag=True flag_again=False for i in child: #去重判断 if i in l: flag_again=True if not flag_again: #不重复则输出 child.sort() #排序 方便下一步判断 for i in range(2): if child[2-i]==child[1-i]: #如果后续基因和前面一样 则舍弃后续。例如【1,1,3】 变为【1,3】 del(child[2-i]) if len(child)==3: print("出现符合基因,基因为%d,%d,%d号基因" % (child[0],child[1],child[2])) if len(child)==2: print("出现符合基因,基因为%d,%d号基因" % (child[0],child[1])) for i in child: #将基因添加到去重列表 l.append(i) return value def make(): #交配 tmp=[] for i in range(len(fathers)-1): for j in range(len(fathers)-1-i): #将两两father的基因重组 tmp.append([fathers[i][0],fathers[i][1],fathers[j][2]]) return tmp makeFathers() #生成父代 while 1: #开始进化循环 childs=[] #清空上一代子代 fathers=make() #交配产生子代,并放入fathers暂存 for i in fathers: #遍历父代 change(i) #基因编号变异 values=[] #清空上一次的评分 for i in childs: values.append(calculate(i)) if flag: #如果发现符合的变异则停止进化 break values_copy=values.copy() #复制评分 values_copy.sort() #排序评分 value=values_copy[9] #取第十名的评分 fathers=[] #清空上一代父代 for i in range(len(childs)): if values[i]<=value: fathers.append(childs[i]) #如果子代的评分小于第十位评分则作为新父代 if len(fathers)==10: #如果已有10个新父代,跳出 break
运行结果
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报