Глобальная параметрическая оптимизация методом пчелиного роя

Характеристика метода пчелиного роя для решения задач глобальной оптимизации. Обзор используемых программных платформ. Тестирование и исследование эффективности алгоритма и программного обеспечения. Технико-экономическое обоснование эффективности НИОКР.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 26.06.2012
Размер файла 3,5 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Аннотация

В работе реализуется метод пчелиного роя для задач глобальной многопараметрической оптимизации, проводится тестирование и исследование эффективности алгоритма и программного обеспечения.

Реферат

Расчетно-пояснительная записка к дипломному проекту «Глобальная параметрическая оптимизация методом пчелиного роя».

В расчетно-пояснительной записке приведен обзор метода пчелиного роя для решения задач глобальной оптимизации. Осуществлен выбор среды реализации алгоритма пчелиного роя. Описана структура разработанного программного обеспечения. Произведены исследования алгоритма.

Оглавление

  • 1 Введение
  • 2 Исследовательская часть. Обзор метода пчелиного роя для решения задач глобальной оптимизации
    • 2.1 Постановка задачи
    • 2.2 Бионические предпосылки метода пчелиного роя
    • 2.3 Канонические метод и алгоритм пчелиного роя
    • 2.4 Алгоритм пчелиного роя
    • 2.5 Выводы
  • 3 Конструкторская часть. Разработка программы, реализующей метод пчелиного роя
    • 3.1 Обзор используемых программных платформ
      • 3.1.1 Mathworks Matlab
      • 3.1.2 Python.
    • 3.2 Разработка структуры программы
    • 3.3 Разработка программы
    • 3.4 Выводы
  • 4 Технологическая часть. Тестирование и исследование эффективности программного обеспечения
    • 4.1 Тестирование программы
      • 4.1.1 Параметры тестовой функции
      • 4.1.2 Пример работы алгоритма
      • 4.1.3 Выводы
    • 4.2 Исследование эффективности алгоритма и программного обеспечения
      • 4.2.1 Функция Розенброка
      • 4.2.2 Функция Химмельблау
      • 4.2.3 Функция Растригина
    • 4.3 Выводы
  • 5 Технико-экономическое обоснование эффективности НИОКР
    • 5.1 Расчет трудоемкости выполнения НИОКР
    • 5.2 Расчет затрат на выполнение НИОКР
      • 5.2.1 Материальные затраты (МЗ)
      • 5.2.2 Прочие затраты (ПЗ)
      • 5.2.3 Фонд заработной платы (ФЗ)
      • 5.2.4 Амортизационные отчисления (АО)
      • 5.2.5 Единый социальный налог (ЕСН)
      • 5.2.6 Полная себестоимость работы (С)
    • 5.3 Формирование чистой прибыли предприятия и определение эффективности производственных затрат
    • 5.4 Оценка технического уровня НИОКР
    • 5.5 Выводы
  • 6 Промышленная экология и безопасность
    • 6.1 Введение
    • 6.2 Анализ основных факторов воздействия среды на оператора ПК
    • 6.3 Критерии проектирования помещения вычислительного центра
      • 6.3.1 Общие положения организации рабочего места
      • 6.3.2 Обеспечение параметров микроклимата
      • 6.3.3 Выбор рабочей позы
      • 6.3.4 Обеспечение освещения рабочего места
      • 6.3.5 Оптимальное размещение оборудования
      • 6.3.6 Размещение основных элементов рабочего места
      • 6.3.7 Обеспечение электробезопасности
      • 6.3.8 Обеспечение допустимого уровня шума
      • 6.3.9 Обеспечение допустимых эргономических характеристики дисплеев
      • 6.3.10 Обеспечение пожаробезопасности
    • 6.4 Расчет системы освещения
      • 6.4.1 Выбор источников света
      • 6.4.2 Выбор системы освещения
      • 6.4.3 Выбор осветительных приборов
      • 6.4.4 Размещение осветительных приборов
      • 6.4.5 Выбор освещенности и коэффициента запаса
      • 6.4.6 Расчет осветительной установки
    • 6.5 Выводы
  • 7 Заключение
  • 8 Литература

1 Введение

Среди задач непрерывной конечномерной оптимизации самым важным с практической точки зрения и, одновременно, самым сложным является класс задач глобальной условной оптимизации. Методы решения задач этого класса можно разделить на две большие группы:

· методы сведения задачи глобальной условной оптимизации к задаче глобальной безусловной оптимизации с помощью штрафных или барьерных функций;

· методы, специально сконструированные для решения задачи глобальной условной оптимизации.

Рассматриваемый в работе метод пчелиного роя относится к методам первой группы и, таким образом, предназначен для решения задач глобальной безусловной оптимизации.

Методы решения задачи глобальной безусловной оптимизации делятся [1] на детерминированные методы, стохастические методы и эвристические методы.

Эвристические методы являются относительно новыми и быстро развивающимися методами. Среди этих методов выделяются эволюционные и поведенческие (имитационные) методы.

Поведенческие методы решения задачи глобальной безусловной оптимизации основаны на моделировании коллективного поведения самоорганизующихся живых или неживых систем. Взаимодействующие элементы этих систем, в общем случае, называются агентами. Ключевыми идеями поведенческих методов являются децентрализованность, взаимодействие агентов, простота поведения агентов.

Известность получили следующие поведенческие методы решения задачи глобальной безусловной оптимизации: метод поведения пчёл; метод колонии муравьев; метод роя частиц.

При решении задач оптимизации весьма перспективным является использование мультиагентных методов, основанных на моделировании интеллектуального поведения колоний агентов (Swarm Intelligence) [2, 3]. В природе таким интеллектом обладают группы общественных насекомых, например, колонии термитов, муравьёв, пчёл, некоторых видов ос.

Динамика популяции общественных насекомых обусловлена различными взаимодействиями отдельных насекомых как друг с другом, так и с окружающей средой, осуществляемыми посредством множества различных химических и (или) физических сигналов. Результатом различных взаимодействий является общественное поведение колонии насекомых, примерами которого являются виляющий танец пчёл и выделение феромона муравьями. Эти системы связи между отдельными насекомыми вносят вклад в формирование “коллективного интеллекта” колоний общественных насекомых. Метод пчелиного роя является одним из новейших методов, относящихся к рассматриваемому направлению. Он представляет собой эвристический итеративный мультиагентный метод случайного поиска. За счёт того, что идея метода взята из природы (выполняется моделирование поведения пчёл при поиске нектара) и метод основан на мультиагентном подходе, оптимизационный процесс при работе метода пчелиного роя характеризуется высокой эффективностью.

В методе оптимизации пчелиным роем (Bees Algorithm) агентами являются пчелы в пространстве параметров задачи оптимизации. На каждой итерации пчелы имеют в этом пространстве некоторое положение. Для каждого положения пчелы вычисляется соответствующее значение целевой функции, и на этой основе по определенным правилам исследуется или не исследуется близлежащее пространство.

Основным стимулом для подготовки данной работы явилось почти полное отсутствие русскоязычных исследований и публикаций по методу пчелиного роя.

Цели и задачи дипломного проекта. Реализовать канонический алгоритм пчелиного роя для решения задачи многомерной глобальной безусловной оптимизации. Произвести тестирование разработанного программного обеспечения, а также исследовать эффективность алгоритма и программного обеспечения. Исследования эффективности производить, используя пакеты тестовых функций CES (Congress of Evolutionary Computing) [17]. Для реализации алгоритма необходимо выбрать среду разработки программного обеспечения.

2 Исследовательская часть. Обзор метода пчелиного роя для решения задач глобальной оптимизации

2.1 Постановка задачи

В основе работы лежит проблема глобальной условной оптимизации: найти максимум критерия оптимальности Ц(X), определенного во множестве D евклидова пространства Rn;

,

(2.2)

где множество допустимых значений D задается только с помощью ограничений типа неравенств и представляет собой гиперпараллелепипед [9].

2.2 Бионические предпосылки метода пчелиного роя

Для описания поведения пчёл в природе используются три основных понятия [4]:

- источник нектара - характеризуется значимостью, определяемой различными факторами, такими как: удалённость от улья, концентрация нектара, удобство добычи нектара;

- занятые фуражиры - закреплены за отдельным источником, на котором они добывают нектар, то есть они “заняты” им. Занятые фуражиры владеют такой информацией о данном источнике нектара, как: расстояние и направление от улья, полезность источника;

- незанятые фуражиры - продолжают искать источники нектара для их использования.

Существует два типа незанятых фуражиров: разведчики, которые ищут новые источники нектара, и наблюдатели, которые ждут и могут выполнять другие действия в улье.

Каждая незанятая пчела может полететь к источнику нектара, следуя за пчелой - разведчиком, которая нашла путь к цветку. Это достигается за счёт того, что каждый улей имеет так называемую закрытую площадку для танца, на которой пчёлы, обнаружившие источники нектара, выполняют виляющий танец, тем самым, пытаясь привлечь других незанятых пчёл последовать за ними. Если пчела решает оставить улей, чтобы получить нектар, она следует за одной из пчел-разведчиков к области с нектаром. Таким образом, незанятая пчела становится занятой.

По достижению области с нектаром занятый фуражир добывает нектар и возвращается в улей, оставляя нектар там. После того, как пчела оставляет нектар, она может выполнить одно из следующих трех действий:

- оставить источник нектара и снова стать незанятым фуражиром;

- продолжить фуражировку к тому же источнику нектара, не вербуя других особей своего улья;

- выполнить танец и таким образом выполнить вербовку.

Пчела выбирает одну из вышеупомянутых альтернатив с некоторой вероятностью. В пределах области танца пчелы "рекламируют" различные области нектара. Механизмы, в соответствии с которыми пчела решает следовать за другой пчелой, исследованы недостаточно хорошо, но предполагается, что вербовка среди пчел с математической точки зрения всегда является функцией качества источника нектара [3]. Также отмечено, что не все пчелы начинают фуражировку одновременно.

Таким образом, выполняется разделение функций между занятыми фуражирами и разведчиками на улучшенное изучение найденных областей с нектаром и на нахождение новых областей с нектаром, соответственно. За счёт такого разделения труда достигается эффективная работа всего роя пчёл.

Самоорганизация пчелиного роя основывается на четырёх следующих основных свойствах.

1. Положительная обратная связь - заключается в том, что пчёлы, основываясь на полученной информации от другой пчелы, начинают летать к указанному источнику нектара.

2. Отрицательная обратная связь - заключается в том, что пчела, основываясь на информации, полученной от других пчёл, может решить, что найденный ею источник значительно хуже по сравнению с другими найденными источниками.

3. Неустойчивость - пчёлы-разведчики выполняют случайный поиск новых источников ресурсов.

4. Множественность взаимодействия - информация об источнике ресурсов, найденном одной пчелой, доступна для всех других в улье посредством выполнения так называемого виляющего танца.

2.3 Канонические метод и алгоритм пчелиного роя

Идея алгоритма взята, как уже можно догадаться из названия, у пчел, а именно из их поведения при поиске мест [5,6], где можно раздобыть как можно больше нектара. Сначала из улея вылетают в случайно направлении какое-то количество пчел-разведчиков [7], которые пытаются отыскать участки, где есть нектар. Через какое-то время пчелы возвращаются в улей и сообщают остальным, где и сколько они нашли нектара.

После этого на найденные участки отправляются другие пчелы, причем, чем больше на данном участке предполагается найти нектара, тем больше пчел летит в этом направлении. А разведчики опять улетают искать другие участки, после чего процесс повторяется.

Расположение глобального экстремума - это участок, где больше всего нектара, причем этот участок единственный, то есть в других местах нектар есть, но меньше. А пчелы живут не на плоскости, где для определения месторасположения участков достаточно знать две координаты, а в многомерном пространстве, где каждая координата представляет собой один параметр функции, которую надо оптимизировать. Найденное количество нектара представляет собой значение целевой функции в этой точке (в случае, если ищется глобальный максимум; если - глобальный минимум, то целевую функцию достаточно умножить на -1).

Рассмотрим более подробно алгоритм применительно к нахождению экстремумов функции. Далее будем считать, что мы ищем глобальный максимум функции.

В алгоритме каждое решение представляется в виде пчелы [5], которая знает (хранит) расположение (координаты или параметры многомерной функции) какого-то участка поля, где можно добыть нектар.

На первом шаге алгоритма в точки, описываемые случайными координатами, отправляется некоторое количество пчел-разведчиков (пусть будет S пчел, от слова scout). В зависимости от значения целевой функции, которое определяется координатами пчелы, выделяются два вида перспективных участков на поверхности функции, вблизи которых возможно располагается глобальный максимум. А именно:

· выбирается n лучших участков, где значения целевой функции максимальны;

· выбирается m так называемых выбранных участков, близки к максимальным.

Здесь нужно обратить внимание на одну особенность, которая может быть важна при реализации алгоритма. Несколько пчел могут попасть на один и тот же участок (близко друг к другу). Поэтому можно выделить два варианта поведения:

· считать, что эти две пчелы нашли два разных пересекающихся участка, и оба этих участка отметить как лучшие или выбранные;

· считать, что это один участок, центр которого находится в точке, которая соответствует пчеле с большим значением целевой функции.

В окрестность n лучших участков посылается N пчел, а в окрестность m выбранных участков посылается M пчел, причем на каждый из n участков должно приходиться больше пчел, чем на каждый из m участков. Можно сделать так, что чем больше значение целевой функции, тем большее количество пчел будет отправляться на соответствующий участок, а можно N и M сделать фиксированными величинами.

Пчелы посылаются в окрестность перспективных мест. Кроме того, окрестность, которая определяет область, в которую может быть послана пчела, можно уменьшать по мере увеличения номера итерации, чтобы постепенно решение сходилось к самому "кончику" экстремума. Но если область уменьшать слишком быстро, то решение может застрять в локальном экстремуме.

После всех этих операций снова находятся n лучших и m выбранных участков, на этот раз среди всех пчел из роя, а не только среди разведчиков, и запоминается самое лучшее место, это и будет промежуточным решением.

Очень важно отметить количество повторений алгоритма, т.к. алгоритм повторяется до тех пор, пока не сработает какой-либо критерий останова. Критериев останова может быть несколько. Например, если мы знаем значение целевой функции в глобальном экстремуме мы можем повторять шаги алгоритма до тех пор, пока не достигнем значения целевой функции, близкое к желаемому. В обратном случае, когда значение целевой функции неизвестно, шаги алгоритма повторяются до тех пор, пока на протяжении достаточно длительного промежутка времени значение целевой функции не улучшается, т.е. используются стандартные критерии останова:

(2.3)

, (2.4)

где -точность по X.

Еще один вариант - это фиксированное количество итераций алгоритма, задаваемое как входной параметр.

Таким образом, схема алгоритма (псевдо код) [8] представлена ниже (см. рисунок 2.1).

Формальная схема работы алгоритма представлена на рисунке 2.2, где в формальных математических терминах описывается поэтапный поиск максимума функции.

2.4 Алгоритм пчелиного роя

Шаг 1. Инициализация. Задаются основные параметры метода пчелиного роя: количество агентов B, максимальное количество итераций Tmax, начальное количество агентов разведчиков Exstart, ограничение максимального количества агентов-разведчиков Exmax, ограничение шага поиска ?x, коэффициент F, б. Также задается функция f(x1, x2,…, xN), которую надо оптимизировать, количество переменных и интервалы значений переменных [x1min, x1max], [x2min, x2max],…, [xNmin, xNmax], в которых необходимо производить поиск. Также может задаваться пороговое значение функции f*.

Шаг 2. Запуск разведчиков. Разведчики случайным образом размешаются в пространстве поиска. При этом выбранные координаты являются целочисленными, а точки в пространстве поиска создаются таким образом, чтобы их координаты не совпадали,

, (2.5)

где xij - значение i-й координаты j-го агента; rand(ximin; ximax) - некоторое случайное целочисленное значение i-й координаты, выбранное из интервала [ximin; ximax].

Рисунок 2.1 - Схема поиска оптимума методом роя пчел

Рисунок 2.2 - Схема алгоритма

Шаг 3. Отправка занятых фуражиров. Занятые фуражиры прикреплены к определённым источникам ресурса. Начальное значение занятых фуражиров Be=0, поскольку в начале работы метода ещё нет источников ресурсов, за которыми могут быть закреплены занятые фуражиры.

Занятые фуражиры занимаются разработкой существующих источников ресурсов, т.е. в данной задаче занятые фуражиры выполняют локальное исследование областей, найденных разведчиками.

Занятые фуражиры перемещаются относительно своего текущего положения с заданным шагом ?x,

, (2.6)

где k - коэффициент, определяющий направление изменения значения координаты, k = ±1; ?x - заданный действительный шаг изменения координаты.

Шаг 4. Расчёт полезности пребывания в источнике. Полезность пребывания агента в источнике s на итерации t, при условии, что в этом источнике находится cs агентов (разведчиков и фуражиров), рассчитывается по формуле

, (2.7)

где Ex - текущее количество разведчиков (оно соответствует количеству источников); as - количество полезного вещества, вырабатываемое источником, в единицу времени.

Количество полезного вещества as в аспекте задачи многомерной оптимизации предлагается рассчитывать как обратное значение оптимизируемой функции

, (2.8)

где F - коэффициент, понижающий степень влияния рассчитанного значения функции; f(s) - значение функции в источнике s: f(s)=f(x1s,…, xNs)

Если количество агентов в данном источнике cs достигло своего порогового значения (cs> cmax), то агент помешается в близлежащую точку от точки s. Новое положение определяется путём изменения одной из координат текущего положения агента

, (2.9)

где xr - координата, которая меняется; r - случайным образом выбранный номер координаты для изменения; ? - заданный целочисленный шаг изменения координаты.

Шаг 5. Расчёт полезности полученного ресурса. Суммарная полезность фуражировки занятого фуражира или разведчика i рассчитывается по формуле

, (2.10)

где Fi(t) - полезность фуражировки i-го агента, wij(t)- шум в суммарной полезности.

Шум равномерно распределён в пределах (-wf;+ wf). Значение wf выбирается экспериментально (предлагается: wf=0.1). Минимальный порог полезности en выбирается экспериментально (предлагается: en=0.1); Jf(ui(t)) - полезность источника ui, в котором побывал i-й агент на итерации t. Полезность источника u оценивать функцией

, (2.11)

где u* - нормированное значение полезности пребывания в источнике, которое рассчитывается, исходя из минимальной и максимальной полезностей пребывания в источнике, полученных на протяжении всего времени моделирования.

Полезность незанятых фуражиров полагается равной нулю: Fi(t)=0.

Шаг 6. Выбор лучшего результата и проверка, достигается ли пороговое значение функции f*. Если достигается, тогда выполняется переход к шагу 10, в противном случае - переход к шагу 7.

Шаг 7. Моделирование выполнения танца, за счёт чего достигается обмен информацией. Каждый агент принимает решение выполнять или не выполнять танец. При этом вероятность выполнения виляющего танца i-м агентом на итерации t рассчитывается, исходя из выражения

, (2.12)

где в>0 - коэффициент, понижающий влияние преимущества пути на вероятность выполнения танца; Lif(t) - достоинство танца i-го агента на итерации t. Величина Lif(t) находится по формуле

, (2.13)

где (t) - среднее значение полезности всех источников; б - коэффициент, управляющий влиянием величины (t) на Lif(t).

Шаг 8. Выделение новых разведчиков и вербовка. Каждый незанятый фуражир может стать разведчиком или последовать за другим агентом.

Вероятность того, что незанятый фуражир станет разведчиком, рассчитывается по формуле

, (2.14)

где у - коэффициент, который необходим для моделирования поведения фуражировки; Lt(t) - сумма преимущества танцев разных агентов;

Кроме того, незанятый фуражир может быть подвергнут вербовке, т.е. последовать за i-м агентом. Вероятность того, что незанятый фуражир последует за i-м агентом, определяется выражением

(2.16)

Шаг 9. Увеличивается значение счётчика итераций: t=t+1. Если t < Tmax, то выполнить переход к шагу 2, в противном случае - переход к шагу 10.

Шаг 10. Останов.

2.5 Выводы

В исследовательской части дипломного проекта сделан обзор метода пчелиного роя, приведены бионические предпосылки метода, описан канонический метод пчелиного роя и представлена схема работы алгоритма.

Различные алгоритмы оптимизации обычно используют информацию о градиентах оптимизируемой функции. Метод пчелиного роя не использует данную информацию.

Одним из недостатков метода является множество входных параметров, от которых зачастую сильно зависит результат на выходе: количество пчел-разведчиков; количество пчел, отправляемых на выбранные, но не лучшие участки; количество пчел, отправляемые на лучшие участки; количество выбранных, но не лучших, участков; количество лучших участков; границы локального поиска. Значение этих параметров определяются классом функции, глобальный экстремум которой находится.

3 Конструкторская часть. Разработка программы, реализующей метод пчелиного роя

3.1 Обзор используемых программных платформ

3.1.1 Mathworks Matlab

Зарождение системы MATLAB относится к концу 70-х годов, когда первая версия этой системы была использована в Университете Нью-Мехико и Станфордском университете для преподавания курсов теории матриц, линейной алгебры и численного анализа. В это время активно разрабатывались пакеты прикладных программ по линейной алгебре LINPACK и EISPACK на языке FORTRAN, и авторы системы MATLAB искали способы использовать эти пакеты, не программируя на языке FORTRAN [15].

Сейчас возможности системы значительно превосходят возможности первоначальной версии матричной лаборатории Matrix Laboratory. Нынешний MATLAB - это высокоэффективный язык инженерных и научных вычислений. Он поддерживает математические вычисления, визуализацию научной графики и программирование с использованием легко осваиваемого операционного окружения, когда задачи и их решения могут быть представлены в нотации, близкой к математической. Наиболее известные области применения системы MATLAB:

· математика и вычисления;

· разработка алгоритмов;

· вычислительный эксперимент, имитационное моделирование, макетирование;

· анализ данных, исследование и визуализация результатов;

· научная и инженерная графика;

· разработка приложений, включая графический интерфейс пользователя.

MATLAB - это интерактивная система, основным объектом которой является массив, для которого не требуется указывать размерность явно. Это позволяет решать многие вычислительные задачи, связанные с векторно-матричными формулировками, существенно сокращая время, которое понадобилось бы для программирования на скалярных языках типа C или FORTRAN.

Система MATLAB состоит из пяти следующих основных частей.

· Язык MATLAB. Это язык матриц и массивов высокого уровня с управлением потоками, функциями, структурами данных, вводом-выводом и особенностями объектно-ориентированного программирования.

· Среда MATLAB. Это набор инструментов и приспособлений, с которыми работает пользователь или программист MATLAB. Она включает в себя средства для управления переменными в рабочем пространстве MATLAB, вводом и выводом данных, а также создания, контроля и отладки М-файлов и приложений MATLAB.

· Управляемая графика. Это графическая система MATLAB, которая включает в себя команды высокого уровня для визуализации двух- и трехмерных данных, обработки изображений, анимации и иллюстрированной графики. Она также включает в себя команды низкого уровня, позволяющие полностью редактировать внешний вид графики, также как при создании Графического Пользовательского Интерфейса (GUI) для MATLAB приложений.

· Библиотека математических функций. Это обширная коллекция вычислительных алгоритмов от элементарных функций, таких как сумма, синус, косинус, комплексная арифметика, до более сложных, таких как, обращение матриц, нахождение собственных значений, функции Бесселя, быстрое преобразование Фурье.

· Программный интерфейс. Это библиотека, которая позволяет писать программы на Си и Фортране, которые взаимодействуют с MATLAB. Она включает средства для вызова программ из MATLAB (динамическая связь), вызывая MATLAB как вычислительный инструмент и для чтения-записи МАТ-файлов.

В MATLAB важная роль отводится специализированным группам программ, называемым toolboxes. Они очень важны для большинства пользователей, так как позволяют изучать и применять специализированные методы. Toolboxes - это всесторонняя коллекция функций MATLAB (M-файлов), которые позволяют решать частые классы задач.

3.1.2 Python

Разработка языка Python была начата в конце 1980-х годов сотрудником голландского института CWI Гвидо ван Россумом.

Python -- высокоуровневый язык программирования общего назначения с акцентом на производительность разработчика и читаемость кода. Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой объём полезных функций [16].

Python поддерживает несколько парадигм программирования, в том числе структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное. Основные архитектурные черты -- динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений и удобные высокоуровневые структуры данных. Код в Питоне организовывается в функции и классы, которые могут объединяться в модули (которые в свою очередь могут быть объединены в пакеты).

Эталонной реализацией Python является интерпретатор CPython, поддерживающий большинство активно используемых платформ. Он распространяется свободно под очень либеральной лицензией, позволяющей использовать его без ограничений в любых приложениях.

Python -- активно развивающийся язык программирования, новые версии (с добавлением/изменением языковых свойств) выходят примерно раз в два с половиной года.

Модуль расширения Psyco может встраиваться в самые недра интерпретатора Python и выборочно заменять части интерпретируемого байткода Python оптимизированным машинным кодом. Psyco работает исключительно во время исполнения Python. Другими словами, исходный код Python транслируется командой python в байткод. Пока интерпретатор Python выполняет приложение, Psyco иногда делает проверки, чтобы выяснить, может ли он заменить обычные операции байткода Python на некоторый обработанный машинный код. Эта обрабатываемая трансляция не только очень похожа на то, что делает компиляция по месту (just-in-time compilers) Java, но и зависит от архитектуры. В настоящее время, Psyco доступен только для архитектур с процессором i386. Прелесть Psyco заключается в том, что вы можете использовать тот же самый код Python, который вы писали всё это время, но исполнять его быстрее [16].

Модуль расширения Numpy. Поскольку Python интерпретируемый язык, математические алгоритмы часто работают в нём гораздо медленнее чем в компилируемых языках, таких как C или даже Java. NumPy пытается решить эту проблему для большого количества вычислительных алгоритмов обеспечивая поддержку многомерных массивов и множество функций и операторов для работы с ними. Таким образом любой алгоритм который может быть выражен в основном как последовательность операций над массивами и матрицами работает также быстро как эквивалентный код написанный на C.

NumPy основан на двух более ранних пакетах для Python. Сначала был Numeric, вполне стабильный и полный, доступный по сей день, но устаревший. Он был написан в 1995 году программистом Jim Hugunin при участии многих людей, среди которых Jim Fulton, David Ascher, Paul DuBois, и Konrad Hinsen. Более новая версия под названием Numarray это полностью переписанный Numeric который теперь тоже не рекомендуется к использованию NumPy объединяет в себе эти два пакета, он построен на базовом коде Numeric и дополнен возможностями Numarray [16].

Некоторые рассматривают NumPy как хорошую свободную альтернативу MATLAB, поскольку язык программирования MATLAB внешне напоминает NumPy: оба они интерпретируемые, и оба позволяют пользователям писать быстрые программы пока большинство операций производятся над массивами или матрицами, а не над скалярами. Преимущество MATLAB в большом количестве доступных дополнительных тулбоксов, включая такие как пакет Simulink. Основные пакеты дополняющие NumPy это: SciPy - библиотека добавляющая больше MATLAB-подобной функциональности; Matplotlib - пакет для создания графики в стиле MATLAB. Внутренне как MATLAB так и NumPy основаны на библиотеке решателей основных задач линейной алгебры LAPACK.

3.2 Разработка структуры программы

1) pybee.py - основные классы, реализующие алгоритм роя пчел;

2) beetest.py - основной модуль примера, в котором содержатся все параметры алгоритма;

3) beeexamples.py - в этом модуле содержится класс пчел для целевой функции;

4) beetestfunc.py - вспомогательные функции для визуализации процесса расчета.

В модуле pybee содержатся следующие классы:

1) floatbee - базовый класс для пчел, положение которых описывается числами с плавающей точкой;

2) hive - класс улея, внутри которого и происходят основные действия алгоритма по выделению лучших и выбранных участков, а также отправка пчел на нужные позиции;

3) statistic - вспомогательный класс для сбора статистики по сходимости алгоритма роя пчел. Этот класс накапливает лучшие результаты для каждого шага итерации.

В модуле beetest задаются варьируемые параметры алгоритма:

1) количество пчел-разведчиков scoutbeecount;

2) количество пчел, отправляемых на выбранные, но не лучшие участки selectedbeecount;

3) количество пчел, отправляемые на лучшие участки bestbeecount;

4) количество выбранных, но не лучших, участков selsitescount;

5) количество лучших участков bestsitescount;

6) максимальное количество итераций maxiteration;

7)количество итераций, при котором, если не было найдено более лучшее решение происходит останов алгоритма max_func_counter.

В модуле beeexamples задаются область поиска максимума функции и диапазон локального поиска.

3.3 Разработка программы

3.3.1 Класс floatbee

Это базовый класс, от которого необходимо наследоваться и переопределить один метод, также в конструкторе нужно определить некоторые объекты. А именно: self.position, self.minval, self.maxval.

Эти переменные должны быть типа список (или массив) и содержать столько элементов, сколько аргументов имеет целевая функция, которую необходимо оптимизировать.

self.position хранит в себе одно решение, которое сопоставлено с данной пчелой. В конструкторе рекомендуется заполнять этот список случайными величинами.

self.minval и self.maxval хранят списки, содержащие соответственно минимальные и максимальные значения для координат из self.position.

Допустим, что положение определяется двумя координатами, причем первая координата может изменяться в пределах [-1; 1], а вторая в пределах [-11; 12]. Тогда заполнение этих выглядит следующим образом:

self.minval = [-1.0, -11.0]

self.maxval = [1.0, 12.0]

self.position = [random.uniform (self.minval[n], self.maxval[n]) for n in range(2)]

Таким образом, размеры списков self.position, self.minval и self.maxval всегда должны совпадать.

После заполнение списков, необходимо перегрузить метод def calcfitness (self).

Именно в нем рассчитывается целевая функция. Следует особо отметить, что само значение целевой функции не возвращается из этого метода, а присваивается внутри метода переменной self.fitness. Сам метод ничего не возвращает.

Это сделано для того, чтобы целевая функция считалась только один раз при изменении координат пчелы. Причем метод calcfitness() должен быть обязательно выполнен после любых перемещений пчелы.

Рассмотрим пример. Пусть целевая функция имеет вид:

Тогда метод calcfitness()выглядит следующим образом:

class mybee (pybee.floatbee):

def calcfitness (self):

self.fitness = 0.0

for val in self.position:

self.fitness -= val * val

Соответственно, конструктор будет выглядеть следующим образом:

class mybee (pybee.floatbee):

def __init__ (self):

self.minval = [-1.0, -11.0]

self.maxval = [1.0, 12.0]

self.position = [random.uniform (self.minval[n], self.maxval[n]) for n in range(2) ]

self.calcfitness()

3.3.2 Класс hive

Основные шаги алгоритма роя пчел реализованы внутри класса hive(улей).

Рассмотрим параметры конструктора.

class hive:

def __init__ (self, scoutbeecount, selectedbeecount, bestbeecount, selsitescount, bestsitescount, range_list, beetype):

В конструктор передаются следующие параметры:

1) scoutbeecount - количество пчел-разведчиков.

2) selectedbeecount - количество пчел, посылаемых на каждый из выбранных (не лучших) участков. Сколько пчел отправляется на один участок.

3) bestbeecount - количество пчел, посылаемых на каждый из лучших участков.

4) selsitescount - количество выбранных перспективных участков.

5) bestsitescount - количество лучших участков.

6) range_list - список, элементы которого определяют размеры выбранных и лучших участков по каждой координате.

7) beetype - класс пчел, производный от floatbee, который используется в алгоритме.

Параметр range_list представляет собой список размеров областей, куда отправляются пчелы. Его роль в алгоритме продемонстрируем на примере.

Пусть положение участков определяется двумя координатами (целевая функция имеет два параметра), тогда список (или массив) range_list имеет два элемента. Пусть это будут [1,0; 2,0].

Это значит, что при отправке пчелы в область какой-то точки (x;y), значение ее первой координаты будет случайным образом выбрано из интервала [x-1,0; x+1,0], а значение второй координаты - [y-2,0; y+2,0]. То есть, если мы отправим пчелу в область точки (10,0; 20,0), то в реальности получим координаты, которые будут лежать в пределах от 9,0 до 11,0 для первой координаты и от 18,0 до 22,0 для второй.

Для отправки пчелы в окрестность точки в классе floatbee есть метод def goto (self, otherpos, range_list)в котором

otherpos - точка, в окрестность которой посылается пчела,

range_list - тот же самый список размеров окрестностей.

Конструктор класса hive.

class hive:

def __init__ (self, scoutbeecount, selectedbeecount, bestbeecount, \

selsitescount, bestsitescount, \

range_list, beetype):

self.scoutbeecount = scoutbeecount

self.selectedbeecount = selectedbeecount

self.bestbeecount = bestbeecount

self.selsitescount = selsitescount

self.bestsitescount = bestsitescount

self.beetype = beetype

self.range = range_list

self.bestposition = None

self.bestfitness = -1.0e9

beecount = scoutbeecount + selectedbeecount * selsitescount + bestbeecount * bestsitescount

self.swarm = [beetype() for n in xrange (beecount)]

self.bestsites = []

self.selsites = []

self.swarm.sort (floatbee.sort, reverse = True)

self.bestposition = self.swarm[0].getposition()

self.bestfitness = self.swarm[0].fitness

В нем сохраняются все передаваемые параметры. А также создается переменная self.bestposition, которая хранит в себе лучшее на данный момент решение.

Значение целевой функции для лучшего на данный момент решения хранится в переменной self.bestfitness.

Затем создается рой пчел. Общее количество пчел в нем равно

beecount = scoutbeecount + selectedbeecount * selsitescount + bestbeecount * bestsitescount

Затем заполняется список переменной self.swarm (рой):

self.swarm = [beetype() for n in xrange (beecount)]

В конструкторе все параметры пчелы должны инициализироваться случайным образом, поэтому получается, что при создании роя пчел, все они выступают в роли пчел-разведчиков, которых отправляют на случайные точки. С точки зрения алгоритма это не обязательно должно быть так. Можно в первый раз отправить только заданное количество пчел-разведчиков, а пчел, предназначенных для лучших и выбранных участков, отправлять на следующих итерациях. Но в данном случае в самом начале на случайные места отправляются все пчелы, участвующие в алгоритме.

После того как рой создан, он сортируется по убыванию целевой функции у каждой пчелы. В качестве функции сравнения передается метод sort() из класса floatbee.

После сортировки лучшим будет решение у пчелы, находящейся в самом начале списка. Значение целевой функции для данной пчелы сохраняется в переменной self.bestfitness, а в переменной self.bestposition сохраняется копия координат лучшей пчелы. Для получения копии координат используется метод getposition() из класса floatbee:

class floatbee:

def getposition (self):

return [val for val in self.position]

Для выполнения одной итерации алгоритма роя пчел необходимо из экземпляра класса hive вызвать метод def nextstep (self).

Метод def nextstep (self)состоит из двух логических этапов. Сначала выбираются лучшие и выбранные участки. Выбор лучших участков происходит следующим образом:

class hive:

def nextstep (self):

self.bestsites = [ self.swarm[0] ]

curr_index = 1

for currbee in self.swarm [curr_index: -1]:

if currbee.otherpatch (self.bestsites, self.range):

self.bestsites.append (currbee)

if len (self.bestsites) == self.bestsitescount:

break

curr_index += 1

Пчелы, нашедшие лучшие участки помещаются в список self.bestsites. Туда помещается пчела, находящаяся в начале списка, а затем происходит перебор остальных пчел до тех пор пока не будет отобрано нужное количество. Причем пропускаются пчелы, которые находятся в одном участке с пчелой, которая уже находится в списке self.bestsites. Переменная curr_index хранит номер пчелы в списке, которая проверятся следующей.

Проверка того является ли участок, найденный пчелой новым или какая-то пчела уже находится поблизости, происходит внутри метода otherpatch() класса floatbee.:

class floatbee:

def otherpatch (self, bee_list, range_list):

if len (bee_list) == 0:

return True

for curr_bee in bee_list:

position = curr_bee.getposition()

for n in xrange ( len (self.position) ):

if abs (self.position[n] - position[n]) > range_list[n]:

return True

return False

В данном случае в качестве bee_list передается список лучших пчел self.bestsites, а в качестве range_list все тот же список размеров окрестностей. Участок, найденный пчелой, считается новым, если в списке bee_list нет пчелы, расстояние до которой по каждой из координат не превышает соответствующего размера из range_list.

После нахождения лучших участков аналогично выделяем выбранные участки:

class hive:

def nextstep (self):

self.selsites = []

for currbee in self.swarm [curr_index: -1]:

if currbee.otherpatch (self.bestsites, self.range) and currbee.otherpatch (self.selsites, self.range):

self.selsites.append (currbee)

if len (self.selsites) == self.selsitescount:

break

Пчелы с выбранных участков сохраняются в список self.selsites.

Затем, отправляем пчел на соответствующие позиции:

class hive:

def nextstep (self):

bee_index = 1

for best_bee in self.bestsites:

bee_index = self.sendbees (best_bee.getposition(), bee_index, self.bestbeecount)

for sel_bee in self.selsites:

bee_index = self.sendbees (sel_bee.getposition(), bee_index, self.selectedbeecount)

for curr_bee in self.swarm[bee_index: -1]:

curr_bee.gotorandom()

self.swarm.sort (floatbee.sort, reverse = True)

self.bestposition = self.swarm[0].getposition()

self.bestfitness = self.swarm[0].fitness

За отправку пчел отвечает метод sendbees() класса hive. Внутри метода sendbees() вызывается метод goto() класса floatbee:

class floatbee:

def goto (self, otherpos, range_list):

self.position = [otherpos[n] + random.uniform (-range_list[n], range_list[n]) \for n in xrange (len (otherpos) ) ]

self.checkposition()

self.calcfitness()

Здесь заполняется список новых координат, которые складываются из точки, в которую отправляют пчелу и случайной величины в интервале от -range_list[n] до range_list[n].

Затем вызывается метод checkposition(), который корректирует координаты, если они выходят за заданные пределы (minval и maxval)

class floatbee:

def checkposition (self):

for n in range ( len (self.position) ):

if self.position[n] < self.minval[n]:

self.position[n] = self.minval[n]

elif self.position[n] > self.maxval[n]:

self.position[n] = self.maxval[n]

После того как были отправлены пчелы на лучшие и выбранные места, оставшихся пчел из улея отправляем на случайные координаты. Затем все пчелы опять сортируются по убыванию целевой функции и сохраняются лучшие позиции и лучшее значение целевой функции.

Метод nextstep() вызывается пользователем до тех пор, пока не будет выполнено одно из условий останова.

3.3.3 Класс statistic

В модуле pybee есть еще один класс, который не используется в алгоритме непосредственно, но который может помочь в отладке и визуализации результатов. Это класс statistic, который сохраняет найденное решение для каждого шага итерации. Причем, один экземпляр класса statistic можно использовать для нескольких независимых запусков алгоритма. Это может понадобиться для того, чтобы посмотреть, например, как сходятся параметры при усреднении по нескольким запускам.

Рассмотрим конструктор класса statistic.

class statistic:

def __init__ (self):

self.fitness = []

self.positions = []

self.range = []

В классе содержатся три списка, которые хранят значения целевой функции, координат и размеров областей. Хранятся значения следующим образом. self.positions хранит список, первый индекс которого обозначает номер запуска алгоритма. Внутри каждого элемента хранится список, каждый элемент которого обозначает номер итерации алгоритма. А внутри этого второго списка хранится список координат, лучших на данную итерацию. То есть, чтобы получить k-ую координату, которая была при m-ой итерации при n-ом запуске алгоритма, необходимо написать следующее выражение stat.positions[n][m][k].

Аналогично со списком range.

Для каждой итерации алгоритма (после каждого вызова метода nextstep() класса hive) необходимо вызвывать метод add(), который добавляет результат в статистику: def add (self, runnumber, currhive).

3.4 Выводы

В конструкторской части работы был произведен обзор, выбранных программных платформ, разработана и приведена структура программы, а также описана программная реализация метода пчелиного роя.

Для разработки программного обеспечения была выбрана среда программирования Python. Интерпретатор распространяется свободно, что позволяет использовать его без ограничений. Для ускорения вычислений и работы с массивами и матрицами в работе используются модули расширения Psyco и Numpy соответственно.

Размер исходного кода программы составляет около 450 строк.

4 Технологическая часть. Тестирование и исследование эффективности программного обеспечения.

4.1 Тестирование программы

4.1.1 Параметры тестовой функции

В данной работе для тестирования алгоритма использовалась двумерная функция Шекеля (Shekel) [17]

Параметры функции:

С =(1;2;2), A = , X=[0;20], Y =[0;20].

При заданных параметрах функция достигает своего максимума в точке [2;10]: f(2;10)=1.01439037.

Таким образом, функция имеет вид (рисунок 4.1)

4.1.2 Пример работы алгоритма

Зададим следующие параметры алгоритма:

· количество пчел-разведчиков scoutbeecount=7;

· количество пчел, отправляемых на выбранные, но не лучшие участки selectedbeecount=4;

· количество пчел, отправляемые на лучшие участки bestbeecount=7;

· количество выбранных, но не лучших, участков selsitescount=3;

· количество лучших участков bestsitescount=2;

· максимальное количество итераций maxiteration=100;

Рисунок 4.1 - Функция Шекеля

· область поиска максимума функции ограничим параметрами: x5[0;20], y5[0;20];

· локальный поиск будем осуществлять в диапазоне x5[x-1;x+1], y5[y-1;y+1].

Расположение агентов в зависимости от номера итерации представлены на рисунках 4.2-4.4.

График зависимости найденного значения целевой функции в зависимости от номера итерации I представлен на рисунке 4.5. Найденное значение целевой функции стремится к значению глобального максимума.

Усредненный график зависимости найденного значения целевой функции в зависимости от номера итерации I по 10 запускам алгоритма (т.е. алгоритм запускался 10 раз с различными начальными положениями пчел-разведчиков) с одинаковыми варьируемыми параметрами представлен на рисунке 4.6.

График изменения координат лучшего найденного решения в зависимости от номера итерации I представлен на рисунке 4.7.

Рисунок 4.2 - Распределение агентов: итерация №1

Рисунок 4.3 - Распределение агентов: итерация №4

Рисунок 4.4 - Распределение агентов: итерация №17

Рисунок 4.5 - Значение целевой функции

Рисунок 4.6 - Значение целевой функции

Рисунок 4.7 - Значение координат

4.1.3 Выводы

Тестирование программного обеспечения, реализующего метод пчелиного роя, подтвердило работоспособность алгоритма и правильную его реализацию. В результате тестирования была показана сходимость алгоритма к глобальному максимуму на функции Шекеле при заданных входных параметрах алгоритма.

4.2 Исследование эффективности алгоритма и программного обеспечения

Исследование эффективности алгоритма и программного обеспечения выполнено на 3-х тестовых функциях из пакета CES (Congress of Evolutionary Computing): функции Розенброка, функции Химмельблау, функции Растригина [17].

При исследовании варьировались следующие параметры: количество пчел-разведчиков, границы локального поиска, количество итераций, за которое найденное решение не улучшилось (критерий останова).

4.2.1 Функция Розенброка

Функция Розенброка (Rosenbrock) (рисунок 4.8)

(4.1)

Значение глобального минимума функции Розенброка достигается в точке [1;1] и равно нулю: .

Рисунок 4.8 -Функция Розенброка (Rosenbrock)

Варьирование количества пчел-разведчиков

Фиксируемые параметры:

· количество пчел, отправляемых на выбранные, но не лучшие участки selectedbeecount=4;

· количество пчел, отправляемые на лучшие участки bestbeecount=7;

· количество выбранных, но не лучших, участков selsitescount=3;

· количество лучших участков bestsitescount=2;

· максимальное количество итераций maxiteration=500;

· количество итераций, при котором, если не было найдено более лучшее решение происходит останов алгоритма max_func_counter=20;

· область поиска максимума функции Розенброка ограничим параметрами: x5[-5;5], y5[-5;5];

· локальный поиск будем осуществлять в диапазоне x5[x-0,2;x+0,2], y5[y-0,2;y+0,2].

Проводилось по 30 запусков алгоритма с различным количеством пчел-разведчиков, а именно: 1, 2, 4, 8, 16, 32. Значения полученных координат и целевой функции, а также числа итераций представлены в Приложении 1. Диаграммы зависимостей числа итераций и значения погрешности найденной целевой функции от количества пчел-разведчиков представлены на рисунках 4.9 и 4.10 соответственно.

При увеличении количества пчел-разведчиков число итераций алгоритма уменьшается, а точность найденного решения увеличивается.

Варьирование размера области локального поиска

Фиксируемые параметры:

· количество пчел-разведчиков scoutbeecount=16;

· количество пчел, отправляемых на выбранные, но не лучшие участки selectedbeecount=4;

· количество пчел, отправляемые на лучшие участки bestbeecount=7;

· количество выбранных, но не лучших, участков selsitescount=3;

· количество лучших участков bestsitescount=2;

· максимальное количество итераций maxiteration=500;

· количество итераций, при котором, если не было найдено более лучшее решение происходит останов алгоритма max_func_counter=20;

Рисунок 4.9 - Зависимость усредненного числа итераций от количеств пчел-разведчиков

Рисунок 4.10 - Зависимость усредненного значения погрешности найденного решения от количества пчел-разведчиков

· область поиска максимума функции Розенброка ограничим параметрами: x5[-5;5], y5[-5;5].

Проводилось по 30 запусков алгоритма с различными диапазонами локального поиска x5[x-Д;x+Д], y5[y-Д;y+Д]: Д={0,1; 0,2; 0,5; 1,0}. Значения полученных координат и целевой функции, а также число итераций на которых завершался алгоритм представлены в Прилложении 2. Диаграммы зависимостей числа итераций и погрешности найденной целевой функции от размера области локального поиска представлены на рисунках 4.11 и 4.12 соответственно.

При уменьшении границ локального поиска точность найденного значения целевой функции увеличивается, но при этом растет число итераций алгоритма.

Рисунок 4.11 -Зависимость усредненного значения числа итераций от размера области локального поиска

Варьирование количества итераций

Фиксируемые параметры:

· количество пчел-разведчиков scoutbeecount=16;

Рисунок 4.11 -Зависимость усредненного значения погрешности найденного решения от размера области локального поиска

· количество пчел, отправляемые на лучшие участки bestbeecount=7;

· количество выбранных, но не лучших, участков selsitescount=3;

· количество лучших участков bestsitescount=2;

· максимальное количество итераций maxiteration=500;

· область поиска максимума функции Розенброка ограничим параметрами: x?[-5;5], y?[-5;5];

· локальный поиск будем осуществлять в диапазоне x?[x-0,2;x+0,2], y?[y-0,2;y+0,2].

Проводилось по 30 запусков алгоритма с различными значениями количества итераций, за которые не найдено более хорошего решения: 5, 10, 20, 50. Значения полученных координат и целевой функции, а также числа итераций представлены в Приложении 3. Диаграммы зависимостей числа итераций и погрешности найденной целевой функции от значения критерия останова (количество итераций без улучшений) представлены на рисунках 4.13 и 4.14 соответственно.

С увеличением значения критерия останова погрешность найденного значения функции уменьшается, но при этом растет число итераций алгоритма.


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.