您的位置:首页 > 其它

Pareto非支配集和的选取-擂台赛方法

2016-01-05 10:17 162 查看
原理-方法如下:http://www.cqvip.com/read/read.aspx?id=43249935

具体代码如下:

  while (indivs.Count > 0)
{

#region 初始
//每一次循环都要找到一个霸主,即非支配个体
//int indexofbetterindiv = 0;
//for (i = 1; i < indivs.Count; i++)
//{
// if (IsBetter(indivs[i], indivs[indexofbetterindiv], objNum))
// {
// indexofbetterindiv = i;
// }
//}
//betterindivs.Add(indivs[indexofbetterindiv]);//非支配集添加每一轮新的霸主,以前出过BUG
////删除掉新的擂主所支配的个体
//List<int> indexofdelteindiv = new List<int>();//保存被删掉的个体的下标
//for (i = 0; i < indexofbetterindiv; i++)
//{
// if (IsBetter(indivs[indexofbetterindiv], indivs[i], objNum))
// {
// indexofdelteindiv.Add(i);
// }
//}
//for (i = 0; i < indexofdelteindiv.Count; i++)
//{
// indivs.RemoveAt(indexofdelteindiv[i] - i);
//}
////最后删除掉优胜个体,这里需要注意的是删除的下标问题
//if (indexofbetterindiv >= indivs.Count)
//{
// indivs.RemoveAt(indivs.Count-1);
//}
//else
//{
// indivs.RemoveAt(indexofbetterindiv);
//}
#endregion

//每一次循环都要找到一个霸主,即非支配个体
for (i = 0; i < indivs.Count; i++)
{
//删除掉此轮擂主支配的个体
if (IsBetter(tempindiv, indivs[i], objNum))
{
indivs.Remove(indivs[i]);
}
//找到新的擂主
else if (IsBetter(indivs[i], tempindiv, objNum))
{
indivs[i].clone(ref tempindiv);
//删除掉非支配集和中是存在该擂主所支配的个体
if (betterindivs.Count != 0)
{
int t = 0;
for (j = 0; j < betterindivs.Count; j++)
{
if (IsBetter(tempindiv, betterindivs[j], objNum))
{
betterindivs.RemoveAt(j-t);
t++;
}
}
}
}
else//没有关系的时候加入非支配集和
{
betterindivs.Add(indivs[i]);
indivs.Remove(indivs[i]);
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: