2017-08-22 16 views
4

私は、遺伝的アルゴリズムに取り組んでいます、と私は動作するコードを発見し、そして今私は理解しようとしていますが、私はこのreturn文を見た:この返信文は何を意味しますか? Pythonの

return sum(1 for expected, actual in zip(target, guess) 
    if expected == actual) 

それは何をしますか?ここで

は完全なコードです:

main.py:

from population import * 

while True: 
    child = mutate(bestParent) 
    childFitness = get_fitness(child) 
    if bestFitness >= childFitness: 
     continue 
    print(child) 
    if childFitness >= len(bestParent): 
     break 
    bestFitness = childFitness 
    bestParent = child 

population.py:

import random 

geneSet = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!.,[email protected]#$%^&*():'[]\"" 
target = input() 

def generate_parent(length): 
    genes = [] 
    while len(genes) < length: 
     sampleSize = min(length - len(genes), len(geneSet)) 
     genes.extend(random.sample(geneSet, sampleSize)) 
    parent = "" 
    for i in genes: 
     parent += i 
    return parent 

def get_fitness(guess): 
    return sum(1 for expected, actual in zip(target, guess) 
     if expected == actual) 

def mutate(parent): 
    index = random.randrange(0, len(parent)) 
    childGenes = list(parent) 
    newGene, alternate = random.sample(geneSet, 2) 
    childGenes[index] = alternate \ 
     if newGene == childGenes[index] \ 
     else newGene 

    child = "" 
    for i in childGenes: 
     child += i 

    return child 

def display(guess): 
    timeDiff = datetime.datetime.now() - startTime 
    fitness = get_fitness(guess) 
    print(str(guess) + "\t" + str(fitness) + "\t" + str(timeDiff)) 

random.seed() 
bestParent = generate_parent(len(target)) 
bestFitness = get_fitness(bestParent) 
print(bestParent) 

これは作業遺伝的アルゴリズムの完全なコードです。私はそれを私のためにより読みやすくするためにいくつかの部分を修正しました。

return文は、get_fitness関数のpopulation.pyファイルにあります。

+3

[「リストの理解」とはどういう意味ですか?どのように動作し、どのように使用できますか?](https://stackoverflow.com/q/34835951/2301450) – vaultah

+0

これはリストの理解と呼ばれています。それはあなたがもっとコードを投稿した場合に役立つでしょう –

+0

@vaultahそれは_generator式です。リストの理解ではありません。それにもかかわらず、あなたが提供したリンクは一般的には理解のための説明を提供するので、重複して閉じるよう投票します。 –

答えて

4

のはそれを打破してみましょう:

zip([1, 2, 3], ['a', 'b', 'c']) 

total = 0 
for i in range(len(target)): 
    if target[i] == guess[i]: 
     total = total + 1 
return total 

zip(a, b)は次のように、abからのアイテムのペアのリストを作る:

return sum(1 for expected, actual in zip(target, guess) 
    if expected == actual) 

は次のように書くことができます

yield s [(1, 'a'), (2, 'b'), (3, 'c')]。したがって、zip(target, guess)式は、最初の項目のリストをtargetから返します。最初の項目はguess、次に2番目の項目はtarget、次の項目はguessなどのようになります。

for expected, actual in zip()ビットzip()の出力からの値のペアをアンパックので(targetからの)ペアの最初の変数expectedとなり、(guessからの)対の第二の変数に進みますactual

​​ビットは、expectedの値がactualの値と等しい場合に「zip()からすべてのアイテムのための1の値を発する言う。

sum()

forループから1値の数を加算する。

タダ今、あなたは、期待値と実際の値が同じである項目の数を持って、それをこのように書くための理由がいくつかあります:。

  1. とても簡潔ですが表現力があります。 Pythonをたくさん書く人は、それを見て理解することができます。
  2. Pythonインタプリタがループや条件文などを処理しているため、潜在的に非常に高速であり、Pythonインタプリタの改良により、プログラム全体を理解することなくコードを高速化できる可能性があります。基本的には、「このことをやるための100の小さなステップ」ではなく、「このことをやりたい」とPythonに伝えています。
+0

ありがとうございます。私は今理解する。それは私が必要としていたようなexaclyだった。もう一度ありがとうございます –

+0

私は手伝ってうれしい! –

1

実際に予想される一致の合計数を返します。基本的には、アルゴリズムモデルが正しく予測できた回数を確認していると思います。

+0

はい、それは返すものですが、これらは何ですか?私は構文を理解していません。 –

+0

構文が何をしているのか分かりません。知りたいことを理解しようとしています –

1

zip()の機能を利用するタイプはList Comprehensionです。

基本的には、コードが言っている:

  • は、リストを作成します。
  • 変数「expected」と「actual」をzip(target、guess)から取得します。等しい場合は、リストに1を追加します。
  • zip(target、guess)から次の値について繰り返します。
  • すべて1を足してください。
  • この合計を返します。
1

起こっていくつかのものがあります。

return sum(...) 

これはあなたが数を戻ってきていることを意味します。

sumの内部は、暗黙ループを作成して実行するgenerator expressionです。

この場合、1 for expected, actual in zip(target, guess) if expected == actualは、1という値のシーケンスを作成し、ガード条件が真(expected == actual)になるたびに1つのエントリが作成されます。

だから、この行が効果的のようなコードを作成している:ジェネレータ式の中でsum(1, 1, 1, 1, ...)

を、あなたはzip電話を持っています。 zip式は2つ(またはそれ以上)のシーケンスをとり、2つ(またはそれ以上)のタプルを持つ単一のシーケンスに変換します。つまり、zip(['a', 'b', 'c'], [1, 2, 3])は、出力として[('a', 1), ('b', 2), ('c', 3)]のようなシーケンスを生成します。

expected = [1, 2, 3] 
actual = [1, 1, 3] 
zip(expected, actual) # [(1, 1), (2, 1), (3, 3)] 

ジェネレータ式は一度複数を割り当てるために、「タプルは開梱」と呼ばれていたものを使用していますforが含まれています:あなたのexpected[1, 2, 3]であり、あなたのactual[1, 1, 3]ある場合

だから、あなたはジッパーは次のようになりますでしょう単一の集約(タプル)値からのそのtarget_listのターゲット。

したがって、ジップ式が(1, 1)を生成する場合、for expected, actualexpected=1, actual=1にアンパックします。

したがって、zipは2つの等しい長さのシーケンスをとり、a [0]とb [0]、a [1]とb [1]などをペアにします。forジェネレータ式は、 expectedactualと呼ばれる変数。 for...ifジェネレータ条件部はexpected == actualの値を比較し、値を生成するか、値を生成しません。したがって、結果のシーケンスの長さは入力シーケンスの長さ以下であることが保証されますが、どれくらい長くなるかはわかりません。の表現は、単純に1です。したがって、1の可変長シーケンスがあります。それはではない 1または0です。それは1またはno-entryです。すべての1を加えて、それが結果です。

関連する問題