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);
                    }
                }
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章