news 2026/4/16 10:49:11

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/4/14 18:08:16

自动化测试的艺术:Ascend C算子生成测试数据脚本解析与增强

在昇腾AI处理器生态中,测试数据生成脚本是算子开发的质量生命线,本文将从工业级实践角度深度解析其设计哲学与增强策略。 目录 摘要 一、技术原理深度解析 1.1 🏗️ 架构设计理念:两段式测试框架 1.2 🔧 核心算法实…

作者头像 李华
网站建设 2026/4/12 4:27:47

NO16数据结构选择题考点|树

树 结点的度:是指该结点的孩子数量 \begin{aligned} &\textbf{结点的度}:\text{是指该结点的孩子数量} \end{aligned} ​结点的度:是指该结点的孩子数量​路径和路径长度:树中两个结点之间的路径是由这两个结点之间所经过的结…

作者头像 李华
网站建设 2026/4/7 14:36:59

Flutter跨平台开发权威宝典:架构解析与实战进阶

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。 ### Flutter 测试驱动开发与架构模型实践 Flutter跨平台开发权威宝典:架构解析与实战进阶 Flutter 核心特性详解 Flutter 是 Google 推出的开源跨平台 UI 框架,于 201…

作者头像 李华
网站建设 2026/4/13 11:30:02

计算机Java毕设实战-基于springboot非物质文化遗产数字化传承非遗历史管理、非遗传承人管理、演出类型管理、非遗演出管理【完整源码+LW+部署说明+演示视频,全bao一条龙等】

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

作者头像 李华
网站建设 2026/4/7 10:17:24

【JAVA】JVM类加载器知识笔记

JVM类加载器详解 一、类加载器概述 1、什么是类加载器? 类加载器(ClassLoader)是Java虚拟机(JVM)的重要组成部分,它负责将字节码文件(.class文件)加载到内存中,并转换为J…

作者头像 李华
网站建设 2026/4/13 9:08:52

Liquibase动态删除表外键依赖

这是一个用于 Liquibase 的 SQL 脚本,它的核心功能是动态查找并删除指向某个特定表字段的所有外键约束。它通常用在数据库重构中,当你需要删除一个有外键引用的表或字段时,必须先解除这些依赖。 下面我将对脚本进行逐行详解,并举例…

作者头像 李华