NSGA2代码分析——rank.c

NSGA-II入门算法分析 NSGA-II入门算法分析 1、什么时NSGA-II? NSGA-II全称是快速非支配排序遗传算法,那什么是多目标中的支配与非支配呢?支配与非支配解集,那么什么叫做支配,什么叫做非支配呢?例如如果汽车A价格30万,外观A等,性能A等;汽车B价格40万,外观A-等,性能A-等,就说汽车A支配了汽车B。如果有一辆汽车C价格20万,外观B等,性能B等,相较于汽车A,虽然C的外观和性能都比汽车A要差,但是其价格上比汽车A要低,从价格这个评价标准上来看,汽车C是要优于汽车A的,所以说汽车C和汽车A是属于一个非支. 阅读详情
    该源文件中就包含一个函数assign_rank_and_crowding_distance (population *new_pop), 主要功能是对种群new_pop里的个体进行Pareto分级排序,同时计算出每个个体的拥挤距离。
    该函数的具体算法流程如下:
1。初始化一个双向链表orig,含有pop_num个节点。每个节点包含三个域:索引、前续节点指针、后续节点指针。每个节点的索引(index)对应着new_pop的第index个个体。
2。从orig中找出所有的非支配个体,并存储在cur链表中。
    (1).取orig中对应的第一个节点,插入到cur链表中。i = 1+1。
    (2).对orig中的第i个节点对应的个体同cur链表中所有节点对应的个体进行Pareto比较,并根据比较结果调整orig和cur链表中的节点。
    (3).如果没有到达orig的最后一个节点,则转入(2)。
3。对cur链表中的个体计算其拥挤距离。(调用assign_crowding_distance_list ()函数,定义在crowdist.c文件中)
4。删除cur链表中所有的节点,即清除当前的所有非支配个体。
5。如果orig还有节点,则转入2。
void assign_rank_and_crowding_distance (population *new_pop)
{
    
int flag;                                //两个个体的Pareto比较结果
    int i;                                    //计数变量
    int end;                                //一轮个体的Pareto级别比较结束标志
    int front_size;                            //记录当前Pareot级别的集合中的个体数目
    int rank=1;                                //记录当前的Pareto级别
    list *orig;                                //记录种群中所有未排序的个体
    list *cur;                                //记录当前个体集中所有非支配个体
    list *temp1, *temp2;                    //临时节点指针,指向当前需要操作的节点
    orig = (list *)malloc(sizeof(list));    //orig链表的头节点
    cur = (list *)malloc(sizeof(list));        //cur链表的头节点
    front_size = 0;
    orig
->index = -1;
    orig
->parent = NULL;
    orig
->child = NULL;
    cur
->index = -1;
    cur
->parent = NULL;
    cur
->child = NULL;
    temp1 
= orig;

    
//初始化orig链表,链表中的节点的index对应于new_pop中的个体下标
    for (i=0; i<popsize; i++)
    {
        insert (temp1,i);
        temp1 
= temp1->child;
    }

    
//对new_pop中的所有个体进行Pareto级别排序
    do
    {
        
//如果orig中未排序的个体只有一个,则把这个个体的拥挤距离设置为INF。
        if (orig->child->child == NULL)
        {
            new_pop
->ind[orig->child->index].rank = rank;
            new_pop
->ind[orig->child->index].crowd_dist = INF;
            
break;
        }
        temp1 
= orig->child;
        insert (cur, temp1
->index);
        front_size 
= 1;
        temp2 
= cur->child;
        temp1 
= del (temp1);
        temp1 
= temp1->child;

        
//以下的do_while对应于步骤2。即找到当前所有未排序个体集合中的非支配个体
        do
        {
            temp2 
= cur->child;
            
do
            {
                end 
= 0;

                
//判断temp2和temp1对应个体的Pareto比较结果,并修改orig和cur链表
                flag = check_dominance (&(new_pop->ind[temp1->index]), &(new_pop->ind[temp2->index]));
                
if (flag == 1)
                {
                    insert (orig, temp2
->index);
                    temp2 
= del (temp2);
                    front_size
--;
                    temp2 
= temp2->child;
                }
                
if (flag == 0)
                {
                    temp2 
= temp2->child;
                }
                
if (flag == -1)
                {
                    end 
= 1;
                }
            }
            
while (end!=1 && temp2!=NULL);
            
if (flag == 0 || flag == 1)
            {
                insert (cur, temp1
->index);
                front_size
++;
                temp1 
= del (temp1);
            }
            temp1 
= temp1->child;
        }
        
while (temp1 != NULL);

        
//对cur链表所有当前的非支配个体的Pareto级别进行赋值
        temp2 = cur->child;
        
do
        {
            new_pop
->ind[temp2->index].rank = rank;
            temp2 
= temp2->child;
        }
        
while (temp2 != NULL);

        
//对当前Pareto级别的所有个体进行拥挤距离计算
        assign_crowding_distance_list (new_pop, cur->child, front_size);
        temp2 
= cur->child;

        
//清除cur链表中的所有当前的非支配个体
        do
        {
            temp2 
= del (temp2);
            temp2 
= temp2->child;
        }
        
while (cur->child !=NULL);
        rank
+=1;
    }
while (orig->child!=NULL);
    free (orig);
    free (cur);
    
return;
}
分子多目标优化:Pareto前沿与NSGA算法在药物设计中的应用 多目标优化是计算机科学和工程领域处理多个相互冲突目标的核心方法,其核心思想是在多个目标间寻找最佳平衡点。Pareto最优原理为解决这类问题提供了理论基础,它通过定义非支配解集来揭示目标间的权衡关系。在药物设计和材料发现等实际应用中,分子优化常面临活性、溶解度、毒性等多个性质间的冲突,传统加权求和法存在主观性强、掩盖权衡关系的局限。NSGA-II和NSGA-III等进化算法通过快速非支配排序和多样性保持机制,能够高效逼近Pareto前沿,为决策者提供清晰的“权衡地图”。这些算法在分子生成与优化场景中,结合SM 阅读详情

相关推荐

优化算法——遗传算法(c++)

遗传算法单目标和多目标解决方法的学习(和ai学习简单的实现过程)。

jokery404的博客 2553

从NSGA到 NSGA II

NSGA(非支配排序遗传算法)、NSGAII(带精英策略的非支配排序的遗传算法),都是基于遗传算法的多目标优化算法,都是基于pareto最优解讨论的多目标优化,遗传算法已经做过笔记,下面介绍pareto(帕累托)最优解的相关概念。本文是基于参考文献做的读书笔记。 1 NSGA算法 1.1 Paerot支配关系   1.2  Pareto最优解定义 多目标优化问题与单目标优化问题有...

weixin_34217711的博客 1710

多目标优化算法 NSGA-II 实战:Python 实现 Pareto 前沿可视化与解集筛选

本文详细介绍了多目标优化算法 NSGA-II 的 Python 实现,包括 Pareto 前沿可视化与解集筛选。通过电动汽车设计案例,展示了如何同时优化续航里程、制造成本和充电时间等相互冲突的目标,帮助读者掌握 NSGA-II 算法的核心原理与实践应用。

weixin_33946020的博客 633

Pareto优化和分层优化的区别?Pareto改进是什么?分层优化的过程可以看成Pareto改进吗?

在这种方法中,目标被分成不同的层次或优先级。首先优化最高优先级的目标,然后在满足这些目标的约束下优化次优先级的目标,依此类推。:目标编程是一种将目标分为主要目标和次要目标的方法。主要目标被优先优化,而次要目标则在主要目标达到一定水平后才被考虑。:Pareto优化不是寻找单一最优解,而是寻找一组解,这些解在所有目标之间没有劣解。这组解反映了目标之间可能的权衡。

Drug discovery 1019

MATLAB实现NSGA-II算法求解柔性作业车间多目标调度问题

多目标优化是运筹学和工业工程领域的核心方法,旨在同时处理多个相互冲突的目标,寻找一组均衡的帕累托最优解。其核心原理在于通过算法(如遗传算法)在解空间中进行高效搜索,利用非支配排序和拥挤度计算来引导种群向高质量且分布广泛的帕累托前沿收敛。该技术的价值在于为复杂的生产与调度决策提供了科学的量化工具,避免了传统单目标优化的片面性。在制造业、物流等实际应用场景中,柔性作业车间调度问题(FJSP)是典型的NP-hard难题,它要求同时优化如最大完工时间和机器总负载等多个目标。本文聚焦于使用MATLAB实现高效的NSG

weixin_33693070的博客 347

多目标优化算法NSGA-II原理详解与Python实现

在工程优化与算法设计中,多目标优化旨在同时权衡多个相互冲突的目标,例如性能、成本与能耗。其核心原理在于寻找帕累托最优解集,而非单一最优解,从而提供一组可供决策的均衡方案。NSGA-II(非支配排序遗传算法II)作为该领域的经典算法,通过快速非支配排序和拥挤度比较机制,高效逼近帕累托前沿,并维持解集的多样性。该算法在参数调优、资源调度和工程设计等场景中具有重要技术价值。本文以Python实现为例,结合ZDT测试函数,深入剖析了NSGA-II的算法流程、代码细节及参数调优技巧,为处理实际多目标决策问题提供了工程

weixin_30932215的博客 420

NSGA-II算法实战(附MATLAB源码)

NSGA-II算法实战(附MATLAB源码)

qq_45013535的博客 2515

NSGA2(MATLAB).zip_NSGA2_MATLAB_matlab nsga2_nsga2_nsga2 matlab_n

利用MATLAB编写的简单的NSGA2程序 ,实用方便

多目标优化遗传算法NSGA-Ⅱ

在接触编程之前,我们可能会在运筹学等相关教材中了解过多目标优化的知识, 其问题结构如下图所示:首先,要注意的是,决策变量要与每一个目标函数有关,假设x1、x2只与f1(x)有关,x3、x4只与f2(x)有关,那么这就不叫多目标优化问题,而应该叫做单目标优化问题。其次,每个目标函数之间要存在矛盾,比如目标函数f1(x)代表一台笔记本的性能和目标函数f2(x)代表一台笔记本的便携性。所谓鱼和熊掌不可兼得,在想要一台性能出色的笔记本必然会损失其便携性。

m0_70173451的博客 2万+

jmeter问题系列:Begin size 0 is not equal to fixed size 5

Begin size 0 is not equal to fixed size 5 ,问题的解决

雨水的早晨的博客 2413

OTA(Over-The-Air)升级

OTA(Over-the-Air)是一种通过无线方式进行数据传输和更新的技术,通常用于电子设备(如智能手机、汽车、物联网设备等)的软件、固件或配置更新。OTA可以在设备与服务器之间进行远程传输,用户无需将设备接入电脑或进行有线操作。通过OTA,用户只需要通过Wi-Fi或移动网络连接,便能自动接收并安装最新的更新,而无需手动干预。OTA的优点是便捷和高效,能够确保设备随时保持最新状态,同时减少用户的操作负担。:如智能家居设备、路由器、汽车等硬件设备的固件更新。:确保设备上的应用保持最新版本。

weixin_50127894的博客 5066

NSGA2算法中文版详细介绍

NSGA2主要是对NSGA算法的改进。NSGA是N. Srinivas 和 K. Deb在1995年发表的一篇名为《Multiobjective function optimization using nondominated sorting genetic algorithms》的论文中提出的。该算法在快速找到Pareto前沿和保持种群多样性方面都有很好的效果,不过在这么多年的应用中也出现了如下的

徐奕的专栏 4万+

实战游戏项目管理1-规划篇

1、前言 做研发管理10多年,进游戏行业8年,经验下来项目管理就是一门技术,结合不同行业不同项目加以不同管理方法,但原理基本一样,这里总结下游戏项目的管理一些实操方法 一般游戏确定立项前都需要做,项目预研产出一个游戏Demo,通过公司的立项评审,这个过程的项目管理相对简单一般由制作人或其他项目经理兼任,只有控制好总体时间与成本就好,这里按立项后开始讲。 2、游戏项目规划 ...

pengdali的专栏 2万+

NSGA2 算法MATLAB完整代码 中文注释详解

2019.7.17 很意外本人这篇文章受到很多人的关注,在此把源码贴出来供大家更好的理解学习。 https://download.csdn.net/download/joekepler/10590751 ========================分割===================================== 本人最近研究NSGA2算法,网上有很多示例代码,但是基本没有...

joe的博客 12万+

海康VisionMaster图形定位实战:十字形Mark点精准匹配技巧

本文深入解析了海康VisionMaster图形定位模块在工业自动化中实现十字形Mark点精准匹配的实战技巧。文章从ROI设置、核心参数调优(如定位方式、尺度模式、对比度阈值)到工业场景应用与避坑指南,系统性地分享了提升匹配成功率和稳定性的关键步骤,帮助工程师应对复杂现场环境,实现高效、可靠的视觉定位。

weixin_29285605的博客 260

LCD驱动芯片——BL55072A驱动程序

初始化子程序: START 0x7C; I2C子地址 0xEA;ICSET,软件复位芯片 0xC0;MODSET,关显示 0xF0;BLKCTL,关闪烁 0xA3;DISCTL,80Hz Line inversion,High Power mode 0xE8;ICSET,清复位bit1 STOP 显示刷新子程序: START 0x7C;I2C子地址 0xF0;BLKCTL,关闪烁 0xA3;DISCTL,80Hz Line inversion,High Power mode 0xE8或0xEC;ICSE

love421的博客 3175

nsga 2学习

nsga2 NSGA2学习 步骤: (1):随机初使化P0,并对P0进行非支配排序,初使化每个个体的RANK值,并对其进行PO值进行非支配排序。 (2):通过二进制锦标赛法从PT中选择个体,并进行交叉和变异操作 (3):...

weixin_30590285的博客 367

海康VisionMaster全局通信实战:从数据接收到流程触发

本文详细解析了海康VisionMaster全局通信的实战应用,重点阐述了如何通过配置通信模块与编写全局脚本,实现从外部设备(如PLC)接收数据并触发内部视觉流程。文章以TCP/IP通信为例,深入讲解了数据接收、解析、全局变量设置及流程触发的核心代码与调试技巧,帮助用户打通自动化项目中的设备联动关键环节。

weixin_29295541的博客 569

运筹说|第152期 多目标优化算法之非支配排序遗传算法-II(NSGA-II)

否则,对每个目标维度,按目标值排序后,将边界个体的距离置为无穷大,以确保它们在选择中被优先保留,维持Pareto前沿的延展性,中间个体累加相邻个体在该维度上的归一化差值,最终返回每个个体的距离值,用于衡量种群多样性。测量仪:距离越大,说明该解周围越稀疏,对种群多样性的贡献就越大,越值得被保留。这张拥挤度比较算子示意图展示了 NSGA-II 算法中个体筛选的核心逻辑,优先保留非支配排序更靠前的解,同排序下则选择拥挤度更高的个体,以此在收敛到帕累托最优前沿的同时,维持种群分布的多样性,避免算法陷入局部最优。

YUNCHOUSHUO的博客 819

【uni-app】PDA扫码枪获取扫码数据APP(通俗易懂),聚焦频繁弹软键盘输入法等各种坑完美解决方法,附完整代码

uniapp PDA扫码枪获取扫码数据APP(通俗易懂),频繁弹软键盘等各种坑完美解决方法

coderYYY的博客 7419

第25节:cesium 地形开挖综合实例-地下管网(含源码+视频)

地图开挖综合示例,包括底图切换,绘制开挖区域,移除开挖区域,影藏地图等等。

qq_29384639的博客 1782

基于NSGA-II的无人机3D路径规划Matlab实现

路径规划是无人机自主飞行的核心技术,尤其在复杂三维环境中面临立体障碍规避、多目标优化等挑战。遗传算法作为智能优化算法的典型代表,通过模拟自然进化过程解决组合优化问题。NSGA-II(非支配排序遗传算法)因其出色的多目标优化能力,被广泛应用于路径规划领域。在工程实践中,通过三维染色体编码、多目标适应度函数设计等改进,可有效平衡路径长度、能耗与安全性等关键指标。本文以Matlab为技术平台,详细解析如何改造NSGA-II算法实现无人机三维路径规划,包含环境建模、并行计算加速等工程优化技巧,为电力巡检、城市物流等

weixin_30621711的博客 409

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

电动车路径优化:MOPGA-NSGA-II算法实践与Matlab实现

多目标优化算法在电动车路径规划中具有重要应用价值,其中NSGA-II作为经典算法,通过非支配排序和拥挤度计算实现Pareto前沿的均匀分布。针对电动车特有的续航焦虑和充电约束,算法需要同时优化行程时间、能耗成本和充电便利性等目标。工程实践中,结合Memetic算法的局部搜索策略和自适应交叉概率,能有效提升收敛速度。通过Matlab并行计算加速和可视化调试工具,可快速验证算法在真实路网数据(如OpenStreetMap)中的表现。该技术已成功应用于共享电动车调度、冷链物流等领域,典型场景下可降低18%的综合运

culuo8053的博客 412

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

基于NSGA-II的柔性作业车间调度问题Matlab实现指南

多目标优化是解决复杂工程问题的核心技术,其核心在于同时优化多个相互冲突的目标,寻找帕累托最优解集。非支配排序遗传算法(NSGA-II)作为一种经典的多目标进化算法,通过快速非支配排序、拥挤度计算和精英保留策略,有效平衡解的收敛性与多样性。该算法在柔性作业车间调度等生产优化领域具有重要价值,能够为最小化最大完工时间、机器总负载等多目标决策提供数据支持。本文聚焦于使用Matlab从零实现NSGA-II求解柔性作业车间调度问题,涵盖染色体编码、遗传算子设计等关键步骤,为算法实践提供清晰路径。

weixin_34372728的博客 318

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

基于NSGA-II的柔性作业车间多目标调度优化与MATLAB实现

多目标优化是解决复杂工程决策问题的核心技术,它旨在同时优化多个相互冲突的目标,寻找一组均衡的帕累托最优解。其核心原理是通过进化算法等智能搜索策略,在解空间中探索并逼近真实的最优前沿。该技术对于提升系统综合性能、支持科学决策具有重要价值,广泛应用于生产调度、资源分配和路径规划等领域。本文聚焦于制造业中的经典难题——柔性作业车间调度问题(FJSP),该问题需要在最小化最大完工时间(Makespan)和最小化总机器负载等多个目标间进行权衡。我们详细阐述了如何利用强大的多目标优化算法NSGA-II,结合MATLAB

weixin_34320724的博客 473

数学建模竞赛中的多目标规划:从帕累托最优到NSGA-II实战

在解决现实世界的复杂决策问题时,我们常常面临多个相互冲突的目标需要同时优化,例如在资源分配、路径规划或系统设计中平衡成本、效率与质量。多目标规划正是处理这类问题的核心数学框架,其核心思想是寻找帕累托最优解集,即一组无法在所有目标上同时被改进的解决方案。从技术原理上看,求解方法主要分为标量化(如加权和法、ε-约束法)和非标量化(如进化算法)两大类。其中,以NSGA-II为代表的进化算法因其强大的全局搜索能力和良好的解集分布性,成为处理非线性、非凸问题的首选工具,在数学建模竞赛和工程优化中价值显著。本文聚焦于数

ciya3282的博客 480
上一篇: Python模块详解
下一篇: NSGA2代码分析——dominance.c
maplele20
博客等级 码龄19年 104粉丝 35原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值