Исследование алгоритма оптимизации

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

Рубрика Экономико-математическое моделирование
Вид курсовая работа
Язык русский
Дата добавления 24.06.2012
Размер файла 373,3 K

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

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

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

Содержание

Введение

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

2. Алгоритм оптимизации

2.1 Описание алгоритма оптимизации

2.2 Теоретическая оценка трудоемкости алгоритма оптимизации

3. Экспериментальное исследование средней трудоемкости алгоритма

Заключение

Список использованных источников

Приложение А

Введение

В настоящее время все более актуальными становятся задачи оптимизации, поиска, реализации распределенных и (или) параллельных систем. Многие из них легко реализуемы простыми классическими методами, но некоторые задачи требуют к себе особого подхода. Эти задачи либо не разрешимы простыми методами, либо их решение потребует значительного времени и объема ресурсов. Для решения подобного рода задач существуют особые методы и алгоритмы.

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

Целью выполнения данной работы является описание алгоритма культурного обмена и проведение экспериментального исследования средней трудоемкости алгоритма случайного поиска версии 3.20.

К работе прилагаются три приложения А, Б и В. В них приведены данные эксперимента в виде таблиц, а также графики зависимости функции качества(Fэ) от генотипа(N).

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

В пункте 2 - приведено описание алгоритма TS, а также примеры использования его для решения ряда проблем оптимизации.

В пункте 3 - проведено экспериментальное исследование средней трудоемкости алгоритма.

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

Дан алгоритм оптимизации функций рациональных переменных - алгоритм культурного обмена (КО). КО имеет следующие фиксированные параметры:

- способ кодирования решения в генотипе: двоичное представление параметра, точность представления параметра (аргумента) функции принимается, если не задана для функции специально, равной  = 0.01;

- длина генотипа: определяется способом кодирования решения.

- размер популяции: 120 индивидуумов;

- доля родителей от размера популяции: 1.0, т.е. количество родителей, участвующих в кроссовере равно 120.

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

- мутация: применяется к каждому новому индивидууму, к каждому гену.

- отбор в следующее поколение: элитный отбор.

Необходимо провести экспериментальное исследование средней трудоемкости алгоритма

2. Алгоритм оптимизации

2.1 Описание алгоритма оптимизации

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

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

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

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

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

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

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

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

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

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

Признание Функция культуры Алгоритм - все люди используются для обновления ограничений знаний культурныхх алгоритмов. Похожие рейтинг 20% (видный человек) являются использование используются методы обновления от нормативного знания использовать помехи для корректировки правил активных клеток. Недостатки Сообщение осуществимо протокола и невозможно Алгоритм полу-возможные общие черты Подходит Проблемы адаптации иерархическая структура, основанная на вышеупомянутое сообщение Протоколы сплит полу-возможно клеток на более мелкие ячейки, когда число вложении Другие лица становится слишком высокой Будущие направления слиянии невозможно детей в первоначальном родителей;

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

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

Вариации культуры Алгоритм - генетических алгоритмов. Похожие методы англ. и космической руководствуясь генетические алгоритмы (VGA)

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

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

Рисунок 1.Алгоритм культурного обмена.

2.1.2 Основные идеи алгоритма культурного обмена

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

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

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

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

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

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

Скопление интеллекта (СИ) является вычислительная техника разветки с участием исследования коллективного поведения в децентрализованных системах.

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

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

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

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

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

Каждая группа людей, неизбежно приходит на целый ряд общих ценностей, верований, моды, анекдоты, страхи, сексуальные привычки, ненависти и т.д. Это достигается путем смешивания стилей и мнений среди членов группы, чистка группу лиц с нежелательных признаков, или определенное сочетание обоих тактику. Этот процесс достигнет критической массы, когда некоторые из этих общих признаков, достаточно укоренились в жизни группы, о том, что группа начинает ritualistically распространять эти общие черты его молодым. На данный момент трансцендентного, сбор общих черт становится алгоритм для создания новых членов группы и могут быть надлежащим образом помечены как "культура". Наша культура заражает нас через различные стадии инкубации (например, туалет подготовки, Girl Guides, и среднюю школу) до тех пор, пока каждый из нас становится уникальным переросли итерации нашей культуры Алгоритм, содержащие выражения, и такие понятия, как врожденное человека, стук танцы, реальность ТВ, а другие в разной пропорции. Как только это будет завершено, мы становимся reseeded сумму, которая в то подключено к следующей итерации инициирует культурные (то есть наших детей). Культура, таким образом, передает в двух разных векторов. Очевидно, она распространяется биологически, расширяется в геометрической прогрессии за счет окружающей среды, постоянно растет. Не менее важно, однако, она распространяется психо-духовно, расширяя н-dimensionally в каждой новой итерации смесей и пересекается с существующим веб-итераций из прошлых и нынешних умов - подобно галактике зеркал превратилась сталкиваться друг с другом. Как указывалось выше, тем ниже.

Как уже говорилось, элементы нашей культуры алгоритма куски знания важное значение группы; важно, чтобы ingrain в последующих поколениях. Мы обучаем детей, такие, как полезно infobits "Все вороны черные", "собаки приятно питомец" и "Играть хорошо с другими детьми". Эти семена справочных данных, чтобы помочь новой человеческой понять, плавание, и манипулировать его или ее окружающей среды. Несмотря на свою полезность, разумный человек не ожидает этих nuggets истины быть абсолютным, вечным и нерушимым. В реальном мире некоторые вороны имеют пятна, некоторые собаки кусают, а некоторые дети jerks, которые хотят принять наши деньги молока. Связаны ли эти факты жизни отрицать информативное значение этих семян? Абсолютно нет. Дети, которые являются жизнеспособными культурных инициирует не вдаваться apoplectic подходит Увидев ворона с белыми перьями, больше, чем они покинут свои руки в рот собаки на продолжение жевания или сидеть contently виду бабочек, хотя игровая запугивать ударов смол из них. В конечном счете, даже культурной алгоритм является лишь планом: идеального взаимопонимания по умолчанию группа в мире и себя. Он карт из грубой формы, но и мелкие детали можно только опытным путем, непосредственно жизни, дыхание человеку. Мы похожи на путешественников в странный город, оснащенных изношенные-от карту, как мы берем знаний и подготовки кадров культуры инфицированных нам и спотыкаются на основе существования как мы можем лучше. Как мы выяснили, больше данных подается обратно в культуру и алгоритм получает обновляться по мере потребности, но почему-то всегда представляется более мы не знаем…

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

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

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

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

2.1.3 Эффективность итерационных методов решения

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

Эффективные вычисления. На каждом шаге итерационного процесса решения должны быть оценены многими способами. Важно выполнять эти вычисления эффективным способом.

Следовательно,

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

Характерные функции, которые используются следующие:

Приводим к:

1.g01

2.g04

Функцию

Приводим к:

3.g08

Функцию

Приводим к:

4.g12

Раскрываем:

И приводим к:

где и

Таблица 1:Сравнивая результаты для тестовых функций. Наши приближения наз. САЕР(Cultural Algorithm with Evolutionary Programming).

Также ещё проводились исследование метода

Пусть нам дана функция

1

Проведём вычисления и сравним их с нулём

2

3

4

Таблица 2:Результаты для тестовых фунций

Интенсификация поиска. Чтобы углубить поиск в перспективных областях, мы должны возвратиться к одному из уже найденных лучшему решению. Тогда размер списка запретов может быть просто сокращен для «малого» числа итераций. В некоторых случаях могут быть использованы более сложные методики. Некоторые проблемы оптимизации могут быть разделены на подпроблемы.

Решение этих подпроблем оптимально и объединение частных решений приводит к оптимальному решению. Трудность такой стратегии, очевидно, состоит в нахождении хорошего разделения. Как упомянуто ранее, для основы, связанной с вычислительным временем, быстрые эвристики и окрестность рационального размера используется на каждом шаге TS. Методы по углублению поиска используют или более продуманные эвристики или методы строгого сглаживания или расширенную окрестность. Также возможно выполнить интенсификацию, основанную на долгосрочной памяти. Каждое решение или перемещение может быть характеризовано набором компонентов. Компоненты «хороших» перемещений или «хороших» решений запоминаются. В течении фазы интенсификации решения и перемещения оцениваются принятым во внимание количеством «хороших» компонентов. Эта долгосрочная память может быть рассмотрена, как своего рода процесс обучения.

3. Экспериментальное исследование средней трудоемкости алгоритма

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

Подготовка данных модели для эксперимента сводится к формированию XML файла с параметрами модели, при этом используется приложение Experiment Designer. Для принятых значений точности представления параметров функции качества проводится исследование алгоритма. Для проведения эксперимента используется модель ModelGAProfiled.exe.

Проведение замера количества циклов, выполняемых процессором, для прогона модели, будет производиться с использованием программного обеспечения Performance Analysis, входящего в состав Compuware DevParthner Studio. Для статистической значимости результатов, проводится 10 параллельных опытов. Т.е. при тех же параметрах модели производится повторный запуск программы 10 раз. Получаемые значения kij заносятся в таблицу. Для статистического анализа будет использоваться ПО STATISTICA 6.0.

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

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

Полученные данные представлены в Приложении А.

Для исключения времени, затрачиваемого на вычисления функции качества, выносится значение qij. Полученные данные представлены в Приложении Б.

По результатам экспериментов строятся графики экспериментальной оценки трудоемкости алгоритма. Данные находятся в приложении В.

Все эксперименты производились на компьютере со следующей конфигурацией: Intel(R) Pentium(R)4 (2,4 Ггц), 512 Mb DDR SDRAM, Windows XP Professional Service Pack 2.

Приложение А

Текст программы:

#include <math.h>

#include <stdio.h>

#include <stdlib.h>

#include <values.h>

#include <time.h>

#include <sys/timeb.h>

#include "randfunc.h"

/* Дайте название файлу */

#include "probl01.h"

#define TRUSSPROBL 1

/* Дайте соответствующее два параметра. */

/* Выберите размер */

#define TAMPOBL 20

#define TOP 2

#define SEMIFACTIBLE 1

#define FACTIBLE 2

#define DESCONOCIDA 3

#define NO_FACTIBLE 4

/*Введите соответсвующие функции. */

void violacionInic(float *);

void violacion(struct individuo *, float *);

void creenciasInic(struct creencias *);

void poblacionInic(struct individuo *, struct creencias *);

void actualizaCreencias(struct individuo *, struct creencias *, int);

void expande(struct celda *, struct individuo *, struct creencias *);

void aceptar(struct individuo *);

int compAptitud(const void *, const void *);

void generarHijos(struct individuo *, struct creencias *);

void mueve(int, int, float, struct individuo *, struct creencias *);

struct celda *cercana(int, struct celda *);

struct celda *busca(int, struct celda *);

void selecciona(struct individuo *);

int compVictorias(const void *, const void *);

void nuevoInd(struct individuo *);

void extremos(int *, int *, struct individuo *);

float media;

/* объявите структуру*/

char *tzstr = "TZ=PST8PDT";

struct timeb tiempo1, tiempo2;

int diferencia;

main(int argc, char **argv) {

int i, j, indmin, indmax, Gmax;

float semilla;

float gmax[NUMCONSTR];

char cadena[25];

long evs = 0;

FILE *a;

struct creencias espcreencias;

struct individuo pobl[2*TAMPOBL + 3];

if (argc == 4) {

Gmax = atoi(argv[1]);

semilla = atof(argv[2]);

strcpy(cadena, argv[3]);

}

else {

printf("Teclee el nъmero mбximo de generaciones: ");

scanf("%d", &Gmax);

printf("Teclee la semilla de aleatorios (0..1): ");

scanf("%f", &semilla);

printf("Teclee el nombre del archivo de salida: ");

scanf("%s", cadena);

}

if ( (a = fopen(cadena, "w")) == NULL ) {

printf("Error al abrir el archivo de salida.\n");

return (1);

}

fprintf(a, "Nъmero mбximo de generaciones: %d\n", Gmax);

fprintf(a, "Semilla de aleatorios %f\n\n", semilla);

putenv(tzstr);

tzset();

diferencia = 0;

randomizef(semilla);

initrandomnormaldeviate();

violacionInic(gmax);

creenciasInic(&espcreencias);

poblacionInic(pobl, &espcreencias);

for (i = 0; i < TAMPOBL; i++) {

evalua(&(pobl[i]), 0, 0, 0);

violacion(&(pobl[i]), gmax);

evs++;

}

for (j = 0; j < Gmax; j++) {

actualizaCreencias(pobl, &espcreencias, j);

generarHijos(pobl, &espcreencias);

for (i = TAMPOBL; i < 2*TAMPOBL; i++) {

evalua(&(pobl[i]), 0, 0, 0);

violacion(&(pobl[i]), gmax);

evs++;

}

selecciona(pobl);

if (j >= Gmax - 11 || (j+1)%(Gmax/100) == 0) {

extremos(&indmin, &indmax, pobl);

fprintf(a, "Generaciуn %d\n", j+1);

fprintf(a, "Aptitud media: %0.7f, aptitud mбxima: %0.7f, aptitud mнnima: %0.7f\n", media, pobl[indmax].aptitud, pobl[indmin].aptitud);

fprintf(a, "Mejor individuo:");

for (i = 0; i < VARIABLES; i++) {

fprintf(a, " %0.7f,", pobl[indmin].variable[i]);

}

for (i = 0; i < NUMCONSTR; i++) {

fprintf(a, "\ng%d = %0.7f", i+1, pobl[indmin].g[i]);

}

fprintf(a, "\nviol = %0.7f", pobl[indmin].viol);

fprintf(a, "\nEl mejor individuo es ");

if (!pobl[indmin].factible) {

fprintf(a, "no ");

}

fprintf(a, "factible.\nEvluaciones: %ld\n\n", evs);

}

}

fclose(a);

printf("%0.7f", pobl[indmin].aptitud);

if (!pobl[indmin].factible) {

printf(" i");

}

printf("\n");

return (0);

}

void creenciasInic(struct creencias *esp) {

int i;

float l[VARIABLES], u[VARIABLES];

limites(l, u);

for (i = 0; i < VARIABLES; i++) {

esp->L[i] = esp->U[i] = MAXFLOAT;

esp->l[i] = esp->lp[i] = l[i];

esp->u[i] = esp->up[i] = u[i];

}

esp->raiz = (struct celda *) malloc(sizeof(struct celda));

esp->raiz->padre = NULL;

esp->raiz->hijo = NULL;

esp->raiz->profundidad = PROFUNDIDAD_MAX;

}

void poblacionInic(struct individuo *pobl, struct creencias *esp) {

int i, j;

for (i = 0; i < TAMPOBL; i++) {

for (j = 0; j < VARIABLES; j++) {

pobl[i].variable[j] = rndreal(esp->lp[j], esp->up[j]);

}

}

}

void violacionInic(float gmax[]) {

int i;

for (i = 0; i < NUMCONSTR; i++) {

gmax[i] = 0;

}

}

void violacion(struct individuo *ind, float gmax[]) {

int i;

float v;

if (TRUSSPROBL) {

return;

}

ind->viol = 0;

for (i = 0; i < NUMCONSTR; i++) {

if (i < NUMCONSTR - NUMEQCONSTR) {

v = (ind->g[i] > 0)? ind->g[i]: 0;

}

else {

v = fabs(ind->g[i]);

}

if (v > gmax[i]) {

gmax[i] = v;

}

ind->viol += v/gmax[i];

}

}

void actualizaCreencias(struct individuo *pobl, struct creencias *esp, int t) {

int aceptados[TOP + 3];

int i, j, iinf, isup, dim, numHijo, sumando, celda, k = 20;

float sup, inf;

struct celda *nodoAct;

if (t%k == 0) {

aceptar(pobl);

for (i = 0; i < VARIABLES; i++) {

iinf = 0;

inf = pobl[0].variable[i];

isup = 0;

sup = pobl[0].variable[i];

for (j = 1; j < TOP; j++) {

if (pobl[j].variable[i] < inf) {

iinf = j;

inf = pobl[j].variable[i];

}

if (pobl[j].variable[i] > sup) {

isup = j;

sup = pobl[j].variable[i];

}

}

if ( (inf < esp->l[i]) || (pobl[iinf].aptitud < esp->L[i] && pobl[iinf].factible) ) {

if (inf < esp->u[i]) {

esp->l[i] = inf;

esp->L[i] = pobl[iinf].aptitud;

}

}

if ( (sup > esp->u[i]) || (pobl[isup].aptitud < esp->U[i] && pobl[isup].factible) ) {

if (sup > esp->l[i]) {

esp->u[i] = sup;

esp->U[i] = pobl[isup].aptitud;

}

}

}

ftime(&tiempo1);

expande(esp->raiz, pobl, esp);

ftime(&tiempo2);

diferencia += 1000*(tiempo2.time - tiempo1.time) + tiempo2.millitm - tiempo1.millitm;

}

ftime(&tiempo1);

for (i = 0; i < TAMPOBL; i++) {

numHijo = 0;

for (j = 0; j < VARIABLES; j++) {

if (pobl[i].variable[j] < esp->l[j] ||

pobl[i].variable[j] > esp->u[j]) {

numHijo = -1;

break;

}

}

if (numHijo == -1) {

pobl[i].celda = NULL;

continue;

}

for (nodoAct = esp->raiz; nodoAct->d[0] != -1; nodoAct = &(nodoAct->hijo[numHijo])) {

numHijo = 0;

sumando = 1;

for (j = 0; j < TREEDIMS; j++) {

dim = nodoAct->d[j];

if (pobl[i].variable[dim] > (nodoAct->lnodo[dim] + nodoAct->unodo[dim])/2) {

numHijo += sumando;

}

sumando += sumando;

}

}

pobl[i].celda = nodoAct;

if (pobl[i].factible) {

pobl[i].celda->factibles++;

if (pobl[i].celda->factibles == 1) {

if (pobl[i].celda->noFactibles == 0) {

pobl[i].celda->clase = FACTIBLE;

}

else {

pobl[i].celda->clase = SEMIFACTIBLE;

if (pobl[i].celda->profundidad > 1) {

expande(pobl[i].celda, pobl, esp);

i = -1;

continue;

}

}

}

}

else {

pobl[i].celda->noFactibles++;

if (pobl[i].celda->noFactibles == 1) {

if (pobl[i].celda->factibles == 0) {

pobl[i].celda->clase = NO_FACTIBLE;

}

else {

pobl[i].celda->clase = SEMIFACTIBLE;

if (pobl[i].celda->profundidad > 1) {

expande(pobl[i].celda, pobl, esp);

i = -1;

continue;

}

}

}

}

}

ftime(&tiempo2);

diferencia += 1000*(tiempo2.time - tiempo1.time) + tiempo2.millitm - tiempo1.millitm;

}

void expande(struct celda *nodoAct, struct individuo *pobl, struct creencias *esp) {

int i, j, numArbol, numHijo, sumando, dim, min;

int sumMin[PRUEBAS_ARBOL][TREEDIMS + 1];

float tmp;

if (nodoAct->hijo == NULL) {

nodoAct->hijo = (struct celda *) malloc(TREENODES*sizeof(struct celda));

for (i = 0; i < TREENODES; i++) {

nodoAct->hijo[i].padre = nodoAct;

nodoAct->hijo[i].hijo = NULL;

nodoAct->hijo[i].profundidad = nodoAct->profundidad - 1;

}

}

for (i = 0; i < TREENODES; i++) {

nodoAct->hijo[i].d[0] = -1;

}

if (nodoAct->padre == NULL) {

for (i = 0; i < VARIABLES; i++) {

nodoAct->lnodo[i] = esp->l[i];

nodoAct->unodo[i] = esp->u[i];

}

}

if (VARIABLES > TREEDIMS) {

for (numArbol = 0; numArbol < PRUEBAS_ARBOL; numArbol++) {

for (i = 0; i < TREENODES; i++) {

nodoAct->hijo[i].factibles = 0;

nodoAct->hijo[i].noFactibles = 0;

}

sumMin[numArbol][1] = rnd(0, VARIABLES-1);

sumMin[numArbol][2] = rnd(0, VARIABLES-2);

sumMin[numArbol][3] = rnd(0, VARIABLES-3);

if (sumMin[numArbol][2] >= sumMin[numArbol][1]) {

sumMin[numArbol][2]++;

if (sumMin[numArbol][3] >= sumMin[numArbol][1]) {

sumMin[numArbol][3]++;

}

if (sumMin[numArbol][3] >= sumMin[numArbol][2]) {

sumMin[numArbol][3]++;

}

}

else {

if (sumMin[numArbol][3] >= sumMin[numArbol][2]) {

sumMin[numArbol][3]++;

}

if (sumMin[numArbol][3] >= sumMin[numArbol][1]) {

sumMin[numArbol][3]++;

}

}

for (i = 0; i < TAMPOBL; i++) {

numHijo = 0;

for (j = 0; j < VARIABLES; j++) {

if (pobl[i].variable[j] < nodoAct->lnodo[j] ||

pobl[i].variable[j] > nodoAct->unodo[j]) {

numHijo = -1;

break;

}

}

if (numHijo == -1) {

continue;

}

sumando = 1;

for (j = 0; j < TREEDIMS; j++) {

dim = sumMin[numArbol][j + 1];

if (pobl[i].variable[dim] > (nodoAct->lnodo[dim] + nodoAct->unodo[dim])/2) {

numHijo += sumando;

}

sumando += sumando;

}

if (pobl[i].factible) {

nodoAct->hijo[numHijo].factibles++;

}

else {

nodoAct->hijo[numHijo].noFactibles++;

}

}

sumMin[numArbol][0] = 0;

for (i = 0; i < TREENODES; i++) {

sumMin[numArbol][0] += (nodoAct->hijo[i].factibles < nodoAct->hijo[i].noFactibles)? nodoAct->hijo[i].factibles: nodoAct->hijo[i].noFactibles;

}

}

min = sumMin[0][0];

numArbol = 0;

for (i = 1; i < PRUEBAS_ARBOL; i++) {

if (sumMin[i][0] < min) {

min = sumMin[i][0];

numArbol = i;

}

}

for (i = 0; i < TREEDIMS; i++) {

nodoAct->d[i] = sumMin[numArbol][i + 1];

}

}

else {

for (i = 0; i < VARIABLES; i++) {

nodoAct->d[i] = i;

}

}

for (i = 0; i < TAMPOBL; i++) {

numHijo = 0;

for (j = 0; j < VARIABLES; j++) {

if (pobl[i].variable[j] < nodoAct->lnodo[j] ||

pobl[i].variable[j] > nodoAct->unodo[j]) {

numHijo = -1;

break;

}

}

if (numHijo == -1) {

continue;

}

sumando = 1;

for (j = 0; j < TREEDIMS; j++) {

dim = nodoAct->d[j];

if (pobl[i].variable[dim] > (nodoAct->lnodo[dim] + nodoAct->unodo[dim])/2) {

numHijo += sumando;

}

sumando += sumando;

}

if (pobl[i].factible) {

nodoAct->hijo[numHijo].factibles++;

}

else {

nodoAct->hijo[numHijo].noFactibles++;

}

}

for (i = 0; i < TREENODES; i++) {

for (j = 0; j < VARIABLES; j++) {

nodoAct->hijo[i].lnodo[j] = nodoAct->lnodo[j];

nodoAct->hijo[i].unodo[j] = nodoAct->unodo[j];

}

numHijo = i;

sumando = 1;

for (j = 0; j < TREEDIMS; j++) {

tmp = (nodoAct->lnodo[nodoAct->d[j]] + nodoAct->unodo[nodoAct->d[j]]) / 2;

if (numHijo % (2*sumando)) {

nodoAct->hijo[i].lnodo[nodoAct->d[j]] = tmp;

numHijo -= sumando;

}

else {

nodoAct->hijo[i].unodo[nodoAct->d[j]] = tmp;

}

sumando += sumando;

}

}

for (i = 0; i < TREENODES; i++) {

if (nodoAct->hijo[i].factibles > 0) {

if (nodoAct->hijo[i].noFactibles > 0) {

nodoAct->hijo[i].clase = SEMIFACTIBLE;

}

else {

nodoAct->hijo[i].clase = FACTIBLE;

}

}

else {

if (nodoAct->hijo[i].noFactibles > 0) {

nodoAct->hijo[i].clase = NO_FACTIBLE;

}

else {

nodoAct->hijo[i].clase = DESCONOCIDA;

}

}

}

if (nodoAct->profundidad > 1) {

for (i = 0; i < TREENODES; i++) {

if (nodoAct->hijo[i].clase == SEMIFACTIBLE) {

expande(&(nodoAct->hijo[i]), pobl, esp);

}

}

}

}

void aceptar(struct individuo *pobl) {

qsort(pobl, TAMPOBL, sizeof(struct individuo), &compVictorias);

}

int compAptitud(const void *ind1, const void *ind2) {

int dif;

if ( ((struct individuo *)ind2)->factible && ((struct individuo *)ind1)->factible ) {

if (((struct individuo *)ind2)->aptitud > ((struct individuo *)ind1)->aptitud) {

return -1;

}

if (((struct individuo *)ind2)->aptitud < ((struct individuo *)ind1)->aptitud) {

return 1;

}

return 0;

}

if ( ((struct individuo *)ind1)->factible ) {

return -1;

}

if ( ((struct individuo *)ind2)->factible ) {

return 1;

}

if (((struct individuo *)ind2)->viol > ((struct individuo *)ind1)->viol) {

return -1;

}

if (((struct individuo *)ind2)->viol < ((struct individuo *)ind1)->viol) {

return 1;

}

return 0;

}

void generarHijos(struct individuo *pobl, struct creencias *esp) {

int i, j;

float x;

for (i = 0; i < TAMPOBL; i++) {

for (j = 0; j < VARIABLES; j++) {

pobl[i+TAMPOBL].variable[j] = pobl[i].variable[j];

x = randomnormaldeviate();

if (pobl[i].variable[j] < esp->l[j]) {

pobl[i+TAMPOBL].variable[j] += fabs(x*(esp->u[j] - esp->l[j]));

}

else if (pobl[i].variable[j] > esp->u[j]) {

pobl[i+TAMPOBL].variable[j] -= fabs(x*(esp->u[j] - esp->l[j]));

}

else if (pobl[i].celda == NULL) {

pobl[i+TAMPOBL].variable[j] += x*(esp->u[j]-esp->l[j]);

}

else if (pobl[i].celda->clase == NO_FACTIBLE) {

mueve(i, j, x, pobl, esp);

}

else {

pobl[i+TAMPOBL].variable[j] += x*(pobl[i].celda->unodo[j] - pobl[i].celda->lnodo[j]);

}

if (pobl[i+TAMPOBL].variable[j] > esp->up[j]) {

pobl[i+TAMPOBL].variable[j] = esp->up[j];

}

else if (pobl[i+TAMPOBL].variable[j] < esp->lp[j]) {

pobl[i+TAMPOBL].variable[j] = esp->lp[j];

}

}

}

}

void mueve(int indiv, int dim, float x, struct individuo *pobl, struct creencias *esp) {

struct celda *celdaNueva;

celdaNueva = cercana(SEMIFACTIBLE, pobl[indiv].celda);

if (celdaNueva == NULL) {

celdaNueva = cercana(DESCONOCIDA, pobl[indiv].celda);

}

if (celdaNueva == NULL) {

pobl[indiv+TAMPOBL].variable[dim] += x*(esp->u[dim] - esp->l[dim]);

}

else {

pobl[indiv+TAMPOBL].variable[dim] = x*(celdaNueva->unodo[dim] - celdaNueva->lnodo[dim]) + (celdaNueva->unodo[dim] + celdaNueva->lnodo[dim])/2;

}

}

struct celda *cercana(int prioridad, struct celda *nodo) {

int i;

struct celda *res;

for (; nodo->padre != NULL; nodo = nodo->padre) {

for (i = 0; i < TREENODES; i++) {

if (&(nodo->padre->hijo[i]) == nodo) {

continue;

}

res = busca(prioridad, &(nodo->padre->hijo[i]));

if (res != NULL) {

return res;

}

}

}

return NULL;

}

struct celda *busca(int prioridad, struct celda *nodo) {

int i;

struct celda *res;

if (nodo->d[0] == -1) {

if (nodo->clase <= prioridad) {

return nodo;

}

else {

return NULL;

}

}

for (i = 0; i < TREENODES; i++) {

res = busca(prioridad, &(nodo->hijo[i]));

if (res != NULL) {

return res;

}

}

return NULL;

}

void selecciona(struct individuo *pobl) {

int c = TAMPOBL/2;

int i, j, contr, indmin;

float min;

char hayFactibles;

for (i = 0; (!pobl[i].factible) || (i < 2*TAMPOBL); i++);

hayFactibles = (i < 2*TAMPOBL)? 1: 0;

for (i = 0; i < 2*TAMPOBL; i++) {

pobl[i].victorias = 0;

for (j = 0; j < c; j++) {

contr = rnd(0, 2*TAMPOBL-2);

contr = (contr>=i)? contr+1: contr;

if ((pobl[i].factible && pobl[contr].factible)) {

if (pobl[i].aptitud < pobl[contr].aptitud) {

pobl[i].victorias++;

}

}

else {

if (!pobl[contr].factible) {

if (pobl[i].factible) {

pobl[i].victorias++;

}

else if (pobl[i].viol < pobl[contr].viol) {

pobl[i].victorias++;

}

}

}

}

}

for (i = 0; !pobl[i].factible && i < 2*TAMPOBL; i++);

if (i < 2*TAMPOBL) {

min = pobl[i].aptitud;

indmin = i;

for (; i < 2*TAMPOBL; i++) {

if (pobl[i].factible && pobl[i].aptitud < min) {

indmin = i;

min = pobl[i].aptitud;

}

}

pobl[indmin].victorias = c + 1;

}

qsort(pobl, 2*TAMPOBL, sizeof(struct individuo), &compVictorias);

}

int compVictorias(const void *ind1, const void *ind2) {

int dif;

dif = ((struct individuo *)ind2)->victorias - ((struct individuo *)ind1)->victorias;

return dif;

}

void nuevoInd(struct individuo *ind) {

int j;

float l[VARIABLES], u[VARIABLES];

limites(l, u);

for (j = 0; j < VARIABLES; j++) {

ind->variable[j] = rndreal(l[j], u[j]);

}

}

void extremos(int *indmin, int *indmax, struct individuo *pobl) {

int i, sumados = 0;

float min, max, med = 0.0;

for (i = 0; !pobl[i].factible && i < TAMPOBL; i++);

if (i < TAMPOBL) {

max = min = pobl[i].aptitud;

*indmin = *indmax = i;

for (; i < TAMPOBL; i++) {

if (pobl[i].factible) {

if (pobl[i].aptitud < min) {

*indmin = i;

min = pobl[i].aptitud;

}

if (pobl[i].aptitud > max) {

*indmax = i;

max = pobl[i].aptitud;

}

med += pobl[i].aptitud;

sumados++;

}

}

}

else {

max = min = pobl[0].viol;

*indmin = *indmax = 0;

for (i = 0; i < TAMPOBL; i++) {

if (pobl[i].viol < min) {

*indmin = i;

min = pobl[i].viol;

}

if (pobl[i].viol > max) {

*indmax = i;

max = pobl[i].viol;

}

med += pobl[i].aptitud;

sumados++;

}

}

media = med/sumados;}

Заключение

В работе был описан алгоритм TS (Поиск с запретами), а также приведены примеры адаптации алгоритма для решения проблем оптимизации.

По приведенным таблицам можно сравнить эффективность работы алгоритма TS по отношению к другим алгоритмам. Таким как: Имитация отжига, k-means, Ward.

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

алгоритм обмен экспериментальный трудоемкость

Список использованных источников

1. Ульянов М.В., Шептунов М.В. Математическая логика и теория алгоритмов, часть 2: Теория алгоритмов. - М.: МГАПИ, 2003. - 80 с.

2. Конспект лекций по дисциплине «Математическая логика и теория алгоритмов».

3. Javier Trejos, Eduardo Piza, Alex Murillo A Tabu Search Algorithm for Partitioning. - 1996. - http://google.ru/ globalsearching /materials/1008.pdf.

4. Alain Hertz, Eric Taillard, Dominique de Werra A Tutorial On Tabu Search. - 1995. - http://google.ru/ globalsearching/books/1548/hertz92tutorial.pdf.

Размещено на Allbest.ru


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

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