我目前正在编写遗传算法来解决一个可能被认为类似于背包问题的问题,但区别因素是我将物品存储在多辆“卡车”上,它们的价值/重要性基于 1 = 最重要, 3 = 最不重要。
我如何做到这一点是使用二进制整数数组,0 = 不在卡车上,1 = 在卡车上。
在大多数情况下,该程序似乎正在做它需要做的事情。除非我比较染色体以找到每一代最好的三个单独的染色体。个体是没有染色体可以包含相同的项目,因为该项目一次只能在一辆卡车上。
这是我用来比较染色体的函数:
private int[] getBestSolution(int count)
{
int[] Genes = new int[3];
int min1 = Global.p.population[0].fitness;
int min2 = Global.p.population[0].fitness;
int min3 = Global.p.population[0].fitness;
int ref1 = 0;
int ref2 = 0;
int ref3 = 0;
bool areSame = true;
//searches for the first "Fittest" chromosome and stores to ref1
for (int i = 0; i < Global.population; i++)
{
if (min1 > Global.p.population[i].fitness)
{
min1 = Global.p.population[i].fitness;
ref1 = i;
}
}
//searches for 2nd fittest, while also checking they are different
for (int i = 0; i < Global.population; i++)
{
areSame = arrayCompare(Global.p.population[ref1].chromosome, Global.p.population[i].chromosome);
if(areSame == true)
{
continue;
}
if (min2 > Global.p.population[i].fitness)
{
min2 = Global.p.population[i].fitness;
ref2 = i;
}
}
//Searches for 3rd fittest while checking that it is different from the first two
for (int i = 0; i < Global.population; i++)
{
areSame = arrayCompare(Global.p.population[ref1].chromosome, Global.p.population[i].chromosome);
if (areSame == true)
{
continue;
}
areSame = arrayCompare(Global.p.population[ref2].chromosome, Global.p.population[i].chromosome);
if(areSame == true)
{
continue;
}
if (min3 > Global.p.population[i].fitness)
{
min3 = Global.p.population[i].fitness;
ref3 = i;
}
}
//stores the reference of each chromosome and return
Genes[0] = ref1;
Genes[1] = ref2;
Genes[2] = ref3;
return Genes;
}
这是我用来将染色体与先前选择的染色体进行比较的函数,以确保它们不包含相同的值。
public bool arrayCompare(int[] a, int[] b)
{
for (int i = 0; i < a.Length; i++)
{
if ((a[i] == 1) && b[i] == 1)
{
return true;
}
}
return false;
}
我通过在代码的不同点使用断点并检查值与预期值将其缩小到导致问题的这两个函数。
最后,到问题本身。getBestSolution() 完美地产生了第一个“最适合”的值。第二个和第三个值保持为它们被初始化为“population[0].fitness”的值并显示出来。
我试图改变育种结构,即育种的选择标准,因为我相信如果没有包含不同值的染色体,它将保持初始化状态。出于同样的原因,我还使用更大的人群进行了测试,所以我相信他们一定是我的代码有问题。
任何帮助深表感谢。