比如有以下数组:
[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。
原数组不可变异,只能变异数组标号。
每个新的子代要打印出被组合在一起的是第几个数组。
代码和运行结果已给出,请采纳
我的博客内有一篇关于遗传算法的粗略解释,有兴趣也可以看一下。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
运行结果
和 https://ask.csdn.net/questions/864358 一样的问题,这是之前的程序
# -*- coding: UTF-8 -*-
from itertools import combinations
a1=[ 1,0,0,1,0,0,0,1]
a2=[ 0,0,0,0,1,1,1,1]
a3=[ 0,1,0,1,0,1,0,0]
a4=[ 1,0,1,1,1,1,0,0]
a5=[ 1,1,1,1,1,1,1,0]
a6=[ 0,0,0,0,0,0,0,1]
a=[a1,a2,a3,a4,a5,a6]
al = list(combinations(list(i for i in range(0, 6)),3))
used = []
for i in al:
flag = False
if not(i[0] in used or i[1] in used or i[2] in used):
flag = True
for j in range(7):
if (a[i[0]][j] + a[i[1]][j] + a[i[2]][j] == 0):
flag = False
break
if flag:
used.append(i[0])
used.append(i[1])
used.append(i[2])
print(' '.join(map(str, a[i[0]])) + "; " + ' '.join(map(str, a[i[1]])) + "; " + ' '.join(map(str, a[i[2]])))
你起码给出一个预期的结果,因为你的描述模棱两可。