2015年1月28日水曜日

遺伝的アルゴリズムでカブロボ制作⑥ 交差の設計

いよいよ遺伝子を交配し、子孫を作っていく交差のプログラムを書いていきます。
交差は以前も作ったのですが、今回のコードには使いづらかったので、作りなおしました。
交差の方法は、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 件のコメント:

コメントを投稿