NSGA2代码分析——dominance.c

来源:互联网 发布:电子商务php 编辑:程序博客网 时间:2024/05/16 19:37
    该源文件中包含一个函数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);
                    }
                }
            }
        }
    }
}
原创粉丝点击