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).否则,不可比较两者支配关系。
以下为源代码和部分注释:
两个个体的比较支配关系的方法如下:
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);
}
}
}
}
}
}
{
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);
}
}
}
}
}
}
- NSGA2代码分析——dominance.c
- NSGA2代码分析——rank.c
- NET2272.C 代码分析——InitProcessorSpecificConfiguration
- NET2272.C 代码分析——SetProcessorSpecificDefaultConfiguration
- Linux内核分析(-)——反编译C代码
- Stochastic dominance 随机优势
- NSGA2 Matlab toolbox
- 小议国际C语言混乱代码大赛——附87年一行的代码分析
- Linux内核分析之一——简单C程序的汇编代码工作过程分析
- [网易云课堂]Linux内核分析(一)——简单C程序汇编代码分析
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现代码(C/C++)
- NSGA2算法中文版详细介绍
- 模糊C代码分析-1984
- 一段经典C代码分析
- c代码静态分析工具
- C/C++ 代码分析警告
- C程序启动代码分析
- C/C++代码分析检测工具
- SQL SERVER 与ACCESS、EXCEL的数据转换
- 电脑新装上myeclipse6,出现问题,打不开?
- python的web framework
- *p++与(*p)++与*(p++)
- MySQL连接样例!
- NSGA2代码分析——dominance.c
- 项目经理如何管理?
- Asp.net 中删除上传的图片
- oracle-merge用法详解
- cs,ds,ss,es?即cs,ds,ss,es的区别
- Ubuntu8.04 下安装 QT for X11 4.4.0
- 在server2003上运行asp.net时出错
- 改变标签的文字颜色
- asp.net 中弹出对话框