多目标遗传算法 ------ NSGA-II (部分源码解析) 实数、二进制编码的变异操作 mutation.c

遗传算法的变异操作

复制代码
 1 /* Mutation 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 /* Function to perform mutation in a population */
11 void mutation_pop (population *pop)
12 {
13     int i;
14     for (i=0; i<popsize; i++)
15     {
16         mutation_ind(&(pop->ind[i]));
17     }
18     return;
19 }
复制代码

一次进化过程中的 变异操作,  需要调用   变异函数 mutation_ind  种群个数popsize 次。

 

 

 

函数包装,判断是实数编码还是二进制编码并调用不同的变异函数

复制代码
 1 /* Function to perform mutation of an individual */
 2 void mutation_ind (individual *ind)
 3 {
 4     if (nreal!=0)
 5     {
 6         real_mutate_ind(ind);
 7     }
 8     if (nbin!=0)
 9     {
10         bin_mutate_ind(ind);
11     }
12     return;
13 }
复制代码

 

 

 

二进制编码 的  变异操作:

每个个体  的   每个变量  的  二进制编码段   的  每个比特位,   以变异概率  pmut_bin  进行变异。

(单点变异)

复制代码
 1 /* Routine for binary mutation of an individual */
 2 void bin_mutate_ind (individual *ind)
 3 {
 4     int j, k;
 5     double prob;
 6     for (j=0; j<nbin; j++)
 7     {
 8         for (k=0; k<nbits[j]; k++)
 9         {
10             prob = randomperc();
11             if (prob <=pmut_bin)
12             {
13                 if (ind->gene[j][k] == 0)
14                 {
15                     ind->gene[j][k] = 1;
16                 }
17                 else
18                 {
19                     ind->gene[j][k] = 0;
20                 }
21                 nbinmut+=1;
22             }
23         }
24     }
25     return;
26 }
复制代码

 

 

 

 

 

实数编码  情况下的   变异操作:

(多项式变异)

复制代码
 1 /* Routine for real polynomial mutation of an individual */
 2 void real_mutate_ind (individual *ind)
 3 {
 4     int j;
 5     double rnd, delta1, delta2, mut_pow, deltaq;
 6     double delta;
 7     double y, yl, yu, val, xy;
 8     for (j=0; j<nreal; j++)
 9     {
10         rnd = randomperc();
11         if (rnd <= pmut_real)
12         {
13             y = ind->xreal[j];
14             yl = min_realvar[j];
15             yu = max_realvar[j];
16             delta1 = (y-yl)/(yu-yl);
17             delta2 = (yu-y)/(yu-yl);
18             delta = minimum (delta1,delta2);
19             rnd = randomperc();
20             mut_pow = 1.0/(eta_m+1.0);
21             if (rnd <= 0.5)
22             {
23                 xy = 1.0-delta1;
24                 val = 2.0*rnd+(1.0-2.0*rnd)*(pow(xy,(eta_m+1.0)));
25                 deltaq =  pow(val,mut_pow) - 1.0;
26             }
27             else
28             {
29                 xy = 1.0-delta2;
30                 val = 2.0*(1.0-rnd)+2.0*(rnd-0.5)*(pow(xy,(eta_m+1.0)));
31                 deltaq = 1.0 - (pow(val,mut_pow));
32             }
33             y = y + deltaq*(yu-yl);
34             if (y<yl)
35             {
36                 y = yl;
37             }
38             if (y>yu)
39             {
40                 y = yu;
41             }
42             ind->xreal[j] = y;
43             nrealmut+=1;
44         }
45     }
46     return;
47 }
复制代码
eta_m 为 实数编码的 多项式变异的 参数, 为全局设定。
(该变异方式是为了模拟二进制编码的单点变异,逻辑比较简单,数学含义不明)

每个个体  的   每个变量  的  实数表示,   以变异概率  pmut_real  进行变异

 

posted on   Angry_Panda  阅读(4388)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示