public float[] HitungFitness()
{
float[] fitness = new float[populasi];
for (var individu = 0; individu < populasi; individu++)
{
fitness[individu] = CekConstraint(individu);
}
string[] sort = new string[populasi];
for (int i = 0; i < populasi; i++)
{
sort[i] = string.Format("\nIndividu {0} :Fitness {1}",(i + 1), fitness[i]);
}
bool swapped = true;
while (swapped)
{
swapped = false;
for (int i = 0; i < populasi-1 ; i++)
{
string[] strI = sort[i].Split('.');
float fitI = float.Parse(string.Format("0.{0}", strI[1]));
string[] strJ = sort[i + 1].Split('.');
float fitJ = float.Parse(string.Format("0.{0}", strJ[1]));
if (fitI < fitJ)
{
string sTmp = sort[i];
sort[i] = sort[i + 1];
sort[i + 1] = sTmp;
swapped = true;
}
}
}
return fitness;
}
变量populasi assign = 12
函数CekConstraint在&#39; 0之间给出一个返回值。***&#39;到&#39; 1&#39;
我遇到了问题:
float fitI = float.Parse(string.Format("0.{0}", strI[1]));
或
float fitJ = float.Parse(string.Format("0.{0}", strI[1]));
当strI
或strJ
只给出strJ[1]
或stri[1]
等数组的一个值时,我得到的索引是数组的超出范围。我认识到错误,但我该如何解决这个问题?
请帮帮我。
答案 0 :(得分:2)
string[] strI = sort[i].Split('.');
float fitI = float.Parse(string.Format("0.{0}", strI[1]));
sort[i]
字符串中没有.
。因此,当您调用Split('.')
时,您只生成包含1个项目的数组。由于你收到strI[1]
并且异常,strI数组中没有第二个元素。
答案 1 :(得分:0)
错误是因为它未在strI[1]
或strJ[1]
中获得价值。由于在"."
中找不到sort[i]
,可能会发生这种情况。因此,我们可以看到基于strI
和strJ
数组长度的条件。
将内部for循环更改为
for (int i = 0; i < populasi-1 ; i++)
{
float fitI = 0.0;
float fitJ = 0.0;
string[] strI = sort[i].Split('.');
if(strI.Length > 1)
fitI = float.Parse(string.Format("0.{0}", strI[1]));
string[] strJ = sort[i + 1].Split('.');
if(strJ.Length > 1)
fitJ = float.Parse(string.Format("0.{0}", strJ[1]));
if (fitI < fitJ)
{
string sTmp = sort[i];
sort[i] = sort[i + 1];
sort[i + 1] = sTmp;
swapped = true;
}
}
答案 2 :(得分:-3)
为什么这么多循环,使用列表或dictinary到位或数组并使用foreach循环来避免超出范围的异常。
float[] fitness = new float[populasi];
//create a list for this
string[] sort = new string[populasi];
//another list
and do foreach looping