• Genetic Algorithms with python 学习笔记ch2


    One Max Problem

    最大化基因中的数字 ’1‘ ,并且genes只能为 0 或 1 。

    1.将基因数据类型改为列表并求解

    利用原来的引擎进行求解,修改后的 guessPasswordTest.py 代码如下:

    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("{}	{}	{}".format(
            ''.join(candidate.Genes), candidate.Fitness, timeDiff))
    
    
    class GuessPasswordTests(unittest.TestCase):
        geneset = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!.,"
    
        def test_onemax(self):
            target = "1" * 100
            self.geneset = "01"
            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)
            best = genetic.get_best(fnGetFitness, len(target), optimalFitness,
                                    self.geneset, fnDisplay)
            self.assertEqual(''.join(best.Genes), target)
    
        def test_benchmark(self):
            genetic.Benchmark.run(self.test_onemax)
    
    
    if __name__ == '__main__':
        unittest.main()
    
    

    同时,genetic.py 内容不变:

    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))
        fitness = get_fitness(genes)
        return Chromosome(genes, fitness)
    
    
    def _mutate(parent, geneSet, get_fitness):
        index = random.randrange(0, len(parent.Genes))
        childGenes = parent.Genes[:]
        newGene, alternate = random.sample(geneSet, 2)
        childGenes[index] = alternate if newGene == childGenes[index] else newGene
        fitness = get_fitness(childGenes)
        return Chromosome(childGenes, 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))
    
    

    2.建立OneMax test class

    oneMaxTest.py的内容为:

    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))
        fitness = get_fitness(genes)
        return Chromosome(genes, fitness)
    
    
    def _mutate(parent, geneSet, get_fitness):
        index = random.randrange(0, len(parent.Genes))
        childGenes = parent.Genes[:]
        newGene, alternate = random.sample(geneSet, 2)
        childGenes[index] = alternate if newGene == childGenes[index] else newGene
        fitness = get_fitness(childGenes)
        return Chromosome(childGenes, 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))
    
    
  • 相关阅读:
    PCB 铺铜 转载
    VC++ 学习笔记3 获取编辑框字符串
    VC++ 学习笔记2 列表框添加字符串
    VC++组合框——学习笔记1(组合框选项的添加和无法显示下拉选项)
    微信蓝牙ble记录
    最近遇到的问题与分析还有可能的结果
    注入与以往的开发思路
    abp的权限与导航菜单的关系
    ionic入坑记记录
    abp相关
  • 原文地址:https://www.cnblogs.com/idella/p/13394248.html
Copyright © 2020-2023  润新知