找回密码
 立即注册
查看: 148|回复: 0

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

[复制链接]
发表于 2022-11-20 12:43 | 显示全部楼层 |阅读模式
最优化算法不仅在机器学习目标函数优化方面有着举足轻重的地位,而且在运筹学、管理学领域也有着广泛的应用,本文笔者就带领着大家介绍一下并给出一个实列。
最优化算法,大家最熟悉的就是在学校学习的一些数学解法,当函数过于复杂时,数学解法不能给出最优解,甚至无法给出解时,就发展出了启发式算法,在启发式算法中,又有分为很多类别,最常见的应该就是遗传算法了。
现实中目标函数常常不是单个,而是多个的(如下图),此时数学解法效果就不太好了。此时,启发式算法就可以派上用场,而且针对多目标问题,遗传算法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([2,2]))
12.         
13.            def _evaluate(self, x, out, *args, **kwargs):
14.                f1 = 100 * (x[0]**2 + x[1]**2)
15.                f2 = (x[0]-1)**2 + x[1]**2
16.         
17.                g1 = 2*(x[0]-0.1) * (x[0]-0.9) / 0.18
18.                g2 = - 20*(x[0]-0.4) * (x[0]-0.6) / 4.8
19.         
20.                out["F"] = [f1, f2]
21.                out["G"] = [g1, g2]
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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-6-27 20:48 , Processed in 0.159785 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表