JoshWindsor 发表于 2022-11-20 12:43

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

最优化算法不仅在机器学习目标函数优化方面有着举足轻重的地位,而且在运筹学、管理学领域也有着广泛的应用,本文笔者就带领着大家介绍一下并给出一个实列。
最优化算法,大家最熟悉的就是在学校学习的一些数学解法,当函数过于复杂时,数学解法不能给出最优解,甚至无法给出解时,就发展出了启发式算法,在启发式算法中,又有分为很多类别,最常见的应该就是遗传算法了。
现实中目标函数常常不是单个,而是多个的(如下图),此时数学解法效果就不太好了。此时,启发式算法就可以派上用场,而且针对多目标问题,遗传算法NSGA-II (Non-dominated Sorting Genetic Algorithm II)就可以很好的解决这个问题。


那么我们如何编程解决这个问题呢?
1. 首先我们引入包 pymoo
2. 定义目标函数
3. 定义遗传算法NSGA-II 参数
4. 解决并输出结果
1. Pip install pymoo

2. 定义目标函数
1.        import numpy as np
2.        from pymoo.core.problem import ElementwiseProblem
3.       
4.        class MyProblem(ElementwiseProblem):
5.       
6.          def __init__(self):
7.                super().__init__(n_var=2,
8.                               n_obj=2,
9.                               n_ieq_constr=2,
10.                               xl=np.array([-2,-2]),
11.                               xu=np.array())
12.       
13.          def _evaluate(self, x, out, *args, **kwargs):
14.                f1 = 100 * (x**2 + x**2)
15.                f2 = (x-1)**2 + x**2
16.       
17.                g1 = 2*(x-0.1) * (x-0.9) / 0.18
18.                g2 = - 20*(x-0.4) * (x-0.6) / 4.8
19.       
20.                out["F"] =
21.                out["G"] =
22.       
23.       
24.        problem = MyProblem()
3. 定义参数
1.        from pymoo.algorithms.moo.nsga2 import NSGA2
2.        from pymoo.operators.crossover.sbx import SBX
3.        from pymoo.operators.mutation.pm import PM
4.        from pymoo.operators.sampling.rnd import FloatRandomSampling
5.       
6.        algorithm = NSGA2(
7.          pop_size=40,
8.          n_offsprings=10,
9.          sampling=FloatRandomSampling(),
10.          crossover=SBX(prob=0.9, eta=15),
11.          mutation=PM(eta=20),
12.          eliminate_duplicates=True
13.        )
14.       
15.        from pymoo.termination import get_termination
16.        termination = get_termination("n_gen", 40)
4.调用并输出结果
1.        from pymoo.optimize import minimize
2.       
3.        res = minimize(problem,
4.                       algorithm,
5.                       termination,
6.                       seed=1,
7.                       save_history=True,
8.                       verbose=True)
9.        X = res.X
10.        F = res.F

1.        import matplotlib.pyplot as plt
2.        plt.figure(figsize=(7, 5))
3.        plt.scatter(F[:, 0], F[:, 1], s=30, facecolors='none', edgecolors='blue')
4.        plt.title("Objective Space")
5.        plt.show()


我们可以看到给出的最优解并不是唯一的,我们可以定义变量X和目标函数F规则来进一步判断最优解。例如我们可以说(F1,F2)越接近于(0,0),解越好。
<hr/>好了,本次的分享就到先到这。关注我,带你走进数据算法的世界。

[*] 微信公众号 数据算法小屋
[*] CSDN https://blog.csdn.net/TommyLi_YanLi
[*] 知乎 https://www.zhihu.com/people/74-25-40-76-26
[*] 作者邮箱:rocklee_lol@hotmail.com
页: [1]
查看完整版本: 最优化问题-遗传算法解决多目标问题python实战