兩個個體的比較支配關係的方法如下:
1。如果a和b都違反約束條件:
(1).則約束值大的個體支配約束值小的個體。
(2).如果兩者約束值相等,則不可比較支配關係
2。如果a和b有一個違反約束,另一個沒有違反約束的,則未違反約束條件的個體支配違反約束條件的個體。
3。如果a和b都沒有違反約束條件:
(1).如果其中一個個體的所有目標函數值都大於或等於另一個個體,且至少有一個目標函數值是大於的,則前者支配後者。
(2).否則,不可比較兩者支配關係。
以下爲源代碼和部分註釋:
{
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);
}
}
}
}
}
}