pop()和attr()的用法和区别

 暂留

转载于:https://www.cnblogs.com/kivenlv/p/5761109.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于加工机器和加工时间编码的具体问题没有给出,因此我将用一个简单的示例来说明如何使用 NSGA-II 对一个多目标优化问题进行求解。这个问题是一个标准的测试问题,称为 ZDT1 问题,其目标是在满足一定约束条件下,最小化两个目标函数的值。 首先,需要定义问题的目标函数和约束条件。这里使用一个 Python 类来表示问题: ```python import numpy as np class ZDT1Problem: def __init__(self, n_vars=30): self.n_vars = n_vars self.bounds = [(0, 1) for _ in range(n_vars)] self.n_objs = 2 def evaluate(self, X): F1 = X[:, 0] g = 1 + 9 * np.sum(X[:, 1:], axis=1) / (self.n_vars - 1) F2 = g * (1 - np.sqrt(F1 / g)) return F1[:, None], F2[:, None] ``` 其中,`n_vars` 表示决策变量的个数,`bounds` 表示每个决策变量的取值范围,`n_objs` 表示目标函数的个数,`evaluate` 方法接受一个 $n \times d$ 的决策变量矩阵 $X$,返回一个 $n \times m$ 的目标函数值矩阵 $F$,其中 $n$ 表示个体数,$d$ 表示决策变量的个数,$m$ 表示目标函数的个数。 接下来,需要编写 NSGA-II 算法的代码。这里使用了 DEAP 库,它是一个常用的遗传算法框架,可以方便地实现各种遗传算法。 ```python import random from deap import algorithms, base, creator, tools # 定义问题和算法参数 problem = ZDT1Problem() n_pop = 100 n_gen = 100 cxpb = 0.9 mutpb = 0.1 eta = 20 indpb = 1.0 / problem.n_vars # 定义种群和个体类型 creator.create("Fitness", base.Fitness, weights=(-1.0, -1.0)) creator.create("Individual", list, fitness=creator.Fitness) # 定义工具箱 toolbox = base.Toolbox() toolbox.register("attr_float", random.uniform, 0, 1) toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, problem.n_vars) toolbox.register("population", tools.initRepeat, list, toolbox.individual) toolbox.register("evaluate", problem.evaluate) toolbox.register("mate", tools.cxSimulatedBinaryBounded, eta=eta, low=0, up=1) toolbox.register("mutate", tools.mutPolynomialBounded, eta=eta, low=0, up=1, indpb=indpb) toolbox.register("select", tools.selNSGA2) # 运行算法 pop = toolbox.population(n=n_pop) algorithms.eaMuPlusLambda(pop, toolbox, n_pop, n_pop, cxpb, mutpb, n_gen, verbose=False) # 输出 Pareto 最优解 fronts = tools.sortNondominated(pop, len(pop)) for i, front in enumerate(fronts): print(f"Front {i+1}:") for ind in front: print(f"\tFitness: {ind.fitness.values}, Variables: {ind}") ``` 在以上代码中,我们首先定义了问题和算法参数,然后使用 DEAP 库定义了种群和个体类型,以及各种遗传算法的操作。最后,使用 `algorithms.eaMuPlusLambda` 方法运行 NSGA-II 算法,得到 Pareto 最优解集,并输出每个解的目标函数值和决策变量。这里使用了 `tools.sortNondominated` 方法将所有个体按照非支配排序,并将它们分成若干个 Pareto 前沿。 完整代码如下: ```python import numpy as np import random from deap import algorithms, base, creator, tools class ZDT1Problem: def __init__(self, n_vars=30): self.n_vars = n_vars self.bounds = [(0, 1) for _ in range(n_vars)] self.n_objs = 2 def evaluate(self, X): F1 = X[:, 0] g = 1 + 9 * np.sum(X[:, 1:], axis=1) / (self.n_vars - 1) F2 = g * (1 - np.sqrt(F1 / g)) return F1[:, None], F2[:, None] problem = ZDT1Problem() n_pop = 100 n_gen = 100 cxpb = 0.9 mutpb = 0.1 eta = 20 indpb = 1.0 / problem.n_vars creator.create("Fitness", base.Fitness, weights=(-1.0, -1.0)) creator.create("Individual", list, fitness=creator.Fitness) toolbox = base.Toolbox() toolbox.register("attr_float", random.uniform, 0, 1) toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, problem.n_vars) toolbox.register("population", tools.initRepeat, list, toolbox.individual) toolbox.register("evaluate", problem.evaluate) toolbox.register("mate", tools.cxSimulatedBinaryBounded, eta=eta, low=0, up=1) toolbox.register("mutate", tools.mutPolynomialBounded, eta=eta, low=0, up=1, indpb=indpb) toolbox.register("select", tools.selNSGA2) pop = toolbox.population(n=n_pop) algorithms.eaMuPlusLambda(pop, toolbox, n_pop, n_pop, cxpb, mutpb, n_gen, verbose=False) fronts = tools.sortNondominated(pop, len(pop)) for i, front in enumerate(fronts): print(f"Front {i+1}:") for ind in front: print(f"\tFitness: {ind.fitness.values}, Variables: {ind}") ``` 需要注意的是,以上代码只是一个简单的示例,实际应用中需要根据具体问题进行修改。特别是在定义问题的时候,需要根据实际情况编写目标函数和约束条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值