NSGA2代码分析——dominance.c

    该源文件中包含一个函数int check_dominance (individual *a, individual *b), 主要功能是比较两个个体的支配关系,该函数有三个返回值:0——两个体不可比较支配关系;1——a个体支配b;-1——b个体支配a。
    两个个体的比较支配关系的方法如下:
    1。如果a和b都违反约束条件:
        (1).则约束值大的个体支配约束值小的个体。
        (2).如果两者约束值相等,则不可比较支配关系
    2。如果a和b有一个违反约束,另一个没有违反约束的,则未违反约束条件的个体支配违反约束条件的个体。
    3。如果a和b都没有违反约束条件:
        (1).如果其中一个个体的所有目标函数值都大于或等于另一个个体,且至少有一个目标函数值是大于的,则前者支配后者。
        (2).否则,不可比较两者支配关系。

    以下为源代码和部分注释:
int  check_dominance (individual  * a, individual  * b)
{
    
int  i;
    
int  flag1;                 // a个体和b个体的目标函数值比较结果标志:fun(a)>fun(b),则flag1=1
     int  flag2;                 // a个体和b个体的目标函数值比较结果标志:fun(a)<fun(b),则flag2=1
    flag1  =   0 ;
    flag2 
=   0 ;
    
if  (a -> constr_violation < 0   &&  b -> constr_violation < 0 )
    {
        
// 如果个体a和b都违反了约束条件,则根据约束违反值判断支配关系
         if  (a -> constr_violation  >  b -> constr_violation)
        {
            
return  ( 1 );
        }
        
else
        {
            
if  (a -> constr_violation  <  b -> constr_violation)
            {
                
return  ( - 1 );
            }
            
else
            {
                
return  ( 0 );
            }
        }
    }
    
else
    {
        
if  (a -> constr_violation  <   0   &&  b -> constr_violation  ==   0 )
        {
            
// 如果个体a违反约束条件,b不违反,则b支配a
             return  ( - 1 );
        }
        
else
        {
            
if  (a -> constr_violation  ==   0   &&  b -> constr_violation  < 0 )
            {
                
// 如果个体b违反约束条件,a不违反,则a支配b
                 return  ( 1 );
            }
            
else
            {
                
// 如果个体a、b都不违反约束条件,则判断两个体的所有目标函数值
                 for  (i = 0 ; i < nobj; i ++ )
                {
                    
if  (a -> obj[i]  <  b -> obj[i])
                    {
                        flag1 
=   1 ;

                    }
                    
else
                    {
                        
if  (a -> obj[i]  >  b -> obj[i])
                        {
                            flag2 
=   1 ;
                        }
                    }
                }
                
// 如果个体a所有目标函数值都大于或等于b,且至少有一个大于的话,则a支配b
                 if  (flag1 == 1   &&  flag2 == 0 )
                {
                    
return  ( 1 );
                }
                
else
                {
                    
// 如果个体b所有目标函数值都大于或等于a,且至少有一个大于的话,则b支配a
                     if  (flag1 == 0   &&  flag2 == 1 )
                    {
                        
return  ( - 1 );
                    }
                    
// 否则两个个体是不可比较支配关系的
                     else
                    {
                        
return  ( 0 );
                    }
                }
            }
        }
    }
}

你可能感兴趣的:(fun,代码分析)