zoukankan      html  css  js  c++  java
  • 多目标遗传算法 ------ 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 return the following values
    12    1 if a dominates b
    13    -1 if b dominates a
    14    0 if both a and b are non-dominated */
    15 
    16 int check_dominance (individual *a, individual *b)
    17 {
    18     int i;
    19     int flag1;
    20     int flag2;
    21     flag1 = 0;
    22     flag2 = 0;
    23     if (a->constr_violation<0 && b->constr_violation<0)
    24     {
    25         if (a->constr_violation > b->constr_violation)
    26         {
    27             return (1);
    28         }
    29         else
    30         {
    31             if (a->constr_violation < b->constr_violation)
    32             {
    33                 return (-1);
    34             }
    35             else
    36             {
    37                 return (0);
    38             }
    39         }
    40     }
    41     else
    42     {
    43         if (a->constr_violation < 0 && b->constr_violation == 0)
    44         {
    45             return (-1);
    46         }
    47         else
    48         {
    49             if (a->constr_violation == 0 && b->constr_violation <0)
    50             {
    51                 return (1);
    52             }
    53             else
    54             {
    55                 for (i=0; i<nobj; i++)
    56                 {
    57                     if (a->obj[i] < b->obj[i])
    58                     {
    59                         flag1 = 1;
    60 
    61                     }
    62                     else
    63                     {
    64                         if (a->obj[i] > b->obj[i])
    65                         {
    66                             flag2 = 1;
    67                         }
    68                     }
    69                 }
    70                 if (flag1==1 && flag2==0)
    71                 {
    72                     return (1);
    73                 }
    74                 else
    75                 {
    76                     if (flag1==0 && flag2==1)
    77                     {
    78                         return (-1);
    79                     }
    80                     else
    81                     {
    82                         return (0);
    83                     }
    84                 }
    85             }
    86         }
    87     }
    88 }

    以上代码是判断两个个体的支配关系的。

    基本遵循两个原则,首先是判断两个个体是是否超出限制条件,即判断   constr_violation  的大小。

    如果个体  没有超过限制条件  则个体的  constr_violation >= 0,constr_violation 默认值  为  0 。

    然后判断两个个体之间的支配关系。

    以上代码含义基本为,首先判断两个个体是否 超出限制,即constr_violation<0 ,  如果一个个体超出限制,另一个没有超出则直接选择  未超出限制的个体。

    如果两个个体都超出限制了则选出   超出限制较小  的个体,  即  constr_violation  较大个体。

    如果两个个体都超出限制了  而  constr_violation  相等, 则判断两个个体  支配关系为  互不支配

    如果两个个体  均没有超出限制,  则判断两个个体的支配关系。这里的具体操作是对两个个体的各个目标函数值进行大小判断,

    如果  a  个体的目标函数有小于 b 个体的, flag1==1 。如果  b  个体的目标函数有小于  a 个体的, flag2==1 。

    如果 flag1==1  flag2==0, 则  a  支配  b 。

    如果 flag1==0  flag2==1, 则  b  支配  a 。

    如果 flag1==1  flag2==1, 则  a    b  互不支配 。

  • 相关阅读:
    剑指offer 51.构建乘积数组
    剑指offer 50.数组中重复的数字
    股票价格涨跌预测—基于KNN分类器
    R语言-神经网络包RSNNS
    基于客户保持率的人口特性分析
    车辆碰撞位置间的关联性分析
    统计学的七大支柱[转载@谢益辉]
    AutoDesK演示项目部署
    自定义数字键盘组件化方案
    2020年大前端发展趋势
  • 原文地址:https://www.cnblogs.com/devilmaycry812839668/p/6262093.html
Copyright © 2011-2022 走看看