| 1 | boolean tsp_seed_rjm(population *pop, entity *adam) |
|---|
| 2 | { |
|---|
| 3 | int i,s,tmp,j,k; |
|---|
| 4 | int *data; |
|---|
| 5 | int Assigned[MAX_TOWNS] ; |
|---|
| 6 | int closest2,marker1; |
|---|
| 7 | |
|---|
| 8 | DBG("*** In tsp_seed_rjm, pop-<len_chromosomes = %i \n",pop->len_chromosomes); |
|---|
| 9 | data = (int *)adam->chromosome[0]; |
|---|
| 10 | |
|---|
| 11 | for (i=0; i < pop->len_chromosomes; i++) Assigned[i] = -1; // these are the nodes assigned to the path |
|---|
| 12 | |
|---|
| 13 | for (i=0; i<pop->len_chromosomes; i++) |
|---|
| 14 | { |
|---|
| 15 | Assigned[i] = -1; |
|---|
| 16 | if(ids[i] == source_id) // ie find the index where index of source_id is initially stored |
|---|
| 17 | s = i; |
|---|
| 18 | DBG("ids[%i] = %i, \n",i,ids[i]); |
|---|
| 19 | } |
|---|
| 20 | Assigned[s] = 1; // mark this vertex's index as assigned |
|---|
| 21 | data[0] = s; // place it in the first position |
|---|
| 22 | DBG("Postion 0 , index = %i, data[0] = %i\n",s,s); |
|---|
| 23 | marker1 = 0; |
|---|
| 24 | for ( k=1; k < pop->len_chromosomes; k++){ // loop through every sequential position in path not yet filled |
|---|
| 25 | closest2 = -1; |
|---|
| 26 | for ( i=0; i < k ; i++){ // now scan every vertex in the path which could precede a new vertex eg. 0...k |
|---|
| 27 | for (j=0; j < pop->len_chromosomes; j++) // loop through the vertices not yet in the path eg. where Assigned[j] < 0 |
|---|
| 28 | if ( Assigned[j] < 0 ){ // this vertex j not yet included in the path |
|---|
| 29 | // find the unassigned vertex closest to vertex i already in the path |
|---|
| 30 | if ( closest2 < 0 || marker1 < 0 || DISTANCE[i][j] < DISTANCE[marker1][closest2] ){ |
|---|
| 31 | closest2 = j; // j is current index of the vertex not yet in path |
|---|
| 32 | marker1 = i; // i is current index of vertex in path |
|---|
| 33 | DBG("closest1 = %i,marker1 = %i\n",closest2,marker1); |
|---|
| 34 | } |
|---|
| 35 | } |
|---|
| 36 | |
|---|
| 37 | // closest1 now contains index of vertex closest to member marker1 of the assigned path |
|---|
| 38 | DBG("marker1 = %i, closest2 = %i\n , distance between = %f",marker1,closest2,DISTANCE[data[marker1]][closest2]); |
|---|
| 39 | } |
|---|
| 40 | |
|---|
| 41 | DBG("Finished second loop, closest2 = %i, marker1 = %i, index k = %i\n",closest2,marker1,k); |
|---|
| 42 | // now closest2 contains the index of a vertex closer to a vertex in path than any other vertex not |
|---|
| 43 | // already in the path is to any vertex in the path |
|---|
| 44 | // shuffle the existing following entries back down the path |
|---|
| 45 | for ( j = k -1; j > marker1; j-- ){ |
|---|
| 46 | if ( Assigned[data[j]] ){ |
|---|
| 47 | DBG("Shuffling data[%i] = data[%i] = %i\n",j+1,j,data[j]); |
|---|
| 48 | data[j+1] = data[j]; |
|---|
| 49 | } |
|---|
| 50 | } |
|---|
| 51 | Assigned[closest2] = 1; // mark the vertex as in the path |
|---|
| 52 | data[k] = closest2; // add the vertex into path as successor to vertex it's closest to |
|---|
| 53 | DBG("data[%i] = %i\n",k,closest2); |
|---|
| 54 | |
|---|
| 55 | } // this loop fills consecutive positions in the path |
|---|
| 56 | |
|---|
| 57 | return TRUE; |
|---|
| 58 | } |
|---|
| 59 | |
|---|