Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
В методе Solve заключена вся логика, которая моделирует поведение пчел-фуражиров, решающих задачу. Этот метод в меру сложен и использует три вспомогательных метода: ProcessActiveBee, ProcessScoutBee и ProcessInactiveBee. Первые два метода используют еще один вспомогательный метод — DoWaggleDance. Исходный код метода Solve показан на рис. 9.
Рис. 9. Метод Solve
public void Solve(bool doProgressBar) {
bool pb = doProgressBar;
int numberOfSymbolsToPrint = 10;
int increment = this.maxNumberCycles / numberOfSymbolsToPrint;
if (pb) Console.WriteLine("\nEntering SBC Traveling Salesman Problem algorithm main processing loop\n");
if (pb) Console.WriteLine("Progress: |==========|");
if (pb) Console.Write(" ");
int cycle = 0;
while (cycle < this.maxNumberCycles) {
for (int i = 0; i < totalNumberBees; ++i) {
if (this.bees[i].status == 1)
ProcessActiveBee(i);
else if (this.bees[i].status == 2)
ProcessScoutBee(i);
else if (this.bees[i].status == 0)
ProcessInactiveBee(i);
}
++cycle;
if (pb && cycle % increment == 0)
Console.Write("^");
}
if (pb) Console.WriteLine("");
}
Большая часть работы выполняется вспомогательными методами ProcessActiveBee, ProcessScoutBee и ProcessInactiveBee. Булев входной параметр, передаваемый Solve, указывает, надо ли выводить рудиментарную текстовую полоску прогресса. Это удобно при реализации алгоритма SBC для наблюдения за скоростью работы реализации и помогает вскрывать узкие места. Такой подход предполагает, что метод Solve является частью консольного приложения.
Значение булева параметра передается в локальную булеву переменную pb просто потому, что работать с коротким именем переменной удобнее. Значение numberOfSymbolsToPrint задается равным 10, чтобы каждое приращение полоски состояния отражало 10% от общего прогресса, который определяется значением maxNumberCycles (переменная increment используется, чтобы выяснить, сколько циклов представляет 10% прогресса).
После инициализации переменной cycle, управляющей циклом, нулевым значением для обработки каждой пчелы в улье используется цикл while. (Вместо него можно было бы легко задействовать цикл for.) На каждой итерации этого цикла с помощью цикла for перебирается массив bees и каждый объект Bee обрабатывается соответствующим вспомогательным методом. После обработки всех пчел, если булев параметр doProgressBar равен true, в коде с помощью оператора % проверяется, не пора ли обновить полоску прогресса (используется символ «^»).
Дата публикования: 2015-09-18; Прочитано: 426 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!