weixin_39017744 2019-10-16 19:06 采纳率: 83.3%
浏览 404
已采纳

请问如何用python模拟基于遗传算法的回归测试?

比如有以下数组:
[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。
原数组不可变异,只能变异数组标号。
每个新的子代要打印出被组合在一起的是第几个数组。

  • 写回答

2条回答 默认 最新

  • soar3033 2019-10-16 20:50
    关注

    代码和运行结果已给出,请采纳
    我的博客内有一篇关于遗传算法的粗略解释,有兴趣也可以看一下。https://blog.csdn.net/soar3033/article/details/101682243

    import 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
    
    
    
    

    运行结果
    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建