Научная статья на тему 'Использование принципов объектно-ориентированного программирования при реализации оптимизационных алгоритмов'

Использование принципов объектно-ориентированного программирования при реализации оптимизационных алгоритмов Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
615
111
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
МЕТОДЫ ОПТИМИЗАЦИИ / ПОПУЛЯЦИОННЫЕ АЛГОРИТМЫ / ПОЛИМОРФИЗМ / ОБЪЕКТНОЕ ПРОЕКТИРОВАНИЕ / ИНТЕРФЕЙС

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Матренин Павел Викторович

Во многих областях науки и техники применяются методы оптимизации, включающие множество различных алгоритмов. В статье рассматривается задача программной реализации алгоритмов решения оптимизационных задач, в частности стохастических алгоритмов дискретной оптимизации, таких как алгоритмы роевого интеллекта или генетический алгоритм. Показано, что несмотря на разнообразие алгоритмов оптимизации, они имеют общие черты, выделение которых позволяет спроектировать гибкую и масштабируемую архитектуру. Предложена иерархия классов, согласно которой каждая конкретная реализация оптимизационного алгоритма представляется классом-наследником некоторого базового абстрактного суперкласса. Приводится пример кода базового класса на языке программирования C++. Затем рассматривается вопрос взаимодействия алгоритмов оптимизации с моделью решаемой задачи. Для обеспечения единообразной работы алгоритмов оптимизации с различными задачами предлагается реализовать некоторый интерфейс, с помощью которого класс алгоритма оптимизации обращался бы к решаемой задаче оптимизации для вычисления целевой функции (критерия оптимальности). Приводится программный код такого интерфейса на языках программирования С++ и Java и пример реализации класса, соответствующего решаемой задаче оптимизации и реализующего такой интерфейс. Подчеркивается, что класс, представляющий модель задачи, может быть только оболочкой для целой системы, если рассматривается оптимизация сложного объекта управления. Каким бы сложным не была внутренняя логика модели объекта управления, для алгоритма оптимизации она целиком будет сокрыта предложенным интерфейсом. Благодаря полиморфизму замена целевой функции или даже модели объекта никак не повлияет на код алгоритмов оптимизации. В конце статьи приводятся полученные с использованием предложенного подхода практические результаты (применение алгоритмов оптимизации для решения практически-значимых задач, разработка программ визуализации алгоритмов), подтверждающие его эффективность и ценность.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Использование принципов объектно-ориентированного программирования при реализации оптимизационных алгоритмов»

6. Эндрюс Г.Р. Основы многопоточного, параллельного и распределенного программирования / Г.Р. Эндрюс. — М.: Издательский дом «Вильямс», 2003. — 512 с.

УДК 004.023 + 004.424

ИСПОЛЬЗОВАНИЕ ПРИНЦИПОВ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ ПРИ РЕАЛИЗАЦИИ ОПТИМИЗАЦИОННЫХ

АЛГОРИТМОВ

Матренин Павел Викторович, аспирант, Кафедра автоматизированных систем управления, Новосибирский государственный технический университет, Россия, Новосибирск,

pavel.matrenin@gmail.com

Введение

В настоящее время во многих областях необходимо решать задачи дискретной или непрерывной глобальной оптимизации. Такие задачи часто нелинейны, недифференцируемы, имеют множество локальных экстремумов, характеризуются высокой вычислительной сложностью [1]. Для них часто невозможно составить аналитическое выражение, потому что модель имеет сложную структуру и многочисленные взаимосвязи между элементами, что приводит также к высокой трудоемкости вычислений и сложной топологии области допустимых значений. Для подобных задач оптимизации наиболее эффективны стохастические методы, такие как методы эволюционной оптимизации, методы роевого интеллекта, алгоритмы имитации отжига. Первые две группы относятся к так называемым популяционным методам, поскольку используют системы, состоящие из агентов. Как правило, под агентом понимается некоторая точка в пространстве поиска решений задачи, а процесс оптимизации заключается в перемещении агентов в этом пространстве с помощью некоторых правил [2, 3], либо в создании на каждом шаге новых популяций агентов с учетом опыта, полученного предыдущими популяциями [4]. Таким образом популяционные методы могут автоматически исследовать область решений независимо от ее размерности и топологии. Наиболее важными преимуществами методов являются гибкость и возможность относительно быстро получать решения, близкие к оптимальным [5].

Несмотря на разнообразие стохастических методов оптимизации и большое количество модификаций каждого метода, все они имеют общие черты, что позволяет применять при их реализации методы объектно-ориентированного программирования [6]. Для повышения гибкости в разрабатываемых программных систем необходимо избегать зависимостей между алгоритмами, интерфейсами к ним и решаемыми задачами.

1. Объектное проектирование методов оптимизации

В рамках объектно-ориентированного программирования каждый алгоритм оптимизации можно рассматривать как класс. Полезно использовать единые интерфейсы таких классов, чтобы применение того или иного алгоритма выполнялось единообразно. В этом случае можно применить шаблон проектирования «Template method», который задает общую структуру поведения связанных классов [7]. При этом детали поведения отдельного алгоритмов задаются в реализации дочерних классов. Общими для дочерних классов будут методы управления алгоритмами, настройки, инициализации, перемещения агентов и возвращения результатов работы. Пример базового класса на языке программирования C++ приведен ниже.

class Optimizator {

public:

25

virtual void start() = 0; virtual void stop() = 0;

void setIterationNumber(int ni); //установка количества итераций void setAgentsNumber(int na); //установка количества агентов virtual void setParameters(double *arrParams) = 0;//установка параметров

void setCriterion(ICriterionCalc *pCreator);//этот метод будет описан

ниже

double getBest(double *bestSolution);//возврат найденного решения

//(в bestSolution записывается вектор искомых переменных, //метод возвращает значение критерия virtual ~Optimizator () {}

protected:

virtual void initialization() = 0; virtual void move() = 0;

int numberAgents; int numberIterations; double *bestSolution;

ICriterionCalc *creator;

//указатель на описанный ниже объект для вычисления критерия

};

2. Взаимодействие методов с решаемыми задачами

Для обеспечения единообразной работы алгоритмов оптимизации с различными задачами можно реализовать некоторый интерфейс, обозначенный здесь как ICriterionCalc, имеющий метод getCriterion, который соответствует некоторой оптимизируемой функции f(X) и принимает управляющие переменные X, а возвращает значение целевой функцииfX). Можно разбить вектор X на целочисленную и непрерывную части, в примерах ниже считается, что все элементы вектора X непрерывны. Например, на языке программирования С++ реализация такого интерфейса с помощью абстрактного класса может быть следующей:

class ICriterionCalc {

public:

virtual double getCriterion(double *arrayDouble, int *arrayInt) = 0; virtual ~ICriterionCalc() {}

};

В языке Java реализация интерфейса немного короче:

public interface ICriterionCalc {

double getCriterion(double [] arrayDouble, int [] arrayInt);

};

Затем в любом классе, представляющем модель задачи оптимизации, нужно реализовать метод getCriterion, а сам класс должен наследоваться от класса ICriterionCalc (в С++) или реализовать интерфейс ICriterionCalc (в Java), например для задачи Химмельблау:

//C++

class Himmelblay : public ICriterionCalc {

public:

virtual double getCriterion(double *arrDouble, int *arrInt);

};

double Himmelblay::getCriterion(double *arrDouble, int *arrInt) {

26

double x0 = arrDouble[0], x1 = arrDouble[1];

return pow((x0*x0 + x1 - 11.), 2) + pow((x0+ x1*x1 - 7.), 2);

}

//Java

public class Himmelblay implements ICriterionCalc {

double getCriterion(double [] arrayDouble, int [] arrayInt); double x0 = arrDouble[0], x1 = arrDouble[1];

return Math.pow((x0*x0 + x1 - 11.), 2) + Math.pow((x0+ x1*x1 - 7.), 2);

}

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

Выше в коде класса Optimizator есть метод setCriterion и указатель на объект класса ICriterionCalc. Объект, вычисляющий целевую функцию, передается по указателю в класс Optimizator через метод setCriterion, в этом методе данный объект связывается с указателем creator. В результате, благодаря полиморфизму, в классах, реализующих алгоритмы оптимизации, можно вызывать вычисление целевой функции через метод getCriterion интерфейса ICriterionCalc независимо от класса, в котором будет производится это вычисление, как показано на диаграмме классов на рисунке 1 (Particle Swarm Optimization и Ant Colony Optimization представляют примеры классов, реализующих конкретные алгоритмы оптимизации). Таким образом код алгоритмов оптимизации никак не связан с кодом класса, реализующего решаемую задачу оптимизации.

Рис.1 - Диаграмма классов, показывающая связь алгоритмов оптимизации и решаемых задач

Заключение и практические результаты

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

Разработаны методические указания и ПО для визуализации стохастических алгоритмов, причем не найдено аналогов, в которых для разных алгоритмов был бы реализован единый графический интерфейс визуализации [8].

Литература

27

1. Карпенко А.П. Популяционные алгоритмы глобальной оптимизации. Обзор новых и малоизвестных алгоритмов / А.П. Карпенко // Приложение к журналу «Информационные технологии». 2012. №7. С. 1-32.

2. J. Kennedy, R. Eberhart, “Particle Swarm Optimization”, in proc. of IEEE International Conference on

Neural Network, Piscataway, NJ, 1995, pp. 1942-1948.

3. Dorigo M., Birattari M., Stutzle T. Ant Colony Optimization. Artificial Ants as a Computational

Intelligence Technique // IRIDIA. Technical Report Series. Technical Report No. TR/IRIDIA/2006-023. Brussels, Belgium. 2006. 14 p.

4. Гладков Л.А. Генетические алгоритмы/ Л.А. Гладков, В.В. Курейчик, В.М. Курейчик; под ред.

В.М. Курейчика. - 2-е изд., испр. и доп. - М.: ФИЗМАТЛИТ, 2006. - 320 с.

5. Курейчик В.М., Использование роевого интеллекта в решении NP-трудных задач/ В.М, Курейчик, А.А. Кажаров // Известия ЮФУ. Технические науки. 2011. № 7 (120). С. 30-37.

6. Матренин П.В. Описание и реализация алгоритмов роевого интеллекта с использованием

системного подхода / П.В. Матренин // Программная инженерия. 2015. №3. С. 27-34.

7. Гранд М. Шаблоны проектирования в Java / М. Гранд; Пер. с англ. С. Беликовой. - М.: Новое

знание, 2004. - 559 с.: ил.

8. Матренин П.В. Разработка приложений для визуализации методов стохастической оптимизации /П.В. Матренин // Сборник научных трудов SWorld. Материалы международной научно-практической конференции «Современные проблемы и пути их решения в науке, транспорте, производстве и образовании'2012». - Выпуск 4. Том 12. Одесса: КУПРИЕНКО, 2012. ЦИТ:412-0099. С. 28-35.

УДК. 004.652

ТЕМПОРАЛЬНЫЕ ОБЪЕКТНО-РЕЛЯЦИОННЫЕ МОДЕЛИ В МНОГОМЕРНОМ

ПРЕДСТАВЛЕНИИ9

Елисеев Дмитрий Владимирович, к.т.н., ведущий программист, МГТУ им. Н.Э. Баумана, Россия,

Москва, d-eli@mail.ru

Введение

Нетемпоральные модели данных и их реализация в системах управления базами данных (СУБД) хранят единственное состояние объектов предметной области. СУБД поддерживают операции изменения, которые переводят базу данных из одного состояния в другое, тем самым, заменяя старые значения новыми.

Но существует множество предметных областей, в которых необходимо хранить прошлые состояния базы данных и возможно будущие. К таким системам можно отнести: систему управления предприятием [1], систему управления персоналом [2], финансовые приложения, страховые приложения и ряд других, которые обладают следующими свойствами:

1. Информационная система обрабатывает темпоральные (изменяющиеся во времени) данные.

2. Информационная система накапливает историю изменения темпоральных данных.

В настоящее время объектно-реляционная модель является наиболее распространённой на практике в базах данных. В разработку методов хранения и обработки темпоральных данных на базе объектно-реляционной модели внесли вклад учёные, такие как Р. Снодграс [3], К. Дженсен [4], Дж. Бен-Зви [4], C. Гадия [4], Е. МакКензи [4], А. Стейнер [5]. Исследования в области темпоральных баз данных привели к многообразию соответствующих темпоральных моделей. В статье рассмотрены недостатки,

9 Статья рекомендована к опубликованию в журнале "Прикладная информатика"

28

i Надоели баннеры? Вы всегда можете отключить рекламу.