最优化问题-遗传算法解决多目标问题python实战

最优化算法不仅在机器学习目标函数优化方面有着举足轻重的地位,而且在运筹学、管理学领域也有着广泛的应用,本文笔者就带领着大家介绍一下并给出一个实列。

最优化算法,大家最熟悉的就是在学校学习的一些数学解法,当函数过于复杂时,数学解法不能给出最优解,甚至无法给出解时,就发展出了启发式算法,在启发式算法中,又有分为很多类别,最常见的应该就是遗传算法了。

现实中目标函数常常不是单个,而是多个的(如下图),此时数学解法效果就不太好了。此时,启发式算法就可以派上用场,而且针对多目标问题,遗传算法NSGA-II (Non-dominated Sorting Genetic Algorithm II)就可以很好的解决这个问题。

最优化问题-遗传算法解决多目标问题python实战_第1张图片

那么我们如何通过编程解决上图这个多目标优化的问题呢?

  1. 首先我们引入包 pymoo
  2. 定义目标函数
  3. 定义遗传算法NSGA-II 参数
  4. 解决并输出结果

1. Pip install pymoo

2. 定义目标函数

  1. import numpy as np
    from pymoo.core.problem import ElementwiseProblem
     
    class MyProblem(ElementwiseProblem):
     
        def __init__(self):
            super().__init__(n_var=2,
                             n_obj=2,
                             n_ieq_constr=2,
                             xl=np.array([-2,-2]),
                             xu=np.array([2,2]))
     
        def _evaluate(self, x, out, *args, **kwargs):
            f1 = 100 * (x[0]**2 + x[1]**2)
            f2 = (x[0]-1)**2 + x[1]**2
     
            g1 = 2*(x[0]-0.1) * (x[0]-0.9) / 0.18
            g2 = - 20*(x[0]-0.4) * (x[0]-0.6) / 4.8
     
            out["F"] = [f1, f2]
            out["G"] = [g1, g2]
     
     
    problem = MyProblem()

3. 定义参数

  1. from pymoo.algorithms.moo.nsga2 import NSGA2
    from pymoo.operators.crossover.sbx import SBX
    from pymoo.operators.mutation.pm import PM
    from pymoo.operators.sampling.rnd import FloatRandomSampling
     
    algorithm = NSGA2(
        pop_size=40,
        n_offsprings=10,
        sampling=FloatRandomSampling(),
        crossover=SBX(prob=0.9, eta=15),
        mutation=PM(eta=20),
        eliminate_duplicates=True
    )
    
    from pymoo.termination import get_termination
    termination = get_termination("n_gen", 40)

4.调用并输出结果

  1. from pymoo.optimize import minimize
     
    res = minimize(problem,
                   algorithm,
                   termination,
                   seed=1,
                   save_history=True,
                   verbose=True)
    X = res.X
    F = res.F
    
    
    import matplotlib.pyplot as plt
    plt.figure(figsize=(7, 5))
    plt.scatter(F[:, 0], F[:, 1], s=30, facecolors='none', edgecolors='blue')
    plt.title("Objective Space")
    plt.show()

最优化问题-遗传算法解决多目标问题python实战_第2张图片

我们可以看到给出的最优解并不是唯一的,我们可以定义变量X和目标函数F规则来进一步判断最优解。例如我们可以说(F1,F2)越接近于(0,0),解越好。

好了,本次的分享就到先到这。 关注我,带你走进数据算法的世界。


  • 微信公众号 数据算法小屋

  • CSDN https://blog.csdn.net/TommyLi_YanLi

  • 知乎 https://www.zhihu.com/people/74-25-40-76-26

  • 作者邮箱:[email protected]

你可能感兴趣的:(python,算法)