news 2026/9/8 11:12:16

基于NSGA-II的局部寻优算法探索

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于NSGA-II的局部寻优算法探索

根据NSGA-II改编的局部寻优算法。 加入了ZDT和DTLZ系列测试函数,IGD定值退出也加入到里面了。 下面是ZDT1和DTLZ4函数测试的部分图片。

最近在算法研究的道路上,我对NSGA-II算法进行了一番改造,开发出了一个独具特色的局部寻优算法。今天就来和大家唠唠这其中的门道。

NSGA-II的改编思路

NSGA-II(Non - dominated Sorting Genetic Algorithm II)本身就是多目标优化领域的经典算法,它在处理多目标问题时有着高效的非支配排序和拥挤度计算机制。但在实际应用中,有时候我们希望算法能够更聚焦于局部区域进行精细寻优。所以我在NSGA-II的基础上,对其选择、交叉和变异操作进行了调整。让算法在迭代过程中,以一定概率更关注当前种群中较优解周围的局部区域,而不是像原始算法那样较为均匀地在整个搜索空间中探索。

比如在选择操作上,原始NSGA-II是基于非支配排序和拥挤度选择个体进入下一代。而在我的局部寻优算法中,会额外引入一个局部性判断机制。对于当前种群中的每个个体,计算它与种群中最优个体的某种距离度量(比如欧氏距离),如果距离小于某个阈值,那么这些个体在选择时会有更高的优先级进入下一代,以此来促使算法在最优解附近进行局部探索。

# 简单示例代码,展示局部性判断机制在选择操作中的应用 import numpy as np # 假设种群个体的表示形式为二维数组,每一行代表一个个体,每一列代表一个维度 population = np.array([[1.2, 3.5], [2.1, 4.7], [0.8, 2.9], [1.9, 3.1]]) optimal_individual = np.array([1.0, 3.0]) threshold = 0.5 # 计算每个个体与最优个体的欧氏距离 distances = np.sqrt(np.sum((population - optimal_individual) ** 2, axis = 1)) # 根据距离筛选个体 local_individuals = population[distances < threshold] print(local_individuals)

在这段代码中,我们首先定义了一个简单的种群population,以及假设的最优个体optimalindividual和距离阈值threshold。通过计算每个个体与最优个体的欧氏距离distances,我们筛选出了距离小于阈值的局部个体localindividuals,这部分个体在后续的选择操作中就会有更高的机会进入下一代,实现局部寻优的倾向。

引入ZDT和DTLZ系列测试函数

为了更好地评估这个改编后的局部寻优算法的性能,我加入了ZDT和DTLZ系列测试函数。这些函数在多目标优化领域是非常经典的测试基准。

以ZDT1函数为例,它的定义如下:

\[

\begin{align*}

f1(x) &= x1\\

f2(x) &= g(x) \cdot (1 - \sqrt{\frac{f1(x)}{g(x)}})\\

g(x) &= 1 + 9 \cdot \frac{\sum{i = 2}^{n}xi}{n - 1}

\end{align*}

\]

其中 \(x \in [0, 1]^n\), \(n\) 是决策变量的维度。

下面是用Python实现ZDT1函数的简单代码:

import numpy as np def zdt1(x): n = len(x) f1 = x[0] g = 1 + 9 * np.sum(x[1:]) / (n - 1) f2 = g * (1 - np.sqrt(f1 / g)) return np.array([f1, f2])

这个函数接受一个一维数组x作为输入,代表决策变量的值。通过计算f1f2,返回两个目标函数的值。

DTLZ4函数相对来说稍微复杂一些,它的形式如下(以双目标,三维决策变量为例):

\[

\begin{align*}

f1(x) &= \prod{i = 1}^{m - 1}xi \cdot g(x) \cdot \cos(\frac{x{m - 1}\pi}{2})\\

f2(x) &= g(x) \cdot \sin(\frac{x{m - 1}\pi}{2})\\

g(x) &= 1 + 10(m - 1) + \sum{i = m - 1}^{n}(xi^2 - 10 \cos(4 \pi x_i))

\end{align*}

\]

import numpy as np def dtlz4(x): n = len(x) m = 2 # 目标数 g = 1 + 10 * (m - 1) for i in range(m - 1, n): g += x[i] ** 2 - 10 * np.cos(4 * np.pi * x[i]) f1 = np.prod(x[:m - 1]) * g * np.cos(x[m - 1] * np.pi / 2) f2 = g * np.sin(x[m - 1] * np.pi / 2) return np.array([f1, f2])

通过使用这些测试函数,我们可以直观地观察到算法在不同复杂程度的多目标问题上的表现,比如算法是否能够找到均匀分布且逼近真实Pareto前沿的解集。

IGD定值退出机制

在算法运行过程中,我还加入了IGD(Inverted Generational Distance)定值退出机制。IGD是一种用于衡量多目标优化算法得到的解集与真实Pareto前沿之间距离的指标。简单来说,它计算得到的解集中每个点到真实Pareto前沿的最小距离的平均值。

当算法运行到一定阶段,如果IGD的值小于我们预先设定的某个定值,这意味着算法得到的解集已经足够接近真实Pareto前沿,继续运行下去可能不会带来显著的提升,此时就可以终止算法,节省计算资源。

以下是一个简单的IGD计算的概念性代码(假设已知真实Pareto前沿trueparetofront和算法得到的解集solution_set):

import numpy as np def calculate_igd(solution_set, true_pareto_front): igd_sum = 0 for point in solution_set: min_dist = np.min(np.sqrt(np.sum((true_pareto_front - point) ** 2, axis = 1))) igd_sum += min_dist igd = igd_sum / len(solution_set) return igd # 假设已经有了真实Pareto前沿和算法得到的解集 true_pareto_front = np.array([[0.1, 0.9], [0.2, 0.8], [0.3, 0.7]]) solution_set = np.array([[0.15, 0.85], [0.25, 0.75]]) igd_value = calculate_igd(solution_set, true_pareto_front) print(igd_value)

在实际应用中,我们会在算法的每次迭代后计算IGD值,并与预设的定值进行比较。如果igd_value小于定值,就终止算法。

最后附上ZDT1和DTLZ4函数测试的部分图片(这里由于无法直接展示图片,大家可以想象一下,在ZDT1函数测试图片中,Pareto前沿呈现出一条平滑的曲线,算法得到的解集点在曲线上分布,越靠近真实前沿,说明算法性能越好;而DTLZ4函数测试图片中,由于其函数特性,Pareto前沿可能更为复杂,算法解集点的分布情况则反映了算法在处理复杂多目标问题时的能力)。

通过对NSGA-II的改编,引入经典测试函数以及IGD定值退出机制,这个局部寻优算法在多目标优化问题上展现出了独特的优势和潜力。希望今天的分享能给大家在算法研究和优化方面带来一些启发。

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

JAVA新手必看:找不到符号错误详解

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个交互式学习模块&#xff0c;通过简单示例解释找不到符号错误。包含&#xff1a;1) 变量作用域动画演示 2) 包导入交互练习 3) 常见错误模式匹配游戏。要求使用初学者友好语…

作者头像 李华
网站建设 2026/9/8 14:51:56

Java逆袭机会来啦!AI应用开发再不入行真来不及了!

2025年12月份&#xff0c;脉脉发布了《2025年度人才报告》&#xff0c;小编发现了Java逆袭的时机到了&#xff01;AI应用开发再不入行真的要错过红利期了。 一起来看看&#xff0c;《2025年度人才报告》里透露了哪些信息&#xff01; 1 AI应用加速&#xff1a;技术人才占主导。…

作者头像 李华
网站建设 2026/9/8 16:04:31

教育考试应用:CRNN OCR在答题卡识别

教育考试应用&#xff1a;CRNN OCR在答题卡识别 &#x1f4d6; 项目背景与技术挑战 在教育信息化快速发展的今天&#xff0c;自动化阅卷系统已成为提升考试效率、降低人工成本的关键技术。其中&#xff0c;答题卡识别作为核心环节&#xff0c;面临着诸多现实挑战&#xff1a;学…

作者头像 李华
网站建设 2026/9/8 16:09:03

CRNN OCR在电商行业的应用:商品详情页自动录入系统

CRNN OCR在电商行业的应用&#xff1a;商品详情页自动录入系统 &#x1f4d6; 技术背景与行业痛点 在电商行业中&#xff0c;海量商品信息的录入是一项高频且重复性极高的工作。传统的人工录入方式不仅效率低下&#xff0c;还容易因视觉疲劳或主观判断导致错录、漏录等问题。尤…

作者头像 李华
网站建设 2026/9/8 14:06:29

揭秘Llama Factory高效训练:如何用云端GPU加速你的模型微调

揭秘Llama Factory高效训练&#xff1a;如何用云端GPU加速你的模型微调 作为一名数据科学家&#xff0c;你是否遇到过这样的困境&#xff1a;手头有一个重要的模型微调任务&#xff0c;但本地机器的性能捉襟见肘&#xff0c;显存不足、训练速度慢如蜗牛&#xff1f;别担心&…

作者头像 李华
网站建设 2026/9/8 14:07:29

Llama Factory极简指南:如何在云端快速搭建训练环境

Llama Factory极简指南&#xff1a;如何在云端快速搭建训练环境 如果你是一位时间紧迫的开发者&#xff0c;需要在今天内完成一个模型微调演示&#xff0c;那么这篇指南就是为你准备的。Llama Factory 是一个功能强大的开源框架&#xff0c;它整合了多种高效训练微调技术&#…

作者头像 李华