Esempio n. 1
0
 private void finishPath(Ant ant)
 {
     while (ant.pathSoFar.Count < Cities.Length)
     {
         for (int i = 0; i < Cities.Length; i++)
         {
             if (!ant.citiesVisited[i])
             {
                 ant.visitCity(i);
             }
         }
     }
 }
Esempio n. 2
0
        public void doCircut(Ant ant)
        {
            ant.visitCity(rand.Next(0, Cities.Length));
            for (int i = 0; i < Cities.Length - 1; i++)
            {
                if (rand.NextDouble() < RANDOM_CHANCE)
                {
                    int t = rand.Next(Cities.Length - ant.getCurrentCity()); // random town
                    int j = -1;
                    for (int k = 0; k < Cities.Length; k++)
                    {
                        if (!ant.citiesVisited[k])
                        {
                            j++;
                        }
                        if (j == t)
                        {
                            ant.visitCity(k);
                            break;
                        }
                    }
                }

                double[] probs = new double[Cities.Length];
                double   denom = 0.0;

                for (int j = 0; j < Cities.Length; j++)
                {
                    if (ant.citiesVisited[j])
                    {
                        probs[j] = 0.0;
                    }
                    else
                    {
                        probs[j] = getProbability(ant.getCurrentCity(), j);
                    }
                    denom += probs[j];
                }

                if (denom == 0)
                {
                    ant = new Ant(Cities.Length);
                    doCircut(ant);
                    if (ant.pathSoFar.Count < Cities.Length)
                    {
                        finishPath(ant);
                        return;
                    }
                    return;
                }
                for (int j = 0; j < Cities.Length; j++)
                {
                    probs[j] /= denom;
                }
                double r     = rand.NextDouble();
                double total = 0.0;
                for (int j = 0; j < Cities.Length; j++)
                {
                    total += probs[j];
                    if (total >= r)
                    {
                        ant.visitCity(j);
                        break;
                    }
                }
            }
            if (ant.pathSoFar.Count < Cities.Length)
            {
                finishPath(ant);
                return;
            }
        }