2017-11-17 4 views
-1
population=[[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [4], [0]], 
[[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [3], [1]], 
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [4], [2]], 
[[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [1], [3]]]  

selected_chromosomes=[[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [5], [2]], 
[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [3], [0]]] 

child1=[0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0] 
child2=[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1] 



def PopulationAdjustment(population, selected_chromosomes): 
    for game in range(0, len(selected_chromosomes)): 
     if game in selected_chromosomes[game][2]==game in population[game][2]: 
      population.remove(game) 
    return population 

ここでの目的は、母集団(リスト)内の子供の親を置き換えることです。両親は同じカウンターに基づいて子供を追加します。リストの構造は[[chromosome],[fitness],[counter]]ですが、0確率を避けるために選択中のフィットネスを操作して以来、まったく同じではありません。複数のレベルのリスト内の項目のうち、いずれかのパラメータに基づいて項目を削除(または置換)

同じカウンタを持つアイテムをインデックスに登録してリストから削除しようとしていますが、次のステップはちょうどappendになります。

私はいくつかの異なる方法を試みてきましたが、私はそれを正しく動作させることができませんでした。それを修正する方法についての考えはありますか?また、2つのステップ(削除と追加)を実行することなく子供たちが直接交換する方法がある場合、それも非常に歓迎されます。ありがとう!!

+5

いくつかのアドバイス:理解しやすくするためにこれらのリストを短くしてください(手動で計算しようとしている出力を表示してください) –

+1

参考までに、 'population '。 – timgeb

+1

@timgeb、私の間違い、その固定 – vferraz

答えて

1

あなたは「同じカウンタを持つアイテムをインデックスに登録し、リストから削除しようとしています」と言っています。それは可能ですが、​​が巨大でない限り、保存したい染色体を含む新しいリストを作成するほうが簡単です(そして速い)。

最初にselected_chromosomesをスキャンして、カウンターナンバーを1つのセットに抽出し、すばやく検索することができます。​​リスト巨大である、またはあなたが元のリストを維持するために他のいくつかの理由がある場合

population=[ 
    [[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [4], [0]], 
    [[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [3], [1]], 
    [[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [4], [2]], 
    [[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [1], [3]], 
] 

selected_chromosomes=[ 
    [[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [5], [2]], 
    [[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [3], [0]], 
] 

def population_adjustment(population, selected_chromosomes): 
    # Create a set of the counter numbers to remove 
    drop = {u[-1][0] for u in selected_chromosomes} 

    # Copy the wanted chromosomes to a new list 
    return [u for u in population if u[-1][0] not in drop] 

new_pop = population_adjustment(population, selected_chromosomes) 
for row in new_pop: 
    print(row) 

出力

[[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [3], [1]] 
[[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [1], [3]] 

(例えば、これまで複数の参照でもありますさまざまな場所)、不要なリストを削除する方法は次のとおりです。しかし、我々は注意する必要があります。反復処理中のリストから項目を削除すると、残りのリスト項目のインデックスが取り除かれるため、hereのように危険です。あなたが座っている木の枝を切り取ったような感じです。あなたが間違った場所でカットすると、悪いことが起こります。 ;)最も簡単な方法は、リストを逆に反復することです。

population=[ 
    [[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [4], [0]], 
    [[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [3], [1]], 
    [[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [4], [2]], 
    [[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [1], [3]], 
] 

selected_chromosomes=[ 
    [[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [5], [2]], 
    [[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [3], [0]], 
] 

def population_adjustment(population, selected_chromosomes): 
    # Create a set of the counter numbers to remove 
    drop = {u[-1][0] for u in selected_chromosomes} 

    # Iterate backwards over population so we can safely delete sublists 
    for i in range(len(population)-1, -1, -1): 
     k = population[i][-1][0] 
     if k in drop: 
      del population[i] 

    # Since we mutate `population` we should return `None`, as is conventional in Python. 
    # This return statement isn't necessary, since `None` is the default return value, 
    # but it's nice to be explicit 
    return None 

population_adjustment(population, selected_chromosomes) 
for row in population: 
    print(row) 

このコードは以前のバージョンと同じ出力を生成するので、私はそれを繰り返さないでください。

+0

ねえ、私はこれを試してみましょう!私は144の染色体を持っていますが、選ばれた数と削除される数は常に2になります。これは多くの反復でこれを実行できるはずです – vferraz

+0

@vferraz 144はかなり小さいですが、何千もの染色体であった。しかし、私はリストを再構築する代わりに削除を使用する新しいバージョンを追加しました。 –

+0

私はちょうどそれらの両方を試みた、そして両方とも上であるようである!私は "n"反復のためにそれを実行しているのでアイテムを削除することは問題ではないと思います。新しい反復を開始するたびに、すでに記録されている初期値であるP(0)とP(N)私は現在の個人に新しいフィットネスとカウンターを追加し、プロセスの間の人口は有用ではありません。どうもありがとうございました!!私は本当にプログラマーではないし、Idはこのようなことに決して考えなかった! – vferraz

関連する問題