Beispiel #1
0
        public Tuple <DiscreteSchedule, DiscreteSchedule> Run()
        {
            Ant    bestAnt      = null;
            double bestCriteria = double.MaxValue;

            for (int age = 0; age < STEPS_COUNT; age++)
            {
                ConcurrentBag <Ant> concurrent_ants = new ConcurrentBag <Ant>();
                // Пустили муравьев

                /*for (int i = 0; i< ANTS_COUNT; i++)
                 * {
                 *  concurrent_ants.Add(RunAnt(startNode));
                 * }*/
                Parallel.For(0, ANTS_COUNT, iter =>
                {
                    concurrent_ants.Add(RunAnt(startNode));
                });

                List <Ant>    ants = concurrent_ants.ToList();
                List <double> changeCriteria = new List <double>(), volumeCriteria = new List <double>();
                foreach (var a in ants)
                {
                    changeCriteria.Add(a.GetChangesCriteria());
                    volumeCriteria.Add(a.GetVolumeCriteria());
                }
                // Получили значения критерия для каждого пути
                double        maxRegimeChanges = Ant.REGIME_CHANGE_MAXIMUM_COUNT * LAYERS_COUNT / 24;
                List <double> sumCriteria      = changeCriteria.Zip(volumeCriteria, (x, y) => 0.1 * x / maxRegimeChanges + y / (2 * TEST_VOLUME)).ToList();

                // Испарили феромоны
                foreach (var e in allEdges)
                {
                    e.Pheromone *= EP_1;
                }

                for (int i = 0; i < ants.Count(); i++)
                {
                    Ant a = ants[i];
                    foreach (var e in a.Way)
                    {
                        e.Pheromone += Q / (sumCriteria[i] + 1);
                    }
                }

                double currentCriteria = sumCriteria.Min();
                if (currentCriteria < bestCriteria)
                {
                    bestCriteria = currentCriteria;
                    bestAnt      = ants[sumCriteria.IndexOf(currentCriteria)];
                }

                ants.Clear();
            }

            Dictionary <Pipe, DiscreteSchedule> s = bestAnt.GetSchedule();

            return(new Tuple <DiscreteSchedule, DiscreteSchedule>(s.First(x => x.Key.Name == "inputPipe").Value, s.First(x => x.Key.Name == "outputPipe").Value));
        }