###前提・実現したいこと
python3のコードの振る舞いがいまいちわからないです
以下のコードの
best = genetic.get_best(fnGetFitness, len(target), optimalFitness,self.geneset, fnDisplay)
という関数の部分なんですがget_best関数に渡すfnGetFitness,fnDisplayの引数が定義されてないままget_best関数に渡しているように見えます。
実際直前にprintで引数を出力させても
<function GuessPasswordTests.guess_password.<locals>.fnGetFitness at 0x7f8edfe44378>
38
38
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!.,
<function GuessPasswordTests.guess_password.<locals>.fnDisplay at 0x7f8edfe446a8>
5
(5つprintしたのに6つ出力されているのも何故なんでしょうか)
となります。
呼び出されたget_best関数内で引数を出力しても同様<functin 以下略>となります。しかし最終的にはしっかり文字列が出力されています。
unittestだと特別な処理方法をしてコードの実行順番が違うのか わからなくて困っております。
以下の実際のコードの振る舞いを教えていただけますでしょうか。
###実際のコード
import datetime import random import unittest import genetic def get_fitness(guess, target): return sum(1 for expected, actual in zip(target, guess) if expected == actual) def display(candidate, startTime): timeDiff = datetime.datetime.now() - startTime print("{}\t{}\t{}".format( candidate.Genes, candidate.Fitness, timeDiff)) class GuessPasswordTests(unittest.TestCase): geneset = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!.," def test_Hello_World(self): target = "machine learning in genetic algorithm!" self.guess_password(target) def guess_password(self, target): startTime = datetime.datetime.now() def fnGetFitness(genes): return get_fitness(genes, target) def fnDisplay(candidate): display(candidate, startTime) optimalFitness = len(target) # print(fnGetFitness) # print(len(target)) # print(optimalFitness) # print(self.geneset) # print(fnDisplay) best = genetic.get_best(fnGetFitness, len(target), optimalFitness, self.geneset, fnDisplay) self.assertEqual(best.Genes, target) if __name__ == '__main__': unittest.main()
import random import statistics import sys import time def _generate_parent(length, geneSet, get_fitness): genes = [] while len(genes) < length: sampleSize = min(length - len(genes), len(geneSet)) genes.extend(random.sample(geneSet, sampleSize)) genes = ''.join(genes) fitness = get_fitness(genes) return Chromosome(genes, fitness) def _mutate(parent, geneSet, get_fitness): index = random.randrange(0, len(parent.Genes)) childGenes = list(parent.Genes) newGene, alternate = random.sample(geneSet, 2) childGenes[index] = alternate if newGene == childGenes[index] else newGene genes = ''.join(childGenes) fitness = get_fitness(genes) return Chromosome(genes, fitness) def get_best(get_fitness, targetLen, optimalFitness, geneSet, display): random.seed() bestParent = _generate_parent(targetLen, geneSet, get_fitness) display(bestParent) if bestParent.Fitness >= optimalFitness: return bestParent while True: child = _mutate(bestParent, geneSet, get_fitness) if bestParent.Fitness >= child.Fitness: continue display(child) if child.Fitness >= optimalFitness: return child bestParent = child class Chromosome: def __init__(self, genes, fitness): self.Genes = genes self.Fitness = fitness class Benchmark: @staticmethod def run(function): timings = [] stdout = sys.stdout for i in range(100): sys.stdout = None startTime = time.time() function() seconds = time.time() - startTime sys.stdout = stdout timings.append(seconds) mean = statistics.mean(timings) if i < 10 or i % 10 == 9: print("{} {:3.2f} {:3.2f}".format( 1 + i, mean, statistics.stdev(timings, mean) if i > 1 else 0))
###補足情報(言語/FW/ツール等のバージョンなど)
python3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/19 15:59