交差は以前も作ったのですが、今回のコードには使いづらかったので、作りなおしました。
交差の方法は、1点交差、2点交差、一様交差などがあるのですが、今回この中で、2点交差を使います。
また、一個体の中に遺伝子が2つあるので、これを交換し、子孫を作るようなプログラムも入れていこうと思います。
import random
def main():
popGrope =[[[-1, 1, -1, -1, 1, -1, -1, 1, -1, 1], [1, -1, -1, 1, 1, -1, 1, 1, 1, 1]], [[1, 1, 1, 1, 1, -1, -1, 1, 1, 1], [1, 1, -1, 1, 1, 1, 1, 1, -1, -1]], [[1, 1, 1, -1, -1, -1, -1, -1, 1, 1], [-1, 1, 1, 1, -1, 1, -1, -1, 1, 1]], [[-1, 1, 1, 1, -1, -1, 1, 1, -1, -1], [-1, -1, -1, 1, 1, -1, 1, -1, -1, -1]], [[-1, -1, 1, -1, 1, -1, 1, 1, -1, 1], [1, 1, -1, -1, 1, 1, -1, 1, -1, -1]], [[-1, 1, -1, -1, 1, 1, 1, 1, 1, 1], [-1, 1, -1, 1, -1, 1, 1, 1, -1, 1]], [[1, 1, 1, 1, 1, 1, -1, 1, -1, -1], [1, -1, 1, 1, -1, 1, -1, -1, -1, -1]], [[1, -1, -1, -1, 1, -1, -1, -1, 1, -1], [1, -1, -1, 1, -1, -1, 1, -1, 1, 1]], [[-1, 1, 1, 1, -1, 1, -1, -1, 1, 1], [1, -1, -1, -1, -1, 1, -1, 1, 1, 1]], [[1, -1, 1, -1, -1, -1, 1, -1, -1, 1], [-1, -1, 1, 1, 1, 1, 1, -1, -1, 1]]]
popnum = 10
uri = 0
kai = 1
kidPop =[uri,kai]
#2点交差
def twoPointCrossover(ma,fa):
i, j = sorted(random.SystemRandom().sample(range(popnum),2))
return random.SystemRandom().choice((ma[0:i] + fa[i:j] + ma[j:] , fa[0:i] + ma[i:j] + fa[j:]))
crossover = twoPointCrossover
#交差
#個体群から2匹抜き取る
while 1:
matherPop = random.SystemRandom().randint(0,len(popGrope)-1)
fatherPop = random.SystemRandom().randint(0,len(popGrope)-1)
print matherPop,fatherPop
if matherPop != fatherPop:
break
#子供
selectCrossOver = random.SystemRandom().randint(0,1)
if selectCrossOver == 0:
#父母から1つずつ
while 1:
maOrFaUri = random.choice([matherPop,fatherPop])
maOrFaKai = random.choice([matherPop,fatherPop])
if maOrFaUri != maOrFaKai:
break
print maOrFaUri,maOrFaKai
kidPop[uri] = popGrope[maOrFaUri][uri]
kidPop[kai] = popGrope[maOrFaKai][kai]
print popGrope[maOrFaUri]
print popGrope[maOrFaKai]
print kidPop
if selectCrossOver == 1:
#1つずつもらって交差あり
kidPop[uri] = crossover(popGrope[matherPop][uri],popGrope[fatherPop][uri])
kidPop[kai] = crossover(popGrope[matherPop][kai],popGrope[fatherPop][kai])
print kidPop
popGrope.append(kidPop)
if __name__ == '__main__':
main()
2パターンの交差を使えるようにしました。
これまでで遺伝的アルゴリズムの作成工程のうち、
初期化、評価、淘汰、突然変異、交差のすべてを作成できました。
次回にはすべてを組み込んだコードを作成したいと思います。
0 件のコメント:
コメントを投稿