news 2026/9/2 21:59:36

NSGA2遗传算法实现多目标优化及三维视图绘制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NSGA2遗传算法实现多目标优化及三维视图绘制

NSGA2遗传算法多目标优化 三维视图 寻优多个函数(函数类型见图二类型),出图为三维红色为帕列托(图一), 带最终结果图(图三)

最近在研究多目标优化问题,发现NSGA2遗传算法是个非常强大的工具,今天就来跟大家分享一下如何用NSGA2遗传算法实现对多个函数的寻优,并绘制出炫酷的三维帕累托图。

NSGA2遗传算法简介

NSGA2(Non - dominated Sorting Genetic Algorithm II)是一种高效的多目标遗传算法。它通过非支配排序和拥挤度计算,能够快速地找到一组帕累托最优解。简单来说,非支配排序就是将种群中的个体按照它们之间的支配关系进行分层,而拥挤度则用于保持种群的多样性,避免算法过早收敛。

寻优多个函数

我们要寻优的函数类型参考图二(这里假设函数形式为$f1(x,y,z)$,$f2(x,y,z)$,$f_3(x,y,z)$,具体函数形式需根据实际图二确定)。在Python中,我们可以这样定义函数(示例函数,仅为演示结构):

import numpy as np def f1(x, y, z): return x ** 2 + y ** 2 + z ** 2 def f2(x, y, z): return np.sin(x) + np.cos(y) + np.tan(z) def f3(x, y, z): return np.exp(-x) + np.exp(-y) + np.exp(-z)

NSGA2算法实现

这里我们借助pymoo库来实现NSGA2算法,pymoo库提供了丰富的多目标优化算法实现,使用起来非常方便。

from pymoo.algorithms.moo.nsga2 import NSGA2 from pymoo.factory import get_problem from pymoo.optimize import minimize from pymoo.util.plotting import plot class MyProblem(get_problem("Elementwise")): def __init__(self): super().__init__(n_var=3, n_obj=3, n_constr=0, xl=-5, xu=5) def _evaluate(self, x, out, *args, **kwargs): out["F"] = np.column_stack([f1(x[:, 0], x[:, 1], x[:, 2]), f2(x[:, 0], x[:, 1], x[:, 2]), f3(x[:, 0], x[:, 1], x[:, 2])]) algorithm = NSGA2(pop_size=100) problem = MyProblem() res = minimize(problem, algorithm, ('n_gen', 200), seed=1, save_history=True, verbose=True)

在上述代码中,我们首先定义了一个自定义问题MyProblem,它继承自pymoo库的Elementwise问题类。在_evaluate方法中,我们计算每个个体对应的多个目标函数值。然后,我们选择NSGA2算法,并设置种群大小为100,进化代数为200,对问题进行求解。

绘制三维帕累托图

得到最优解后,我们就可以绘制三维帕累托图了。同样使用pymoo库的绘图功能:

import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.add_subplot(111, projection='3d') F = res.F ax.scatter(F[:, 0], F[:, 1], F[:, 2], c='r') ax.set_xlabel('Objective 1') ax.set_ylabel('Objective 2') ax.set_zlabel('Objective 3') plt.show()

上述代码创建了一个三维坐标轴,并将NSGA2算法得到的帕累托最优解以红色散点的形式绘制在三维空间中。这样我们就得到了图一所示的三维红色帕累托图。

最终结果图(图三)

最终结果图(图三)通常会展示算法在进化过程中的一些关键指标,比如每一代的最优解分布情况,或者收敛情况等。我们可以通过保存每一代的最优解,并绘制相关曲线来展示。

history = res.history gen = [] obj1_best = [] obj2_best = [] obj3_best = [] for algo in history: gen.append(algo.n_gen) F = algo.pop.get("F") best_index = np.argmin(F[:, 0]) obj1_best.append(F[best_index, 0]) obj2_best.append(F[best_index, 1]) obj3_best.append(F[best_index, 2]) fig, axs = plt.subplots(3, 1, figsize=(8, 10)) axs[0].plot(gen, obj1_best) axs[0].set_ylabel('Best Obj1') axs[1].plot(gen, obj2_best) axs[1].set_ylabel('Best Obj2') axs[2].plot(gen, obj3_best) axs[2].set_ylabel('Best Obj3') axs[2].set_xlabel('Generation') plt.show()

这段代码遍历算法进化历史,记录每一代的最优目标函数值,并绘制出三个目标函数最优值随代数变化的曲线,这就可以作为最终结果图(图三),直观地展示算法的收敛过程。

通过以上步骤,我们就利用NSGA2遗传算法完成了多目标优化,并绘制出了三维帕累托图和最终结果图,希望对大家在多目标优化问题的研究上有所帮助!

以上代码和分析基于示例假设,实际应用中需根据图二真实函数形式进行调整。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 22:31:01

Java毕设选题推荐:基于Java的在线学生心理健康测试教育系统的设计与实现基于springboot高校心理健康评测与服务系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/9/2 6:24:22

豆包手机助手技术预览版发布,AI直接嵌入操作系统底层有何意义?会对行业产生什么影响?

2025年12月1日,豆包手机助手技术预览版的发布成为了业界的焦点。此次发布的亮点之一在于AI助手直接嵌入操作系统底层,这标志着豆包手机不再仅仅是依赖独立的应用程序来实现智能功能,而是通过将AI助手与手机操作系统深度整合,提供更…

作者头像 李华
网站建设 2026/9/2 3:52:11

基于STM32的点滴输液报警器(有完整资料)

资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T4352309M设计简介:本设计是基于STM32的点滴输液报警器设计,主要实现以下功能:1、液晶屏实时显示设置滴速、当前滴速、剩…

作者头像 李华
网站建设 2026/9/2 5:58:01

基于单片机的智能语音点名系统(有完整资料)

资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T4392310M设计简介:本设计是基于单片机的智能语音点名系统,主要实现以下功能:通过语音模块实现上电语音播报欢迎使用点名…

作者头像 李华
网站建设 2026/9/2 9:39:13

【沈阳航空航天大学】C++Qt小型宿舍管理软件[2025-12-15]

【沈阳航空航天大学】CQt小型宿舍管理软件[2025-12-15] 课程设计任务书 课程设计名称程序设计综合实践专业软件工程学生姓名班级软件2401题目名称宿舍管理软件起止日期2025 年 12 月 15 日起至 2025 年 12 月 26 日止 课设内容和要求: 学校宿舍中的学生经常会有变…

作者头像 李华