多目标遗传算法 ------ NSGA-II (部分源码解析)介绍

NSGA(非支配排序遗传算法)、NSGA-II(带精英策略的快速非支配排序遗传算法),都是基于遗传算法的多目标优化算法,是基于pareto最优解讨论的多目标优化。

在官网:

http://www.iitk.ac.in/kangal/codes.shtml

可以下载到  NSGA-II  的C语言版源码,下载最新版后打开如下:

其中,nsga2r.c  为主文件,打开后找到核心代码,如下:

 1     for (i=2; i<=ngen; i++)
 2     {
 3         selection (parent_pop, child_pop);
 4         mutation_pop (child_pop);
 5         decode_pop(child_pop);
 6         evaluate_pop(child_pop);
 7         merge (parent_pop, child_pop, mixed_pop);
 8         fill_nondominated_sort (mixed_pop, parent_pop);
 9         /* Comment following three lines if information for all
10         generations is not desired, it will speed up the execution */
11         fprintf(fpt4,"# gen = %d\n",i);
12         report_pop(parent_pop,fpt4);
13         fflush(fpt4);
14         printf("\n gen = %d",i);
15         fflush(stdout);
16     }

由第1行代码可知,初始化生成代码为第一代,其后的操作为第  2  代到设定的迭代次数  ngen 

由第3行代码可知,selection 函数  (二元锦标赛选择,SBX交叉)等功能的实现包装在一起。

由第4行代码可知,   mutation_pop 函数 对新种群( child_pop ) 进行变异操作。

由第5行代码可知,decode_pop 函数 为对二进制编码的遗传个体进行解码操作。

由第6行代码可知,evaluate_pop 函数 是对新种群( child_pop ) 进行多目标函数值的计算。

由第7行代码可知,merge 函数  将 父种群  和   子种群   合并成临时种群(mixed_pop)。

由第8行代码可知,fill_nondominated_sort 对临时种群(mixed_pop) 非支配排序,拥挤距离判断。

由第12行代码可知, report_pop  对  父种群(parent_pop)中的个体的多目标函数值,支配层,拥挤距离,个体编码进行打印。

时间: 2024-10-03 03:12:04

多目标遗传算法 ------ NSGA-II (部分源码解析)介绍的相关文章

多目标遗传算法 ------ NSGA-II (部分源码解析) 交叉操作 crossover.c

遗传算法中的交叉操作是 对NSGA-II  源码分析的  最后一部分, 这一部分也是我 从读该算法源代码和看该算法论文理解偏差最大的  函数模块. 这里,首先提一下,遗传算法的  交叉操作.变异操作都是需要设定概率的, 即交叉概率和变异概率. 假设种群个体 大小为  popsize ,  那么交叉操作需要进行 popsize/2 次 ,   变异操作需要进行 popsize 次, 其中每次操作的时候都需要随机生成一个随机数来与给定的概率进行判断,若小于给定的概率则继续执行否则退出该操作. 如果继

多目标遗传算法 ------ NSGA-II (部分源码解析)状态报告 打印 report.c

1 /* Routines for storing population data into files */ 2 3 # include <stdio.h> 4 # include <stdlib.h> 5 # include <math.h> 6 7 # include "global.h" 8 # include "rand.h" 9 10 /* Function to print the information of a

多目标遗传算法 ------ NSGA-II (部分源码解析)两个个体支配判断 dominance.c

1 /* Domination checking routines */ 2 3 # include <stdio.h> 4 # include <stdlib.h> 5 # include <math.h> 6 7 # include "global.h" 8 # include "rand.h" 9 10 /* Routine for usual non-domination checking 11 It will retur

多目标遗传算法 ------ NSGA-II (部分源码解析)二元锦标赛选择 tourselect.c

tourselect.c  文件中共有两个函数: selection (population *old_pop, population *new_pop) individual* tournament (individual *ind1, individual *ind2) 首先,第一个函数代码如下: 1 /* Routine for tournament selection, it creates a new_pop from old_pop by performing tournament

多目标遗传算法 ------ NSGA-II (部分源码解析)辅助变量 双链表操作 list.c

1 /* A custom doubly linked list implemenation */ 2 3 # include <stdio.h> 4 # include <stdlib.h> 5 # include <math.h> 6 7 # include "global.h" 8 # include "rand.h" 9 10 /* Insert an element X into the list at location

多目标遗传算法 ------ NSGA-II (部分源码解析)父、子种群合并 merge.c

1 /* Routine for mergeing two populations */ 2 3 # include <stdio.h> 4 # include <stdlib.h> 5 # include <math.h> 6 7 # include "global.h" 8 # include "rand.h" 9 10 /* Routine to merge two populations into one */ 11 vo

YOLOv3目标检测:原理与Darknet源码解析

Linux创始人Linus Torvalds有一句名言:Talk is cheap. Show me the code. (冗谈不够,放码过来!). 代码阅读是从入门到提高的必由之路.尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进一步优化和创新. YOLOv3是一种基于深度学习的端到端实时目标检测方法,以速度快见长. YOLOv3的实现Darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让

Andriod OKHttp源码解析

前言:对于 OkHttp 勤快学QKXue.NET接触的时间其实不太长,一直都是使用Retrofit + OkHttp 来做网络请求的,但是有同学说面试的时候可能会问框架源码,这样光是会用是不够的,于是便萌生了通一通OkHttp源码的念头.经过大约一周的时间,源码看了个大概(说来惭愧,也就知道里面的原理),这里变向大家介绍一下我的所得,希望对大家能有所帮助.这里推荐两篇博文: OkHttp 官方教程解析 - 彻底入门 OkHttp 使用 和 拆轮子系列:拆 OkHttp 前者能够让你入门OkHt

第三十六节,目标检测之yolo源码解析

在一个月前,我就已经介绍了yolo目标检测的原理,后来也把tensorflow实现代码仔细看了一遍.但是由于这个暑假事情比较大,就一直搁浅了下来,趁今天有时间,就把源码解析一下.关于yolo目标检测的原理请参考前面一篇文章:第三十五节,目标检测之YOLO算法详解 在讲解源码之前,我们需要做一些准备工作: 下载源码,本文所使用的yolo源码来源于网址:https://github.com/hizhangp/yolo_tensorflow 下载训练所使用的数据集,我们仍然使用以VOC 2012数据集