所以我要从当代这两位最好的父母那里养一个孩子。我们的想法是从父母1中获取一些随机数量的路线的前半部分,从父母2中获取后半部分的随机数量。
我认为当我尝试防止重复时会出现问题。所以我的输出似乎与其他人一样。总是相同的数字,即使第一代人口是完全随机的(我已经测试过)。第一代距离似乎随机变化,第二代每条路线都有相同的距离,但每次运行都会改变。第三代有相同的父母和孩子。所以它基本上慢慢收敛到相同的数字。 15977.582173243769。我很确定这个数字是一些奇怪的东西,但我们只得到运行时错误,没有编译器的东西。如果需要其他代码,我也可以发布。
int [] arr = new int [80]; // creating the child array
int spoint = (int)(Math.random()*20); // start point of the crossover from parent 1
int epoint = (int)(Math.random()*20+20); // endpoint of crossover of parent 1
//array for taking the subtour from parent 1 and adding it to the child
for(int i =spoint;i<epoint;i++){
arr[i]=p1.route[i];
}
int spoint1 = (int)(Math.random()*20 +40);
int epoint1 = (int)(Math.random()*20+60);
//parent 2 does the same thing as parent 1 except at the second half of the route.
for(int i =spoint;i<epoint;i++){
arr[i]=p2.route[i];
}
int [] isTown = new int[80];//array of the towns
for(int i=0;i<arr.length;i++){
isTown[arr[i]] = isTown[arr[i]] + 1;//arr is child route
}
//find duplicates and replace with missing towns
for(int i=0;i<isTown.length;i++)
{
if(isTown[i]>1)
{
for(int j =0;j<arr.length;j++)
{
if(arr[j]== i)
{
for(int k =0;k<arr.length;k++)
{
if(isTown[k]==0)
{
arr[j] = arr[k];//swap a repeating town with one that did not occur
}
}
}
}
isTown[i]--;
}
}
double len = 0;
for(int i=1;i<arr.length;i++)
{
len = len + rdMatrix[i-1][i];
}
genetic child = new genetic(arr,len);
return child;
答案 0 :(得分:0)
我注意到你在第二个for循环中使用了spoint和epoint,所以你再次使用了路径的第一部分。