交差は以前も作ったのですが、今回のコードには使いづらかったので、作りなおしました。
交差の方法は、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 件のコメント:
コメントを投稿