• Deap : 遗传算法算法解决 背包问题


    特殊

    自定义评价函数

    同前

    def evalKnapsack(individual):
        weight = 0.0
        value = 0.0
        for item in individual:
            weight += items[item][0]
            value += items[item][1]
        if len(individual) > MAX_ITEM or weight > MAX_WEIGHT:
            return 10000, 0  # Ensure overweighted bags are dominated
        return weight, value,

    自定义交叉函数

    def cxSet(ind1, ind2):
        """Apply a crossover operation on input sets. The first child is the
        intersection of the two sets, the second child is the difference of the
        two sets.
        """
        temp = set(ind1)  # Used in order to keep type
        ind1 &= ind2  # Intersection (inplace)
        ind2 ^= temp  # Symmetric Difference (inplace)
        return ind1, ind2

    &=,^= python中的位运算符
    建议在新标签页打开图片
    位运算的解释

    自定义变异函

    def mutSet(individual):
        """Mutation that pops or add an element."""
        if random.random() < 0.5:
            if len(individual) > 0:  # We cannot pop from an empty set
                individual.remove(random.choice(sorted(tuple(individual))))
        else:
            individual.add(random.randrange(NBR_ITEMS))
        return individual,

    使用短版本的遗传算法

    def main():
        random.seed(64)
        NGEN = 50
        MU = 50
        LAMBDA = 100
        CXPB = 0.7
        MUTPB = 0.2
    
        pop = toolbox.population(n=MU)
        hof = tools.ParetoFront()
        stats = tools.Statistics(lambda ind: ind.fitness.values)
        stats.register("avg", numpy.mean, axis=0)
        stats.register("std", numpy.std, axis=0)
        stats.register("min", numpy.min, axis=0)
        stats.register("max", numpy.max, axis=0)
    
        algorithms.eaMuPlusLambda(pop, toolbox, MU, LAMBDA, CXPB, MUTPB, NGEN, stats,
                                  halloffame=hof)
    
        return pop, stats, hof

    此处与之前的文章效果类似
    - 粒子群优化算法
    - 短版本可以参考官网介绍

    源代码

    #!usr/bin/env python
    #-*- coding:utf-8 _*-
    """
    @author:fonttian 
    @file: knapsackProblem.py 
    @time: 2017/10/15 
    """
    #    This file is part of DEAP.
    #
    #    DEAP is free software: you can redistribute it and/or modify
    #    it under the terms of the GNU Lesser General Public License as
    #    published by the Free Software Foundation, either version 3 of
    #    the License, or (at your option) any later version.
    #
    #    DEAP is distributed in the hope that it will be useful,
    #    but WITHOUT ANY WARRANTY; without even the implied warranty of
    #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    #    GNU Lesser General Public License for more details.
    #
    #    You should have received a copy of the GNU Lesser General Public
    #    License along with DEAP. If not, see <http://www.gnu.org/licenses/>.
    
    import random
    
    import numpy
    
    from deap import algorithms
    from deap import base
    from deap import creator
    from deap import tools
    
    IND_INIT_SIZE = 5 # 基因编码位数
    MAX_ITEM = 50
    MAX_WEIGHT = 50
    NBR_ITEMS = 20
    
    # To assure reproductibility, the RNG seed is set prior to the items
    # dict initialization. It is also seeded in main().
    random.seed(64)
    
    # Create the item dictionary: item name is an integer, and value is
    # a (weight, value) 2-uple.
    items = {}
    # Create random items and store them in the items' dictionary.
    for i in range(NBR_ITEMS):
        items[i] = (random.randint(1, 10), random.uniform(0, 100))
    
    creator.create("Fitness", base.Fitness, weights=(-1.0, 1.0))
    creator.create("Individual", set, fitness=creator.Fitness)
    
    toolbox = base.Toolbox()
    
    # Attribute generator
    toolbox.register("attr_item", random.randrange, NBR_ITEMS)
    
    # Structure initializers
    toolbox.register("individual", tools.initRepeat, creator.Individual,
                     toolbox.attr_item, IND_INIT_SIZE)
    toolbox.register("population", tools.initRepeat, list, toolbox.individual)
    
    
    def evalKnapsack(individual):
        weight = 0.0
        value = 0.0
        for item in individual:
            weight += items[item][0]
            value += items[item][1]
        if len(individual) > MAX_ITEM or weight > MAX_WEIGHT:
            return 10000, 0  # Ensure overweighted bags are dominated
        return weight, value,
    
    
    def cxSet(ind1, ind2):
        """Apply a crossover operation on input sets. The first child is the
        intersection of the two sets, the second child is the difference of the
        two sets.
        """
        temp = set(ind1)  # Used in order to keep type
        ind1 &= ind2  # Intersection (inplace)
        ind2 ^= temp  # Symmetric Difference (inplace)
        return ind1, ind2
    
    
    def mutSet(individual):
        """Mutation that pops or add an element."""
        if random.random() < 0.5:
            if len(individual) > 0:  # We cannot pop from an empty set
                individual.remove(random.choice(sorted(tuple(individual))))
        else:
            individual.add(random.randrange(NBR_ITEMS))
        return individual,
    
    
    toolbox.register("evaluate", evalKnapsack)
    toolbox.register("mate", cxSet)
    toolbox.register("mutate", mutSet)
    toolbox.register("select", tools.selNSGA2)
    
    
    def main():
        random.seed(64)
        NGEN = 50
        MU = 50
        LAMBDA = 100
        CXPB = 0.7
        MUTPB = 0.2
    
        pop = toolbox.population(n=MU)
        hof = tools.ParetoFront()
        stats = tools.Statistics(lambda ind: ind.fitness.values)
        stats.register("avg", numpy.mean, axis=0)
        stats.register("std", numpy.std, axis=0)
        stats.register("min", numpy.min, axis=0)
        stats.register("max", numpy.max, axis=0)
        algorithms.eaMuPlusLambda(pop, toolbox, MU, LAMBDA, CXPB, MUTPB, NGEN, stats,
                                  halloffame=hof)
    
        return pop, stats, hof
    
    
    if __name__ == "__main__":
        pop, stats, hof = main()
        print("最佳装包为(最佳个体) :",hof[-1])
        print(len(pop))
        print(len(hof))
        print("最佳装包时的重量与价值(最佳适应度) :",evalKnapsack(hof[-1]))
    
  • 相关阅读:
    python流程控制
    数据类型
    python之初接触
    使用 HttpWebRequest 向网站提交数据
    在 ASP.NET MVC4 中使用 NInject
    第一篇 微信商城 开发前的准备工作
    (一)模块基础
    函数之递归、匿名函数及内置方法
    装饰器的使用原理
    mybatis返回list
  • 原文地址:https://www.cnblogs.com/fonttian/p/9162766.html
Copyright © 2020-2023  润新知