Многокритериальная оптимизация
Классификация методов оптимизации. Обзор и выбор языка C#. Алгоритмический анализ задачи, описание алгоритма решения. Графические схемы разработанных алгоритмов. Разработка приложения и результаты тестовых испытаний. Интерфейс пользователя, тестирование.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 08.03.2016 |
Размер файла | 1,6 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://allbest.ru
Многокритериальная оптимизация
ВВЕДЕНИЕ
алгоритм интерфейс графический схема
В настоящее время начал возрастать интерес к оптимизации различных процессов в разнообразных областях деятельности человека. Такой интерес понятен, ведь оптимальная альтернатива позволяет экономить денежные средства, материальные ресурсы, сократить отходы производства и получать качественную продукцию. В современном обществе даже обычному человеку, который собирается совершить покупку - приходится в том или ином роде решать задачу многокритериальной оптимизации: как выбрать такую оптимальную альтернативу, которая бы удовлетворяла необходимым критериям. Для этого мы прибегаем к помощи экспертов в данной области и отсеиваем варианты, не удовлетворяющие нашим критериям.
Оптимизация это достаточно трудоёмкий процесс, требующий больших вычислительных мощностей, поэтому это сугубо компьютерная задача. Компьютеры тесно вошли в нашу жизнь и системы автоматизированного проектирования, автоматизация различных процессов - уже обычное явление, которое никого не удивляет. Напротив, требования к системам автоматизированного проектирования растут. Из - за сложности технологических процессов, применяемых в промышленности возникает большое число задач, которые нельзя решить с помощью обычного математического аппарата дифференциальных уравнений. Кроме того в результате решения этих задач мы получаем множество решений, которые удовлетворяют параметрам модели системы, однако не все они оптимальны.
К таким задачам можно отнести, например задачу гидравлического расчёта бурения нефтяных скважин, где необходимо выбрать наземное оборудование, выбрать тип промывочной жидкости, выбрать параметры трубопровода и многое другое, к тому же, в конечном счете, ещё необходимо учитывать ограничения по давлениям при бурении, глубине бурения, типу грунта и так далее. Грамотно решив данную задачу, мы получим такие параметры модели, которые будут максимально приближены к реальной системе, что позволит предсказать исход бурения и возможные осложнения при бурении.
В настоящее время существует множество информационных технологий, позволяющих предельно облегчить жизнь и помочь в решении проблем, связанных с процессами принятия решений в различных предметных областях. В частности, очень распространены сейчас системы поддержки принятия решений на основе Метода Анализа Иерархий, разработанного американским ученым Т. Саати.
Процессы принятия решений в различных сферах деятельности во многом аналогичны. Метод Саати - универсальный метод поддержки принятия решений, соответствующий естественному ходу человеческого мышления [1].
Целью данного курсового проекта является написание приложения, позволяющего упростить выбор пары станков среди множества альтернативных вариантов, которые будут использованы для освоения выпуска нового изделия на предприятии. В результате выполнения курсового проекта должны быть реализованы однокритериальная и многокритериальная оптимизации, определение наилучшей альтернативы станков с учетом ограничений на годовую производительность, общую стоимость, потребляемую в месяц электроэнергию и количество рабочих часов в месяц.
Освоение выпуска нового изделия - важный процесс подготовки производства, значимым элементом которого является правильно выбранное оборудование, с чем и поможет разработанная система поддержки принятия решений.
1. ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
1.1 Классификация методов оптимизации
Принято различать задачи статической оптимизации для процессов, протекающих в установившихся режимах, и задачи динамической оптимизации.
В первом случае решаются вопросы создания и реализации оптимальной модели процесса, во втором - задачи создания и реализации системы оптимального управления процессом при неустановившихся режимах эксплуатации.
Если требуется определить экстремум целевой функции без задания условий на какие-либо другие величины, то такая оптимизация называется безусловной. Такие критерии обычно используются при решении частных задач оптимизации (например, определение максимальной концентрации целевого продукта, оптимального времени пребывания реакционной смеси в аппарате и т.п.).
Если необходимо установить экстремум целевой функции при некоторых условиях, которые накладываются на ряд других величин (например, определение максимальной производительности при заданной себестоимости, определение оптимальной температуры при ограничениях по термостойкости катализатора и др.), то такая оптимизация называется условной [2].
Процедура решения задачи оптимизации обязательно включает, помимо выбора управляющих параметров, еще и установление ограничений на эти параметры (термостойкость, взрывобезопасность, мощность перекачивающих устройств).
Ограничения могут накладываться как по технологическим, так и по экономическим соображениям.
В зависимости от управляющих параметров различают следующие задачи:
- оптимизация при одной управляющей переменной - одномерная оптимизация;
- оптимизация при нескольких управляющих переменных - многомерная оптимизация;
- оптимизация при неопределённости данных;
- оптимизация с непрерывными, дискретными и смешанным типом значений управляющих воздействий.
В зависимости от критерия оптимизации различают:
- с одним критерием оптимизации - критерий оптимальности единственный;
- со многими критериями. Для решения задач со многими критериями используются специальные методы оптимизации [3].
1.2 Однокритериальная оптимизация
Задачи одномерной минимизации представляют собой простейшую математическую модель оптимизации, в которой целевая функция зависит от одной переменной, а допустимым множеством является отрезок вещественной оси.
Общая постановка задачи одномерной оптимизации сводится к следующему: имеется некоторая функция f(x) от одной переменной x, необходимо найти такое значение x*, при котором функция f(x) принимает экстремальное значение. Под этим значением понимают минимальное или максимальное значения.
В общем случае функция может иметь одну или несколько экстремальных точек. Поиск таких точек с определённой точностью обычно разбивают на два этапа. На первом этапе экстремальные точки отделяют. Это значит, определяются отрезки, которые содержат по одной экстремальной точке, а затем уточняют до требуемой точности .
Максимизация целевой функции равнозначна минимизации противоположной величины, следовательно, можно рассматривать только задачи минимизации.
Для решения задачи минимизации функции f(x) на отрезке [a, b], в большинстве случаев, используют приближенные методы. С их помощь можно найти решения этой задачи с необходимой точностью в результате нахождения конечного числа значений функции f(x) и ее производных в некоторых точках отрезка [a, b]. Методы, использующие только значения функции и не требующие вычисления ее производных, называются прямыми методами минимизации. Достоинством прямых методов является то, что от целевой функции не требуется дифференцируемости и, более того, она может быть не задана в аналитическом виде. Единственное, на чем основаны алгоритмы прямых методов минимизации, это возможность определения значений f(x) в заданных точках [4]. Среди задач математического программирования самыми распространёнными и наиболее хорошо исследованными являются так называемые задачи линейного программирования (линейной оптимизации). Рассмотрим этот тип задач. Для них характерно то, что целевая функция линейно зависит от , а также, что ограничения, накладываемые на независимые переменные, имеют вид линейных равенств или неравенств относительно этих переменных.
Эти задачи нередко используются на практике - например, при решении проблем, связанных с распределением ресурсов, планированием производства, организацией работы транспорта и т.д.
Общая задача линейной оптимизации заключается в нахождении максимума (минимума) линейной целевой функции. Вид целевой функции и ограничений описываются формулами (1.11.4).
, (1.1)
при ограничениях:
, (1.2)
, (1.3)
, (1.4)
где целевая функция, критерий оптимальности или линейная форма;
x вектор неизвестных;
коэффициенты целевой функции;
коэффициенты ограничений;
величины правых частей ограничений.
Вектор значений неизвестных x = (x1, x2, …, xn), удовлетворяющих условию задачи (1.1) - (1.4) , называется допустимым решением или допустимым планом задачи линейной оптимизации. Совокупность всех допустимых планов называется множеством допустимых планов. Допустимое решение x* = (x1*, x2*, …, xn*) называется оптимальным, если оно обеспечивает максимальное (или, в зависимости от условий задачи, минимальное) значение целевой функции.
Решение задач линейной оптимизации может быть получено без особых затруднений (естественно, при корректной формулировке проблемы). Классическим методом решения задач данного типа является симплекс-метод. В случае лишь двух переменных успешно может использоваться также графический метод решения, обладающий преимуществом наглядности. Очевидно, в случае n > 2 применение графического метода невозможно.
При решении ряда оптимизационных задач требуется, чтобы значения неизвестных x = (x1, x2, …, xn) выражались в целых числах. К задачам подобного типа относятся те, в которых требуется определить необходимые для принятия решений значения физически цельных объектов (машин, агрегатов различного типа, людей, транспортных единиц и т.д. и т.п.).
Такие задачи относятся к задачам целочисленной оптимизации. Математическая модель задачи линейной целочисленной оптимизации также определяется формулами (1.1) - (1.4), но в данном случае налагается дополнительное требование целочисленности всех (или части) неизвестных. Если требование целочисленности распространяется лишь на часть неизвестных величин задачи, то такая задача называется частично целочисленной [5].
1.3 Многокритериальная оптимизация
Многокритериальная оптимизация или программирование - это процесс одновременной оптимизации двух или более конфликтующих целевых функций в заданной области определения.
Задача многокритериальной оптимизации встречаются во многих областях науки, техники и экономики [5].
Достаточно часто в реальных ситуациях качество эксплуатации исследуемого объекта или системы оценивается не единственным критерием или показателем качества, а совокупностью таких критериев, причем представляющих одинаково значимыми. Такая постановка задачи приводит к задаче оптимизации с векторной целевой функцией формула (1.5):
(1.5)
которая должна трактоваться неким определенным образом. Как правило, относительная значимость этих целей в общем неизвестна до тех пор, пока не будут определены все основные свойства системы и не будут полностью истолкованы все возможные взаимосвязи.
По мере того, как число возможных целей возрастает, то, очевидно, что эти взаимосвязи образуют сложную структуру и их становятся труднее идентифицировать. В данном случае многое зависит от интуиции исследователя и его или ее умения точно выражать те или иные предпочтения в процессе оптимизации.
Таким образом, стратегия построения многокритериальной оптимизации состоит, прежде всего, в способности адекватно определить постановку задачи так, что бы эта задача допускала свое решение, а также выразить необходимые предпочтения в виде числовых зависимостей и сохранив при этом реальность поставленной задачи.
Задача многокритериальной оптимизации формулируется следующим образом формула (1.6):
,(1.6)
,
где это n () целевых функций.
Векторы решений приведены в формуле (1.7) и относятся к не пустой области определения S:
;(1.7)
Задача многокритериальной оптимизации состоит в поиске вектора целевых переменных, удовлетворяющие наложенным ограничениям, и оптимизирует векторную функцию, элементы которой соответствуют целевым функциям. Эти функции образуют математическое описание критерия удовлетворительности и, как правило, взаимно конфликтуют. Отсюда, «оптимизировать» означает найти такое решение, при котором значение целевых функций были бы приемлемыми для постановщика задачи [5].
Итальянский экономист В. Парето сформулировал один из самых распространенных экономических критериев оптимальности. Он формулируется очень просто: «Следует считать, что любое изменение, которое никому не причиняет убытков и которое приносит некоторым пользу, является улучшением».
Критерий Парето имеет весьма широкий экономический смысл и очень часто используется при решении сложных экономических задач. Его можно использовать тогда, когда оптимизация одной совокупности показателей, характеризующих объект, не должна ухудшать другую совокупность не менее важных показателей.
Критерий Парето не применим к тем ситуациям, когда экономический эффект одних связан с убытками других. Область решений, оптимальных по Парето, получила название области компромиссов.
Алгоритм выделения области Парето:
1) Выбрать проект Пi, полагая i = 1.
2) Проект Пi сравнивается с остальными по всем показателям и отмечаются те из них, которые строго хуже, чем Пi.
3) Отмеченные проекты не могут принадлежать области Парето и из дальнейшего рассмотрения исключаются.
4) Полагаем i = i + 1.
5) Если и проект Пi уже был отмечен на предыдущих итерациях, то выполняется переход к п.4.
6) Если и проект еще не помечен, то производится переход к п. 2.
7) Если , где n - число сравниваемых проектов, то осуществляется переход к п. 8.
8) Оставшиеся не отмеченными проекты образуют множество эффективных решений (область Парето).
Если использовать дополнительную информацию, например, об относительной важности показателей, то можно получить дальнейшее уточнение мест проектов [6].
Метод анализа иерархий, разработанный под руководством американского специалиста по исследованию операций Т. Саати, применяется, в настоящее время, при решении самых разнообразных проблем, среди которых, в частности: проектирование транспортных систем крупных городов, разработка планов обеспечения энергетическими ресурсами отраслей промышленности, оценка сценария развития высшего образования, определение приоритетных направлений научных исследований и др.
МАИ не предписывает лицу, принимающему решение (ЛПР), какого-либо «правильного» решения, а позволяет ему в интерактивном режиме найти такой вариант (альтернативу), который наилучшим образом согласуется с его пониманием сути проблемы и требованиями к ее решению [7].
1.4 Обзор и выбор языка C#
C# - объектно-ориентированный язык программирования. Разработан в 1998 - 2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework.
C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML.
Переняв многое от своих предшественников - языков C++, Pascal, Модула, Smalltalk и в особенности Java - С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# в отличие от C++ не поддерживает множественное наследование классов.
Microsoft Visual Studio - линейка продуктов компании Майкрософт, включающих интегрированную среду разработки программного обеспечения и ряд других инструментальных средств. Данные продукты позволяют разрабатывать как консольные приложения, так и приложения с графическим интерфейсом, в том числе с поддержкой технологии Windows Forms, а также веб-сайты, веб-приложения, веб-службыкак в родном, так и в управляемом кодах для всех платформ, поддерживаемых Microsoft Windows,Windows Mobile, Windows CE, .NET Framework, Xbox, Windows Phone .NET Compact Framework и Microsoft Silverlight.
Visual Studio включает в себя редактор исходного кода с поддержкой технологии IntelliSense и возможностью простейшего рефакторинга кода. Встроенный отладчик может работать как отладчик уровня исходного кода, так и как отладчик машинного уровня. Остальные встраиваемые инструменты включают в себя редактор форм для упрощения создания графического интерфейса приложения, веб-редактор, дизайнер классов и дизайнер схемы базы данных.
Visual Studio позволяет создавать и подключать сторонние дополнения (плагины) для расширения функциональности практически на каждом уровне, включая добавление поддержки систем контроля версий исходного кода (как например, Subversion и Visual SourceSafe), добавление новых наборов инструментов (например, для редактирования и визуального проектирования кода на предметно-ориентированных языках программирования или инструментов для прочих аспектов процесса разработки программного обеспечения.
Исходя из всего вышесказанного, мы остановим свой выбор на данном языке программирования, так как он позволит выполнить поставленную задачу в полном объёме.
2. АЛГОРИТМИЧЕСКИЙ АНАЛИЗ ЗАДАЧИ
2.1 Постановка задачи
Предприятие планирует освоить выпуск нового изделия в количестве не менее 10 000 штук в год. Для этого ему необходимо приобрести станки двух типов. При этом, на изготовление изделия, предприятие может выделить не более 200 часов в месяц. Существует также ограничение по стоимости (не более 1000 млн. руб.) и по потребляемой мощности (не более 50000 кВт-ч в месяц).
Характеристика станков первого типа приведена в таблице 2.1.
Таблица 2.1 - Технические характеристики станков первого вида
Станок |
ST11 |
ST12 |
ST13 |
ST14 |
ST15 |
|
Производительность, изд./час |
14 |
5 |
12 |
15 |
11 |
|
Стоимость, млн. руб. |
340,0 |
210,0 |
720,0 |
550,0 |
357,0 |
|
Энергоэффективность, кВт-ч/ изд. |
17,8 |
35,5 |
27,0 |
23,8 |
11,9 |
Характеристика станков второго типа приведена в таблице 2.2.
Таблица 2.2 - Технические характеристики станков второго вида
Станок |
ST21 |
ST22 |
ST23 |
ST24 |
ST25 |
|
Производительность, изд./час |
18 |
9 |
17 |
19 |
15 |
|
Стоимость, млн. руб. |
314,0 |
255,0 |
250,0 |
400,0 |
138,0 |
|
Энергоэффективность, кВт-ч/ изд. |
17,0 |
25,0 |
25,5 |
19,0 |
13,3 |
Кроме того, при выборе станков необходимо учесть мнение экспертов в отношении этого оборудования (таблицы 2.3 и 2.4).
Таблица 2.3 - Эксплуатационные характеристики станков первого вида
Станок |
ST11 |
ST12 |
ST13 |
ST14 |
ST15 |
|
Сервисное обслуживание |
Да |
Да |
Нет |
Нет |
Да |
|
Надежность, ч |
130 000 |
170 000 |
110 000 |
120 000 |
110 000 |
|
Удобство в использовании |
плохо |
плохо |
отлично |
хорошо |
отлично |
Таблица 2.4 - Эксплуатационные характеристики станков второго вида
Станок |
ST21 |
ST22 |
ST23 |
ST24 |
ST25 |
|
Сервисное обслуживание |
Нет |
Да |
Нет |
Нет |
Да |
|
Надежность, ч |
170 000 |
180 000 |
170 000 |
200 000 |
150 000 |
|
Удобство в использовании |
очень хорошо |
отлично |
хорошо |
плохо |
отлично |
Задание представлено в таблице 2.5.
Таблица 2.5 - Вариант задания
Вариант |
Однокритериальная оптимизация |
Многокритериальная оптимизация |
|||||
метод |
параметр |
Метод экспертного анализа |
Число экспертов |
Метод отбора |
Выбор лучшего решения |
||
7 |
перебор |
произв. |
Саати |
1 |
Парето |
МАИ |
В курсовом проекте необходимо:
1) Разработать программное средство однокритериальной оптимизации по заданному критерию в рамках существующих ограничений (критерий согласно варианту).
Предусмотреть проверку решения методом полного перебора.
Оценить эффективность работы при возрастании числа альтернатив до 50-100.
2) Разработать программное средство многокритериальной оптимизации с учетом мнения одного или двух экспертов. Для этого необходимо:
- реализовать перевод качественных оценок в числовую форму по шкале Харрингтона;
- определить значимость (веса) критериев методом экспертного анализа (метод парных сравнений для группы экспертов);
- реализовать отбор бесперспективных альтернатив (Множество Парето);
- определить лучшую альтернативу методом анализа иерархий.
Оценить эффективность работы при возрастании числа альтернатив до 50-100.
2.2 Описание алгоритма решения задачи
Для однокритериальной оптимизации задача решается методом полного перебора.
Перебор - это простейший метод минимизации. Суть метода заключается в последовательном переборе элементов, имеющих различные значения интересующего параметра. В ходе перебора находится элемент, у которого значение параметра, интересующего нас, наиболее полно удовлетворяет требованиям. Главный недостаток данного метода - долгое время выполнения при больших количествах обрабатываемых элементов. Основная задача при реализации такого метода заключается в написании алгоритма, требующего наименьшее время на поиск решения.
Для решения задачи многокритериальной оптимизации необходимо выполнить несколько этапов. Рассмотрим их.
Изначально необходимо организовать обработку экспертных оценок по шкале Харрингтона. Диапазон значений приведён в таблице 2.6.
Таблица 2.6 Шкала Харрингтона
Качественные оценки |
Очень плохо |
Плохо |
Удовлетворительно |
Хорошо |
Отлично |
|
Количественные оценки |
0.0 - 0.2 |
0.2 - 0.36 |
0.36 - 0.63 |
0.63 - 0.8 |
0.8 - 1.0 |
Эксперт сравнивает критерии парами и выставляет каждому из них оценку. В результате получается матрица оценок, в которой содержатся оценки каждого критерия в сравнении с остальными.
Оценки «да» и «нет» так же переводятся в количественную форму оценки: 1 и 0, соответственно.
Остальные количественные оценки приводятся к безразмерной оценке путём деления количественной оценки на сумму всех количественных оценок необходимого критерия.
Оценки эксперта дают веса критериев и влияют на рассмотрение вариантов пары станков в дальнейшем.
Каждой альтернативе присваивается оценка, состоящая из суммы полученных безразмерных оценок. Самой подходящей альтернативой считается та альтернатива, которая набрала наибольшую оценку.
Применение принципа Эджворта-Парето позволяет из множества всех возможных исключить заведомо неприемлемые решения, то есть те, которые никогда не могут оказаться выбранными, если выбор осуществляется достаточно «разумно». После такого исключения остается множество, которое называют множеством Парето или областью компромиссов. Данная операция осуществляется перед началом расчётов, сразу после ввода исходных данных.
2.3 Графические схемы разработанного алгоритма
Рассмотрим одну из основных схем алгоритма созданного программного обеспечения - схему метода Саати, представленную в приложении В. Метод Саати предназначен для поиска весов критериев на основе оценок экспертов.
На рисунке 2.1 изображён алгоритм вычисления весов критерия.
Рисунок 2.1 - Схема алгоритма вычисления весов критериев
Данная схема состоит из трёх основных блоков: нахождение суммы оценок по каждому критерию, нахождение суммы всех оценок, нахождение веса критерия. В результате мы получаем массив весов критериев.
Затем необходимо найти общую сумму значений сформированного после работы предыдущего алгоритма массива. Реализация данных действий отражена в схеме алгоритма, представленной на рисунке 2.2.
Рисунок 2.2 - Заполнение массива безразмерными оценками
После выполнения данного алгоритма мы получаем числовой массив безразмерных оценок для каждого критерия каждой альтернативной пары, необходимых для дальнейшего получения итоговой оценки каждой альтернативной пары станков. Алгоритм вычисления итоговых оценок представлен на рисунке 2.3.
Рисунок 2.3 - Алгоритм получения итоговых оценок
После завершения работы представленных алгоритмов заполняется таблица с возможными альтернативами и наилучшим решением, исходя из оценок экспертов.
Наилучшее решение соответствует альтернативе, получившей наивысшую оценку.
3. РАЗРАБОТАННОЕ ПРИЛОЖЕНИЕ И РЕЗУЛЬТАТЫ ТЕСТОВЫХ ИСПЫТАНИЙ
3.1 Интерфейс пользователя
Для работы с разработанной программой не нужно иметь специальных навыков, достаточно лишь ознакомиться данной инструкцией.
Разработанное приложения позволяет проводить оптимизацию, принимать правильное решение при выборе пары станков из множества альтернатив. Для отображения информации о станках, а также для выполнения основных функций по однокритериальной и многокритериальной оптимизации был создан набор форм. Пользователь имеет возможность перейти к любому варианту оптимизации путём нажатия кнопки в стартовом меню программы сразу после её запуска.
Пример стартового меню изображён на рисунке 3.1.
Рисунок 3.1 - Стартовое меню программы
При выборе однокритериальной оптимизации откроется окно с вводом исходных данных. Пример изображён на рисунке 3.2.
Рисунок 3.2 - Пример окна однокритериальной оптимизации
После нажатия кнопки «Принять» исходные данные принимаются и становится доступна кнопка «Посчитать». Результатом нажатия на эту кнопку является оптимизация по параметру производительность. Пример окна изображён на рисунке 3.3.
Рисунок 3.3 - Вид окна однокритериальной оптимизации
При выборе многокритериальной оптимизации открывается окно с вводом экспертных оценок и исходных данных. Так же в открывшемся окне содержится информация о станках. Вид окна представлен на рисунке 3.4.
Рисунок 3.4 - Вид окна ввода экспертных оценок и исходных данных
Ввод оценок осуществляется при помощи выпадающего списка. Данная операция представлена на рисунке 3.5.
Рисунок 3.5 - Ввод экспертных оценок
При неполном заполнении матрицы экспертных оценок выдаётся соответствующее предупреждение. Приложение не продолжит работу, пока все оценки не будут выставлены. Пример предупреждения приведён на рисунке 3.6.
Рисунок 3.6 - Пример предупреждения
После ввода экспертных оценок и исходных данных и прохождения процедуры верификации введённых данных заполняется таблица возможных альтернатив на вкладке Решение. Пример приведён на рисунке 3.7.
Рисунок 3.7 - Пример заполнения таблицы возможных альтернатив
После нажатия кнопки «Решить» появляется подходящая альтернатива в поле «Решение», а в таблице «Возможные альтернативы» данная пара станков подсвечивается красным цветом. Пример изображён на рисунке 3.8.
Рисунок 3.8 - Пример полученного решения
Так же после нахождения оптимальной пары станков появляется кнопка «Сформировать отчёт». После её нажатия в папке с программой формируется файл report.txt с подробной информацией об исходных данных и полученном решении поставленной задачи. Пример файла-отчёта приведён на рисунке 3.9.
Рисунок 3.9 - Пример файла-отчёта о полученном решении
3.2 Тестовые испытания
В поставленной задаче в качестве исходных данных выступают технические характеристики двух типов станков по следующим шести критериям: производительность, энергоэффективность, стоимость станка, сервисное обслуживание, надёжность и удобство в использовании. По данным характеристикам и происходит выбор двух станков разного типа, но так же по условию задачи необходимо, чтобы станки соответствовали максимальным характеристикам по всем критериям и не должны превышать следующих ограничений: стоимость пары станков не должна превышать 1000 млн. рублей, максимальная потребляемая мощность не должна превышать 50000 кВт-ч в месяц, количество изготавливаемых изделий в год должно быть не менее 10000 штук в год, на изготовление изделия тратиться не более 200 часов в месяц. На основе всех вышеописанных данных производится отбор лучшей пары станков.
Для проверки правильности работы программы нужно сравнить работу приложения при однокритериальной и многокритериальной оптимизации. Причём, выбранному критерию в одномерной оптимизации должны быть выставлены максимальные оценки в многокритериальной оптимизации. Если результаты первых альтернатив совпадают, то можно утверждать, что приложение работает верно. Проведение верификации приложения представлено ниже.
Для начала проведём однокритериальную оптимизацию. По условию критерием оптимизации является производительность. Приложение выдаст результат, который приведён на рисунке 3.10.
Рисунок 3.10 - Результат однокритериальной оптимизации
Затем необходимо провести многокритериальную оптимизацию. После выполнения оптимизации приложение выдаст результат, который представлен на рисунке 3.11.
Рисунок 3.11 - Результат многокритериальной оптимизации
После выполнения оптимизаций необходимо сравнить полученные альтернативы станков. Но так как при многокритериальной оптимизации производительность пусть и основной критерий, но с учетом всех шести критериев результаты однокритериальной и многокритериальной оптимизации могут не совпадать, что мы и можем наблюдать в данном случае.
ЗАКЛЮЧЕНИЕ
В соответствии с заданием по курсовому проекту, было спроектировано и реализовано приложение, позволяющее производить однокритериальную и многокритериальную оптимизацию. Результаты работы данного приложения были хорошо проанализированы и была проведена успешная верификация полученных результатов, что даёт основания для использования данного приложения на практике.
Разработанное приложение содержит простой и интуитивно понятный пользовательский интерфейс.
Так же приложение позволяет, выводить не только самый лучший результат, но и остальные альтернативы, удовлетворяющие ограничениям, но имеющие более низкие показатели в интересующих критериях. Это позволяет хотя бы немного учитывать человеческий фактор при оптимизации.
Теоретическая значимость данного курсового проекта состоит в том, что были изучены методы многокритериальной оптимизации, такие как метод анализа иерархий, метод Саати, метод выбора множества Парето. Знание этих методов нужно не только для того, что бы писать приложения для оптимизации проектных решений, знание этих методов заставляет смотреть на принятие решений в нашей жизни более рационально, принимая во внимание все возможные факторы. Данная курсовая работа значительно расширила обзор в области принятия решения и показала, что даже в этой области может успешно применяться автоматизация.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Горбунов, В.М. Теория принятия решений. Учебное пособие / В.М. Горбунов. Томск: Национальный исследовательский томский политехнический университет, 2010. 67 с.
2. Матузко, Ю.О. Теория принятия решений. Учебно-методическое пособие / Ю.О. Матузко. Запорожье: Запорожская государственная инженерная академия, 2009. 61 с.
3. Лесин, В.В. Основы методов оптимизации / В.В. Лесин, Ю.П. Лисовец. - М.: Изд-во МАИ, 1995. - 344 с.
4. Информационные технологии оптимальных решений. Учебный курс для специальности «Государственное управление и экономика». Минск: Академия управления при Президенте Республики Беларусь, 2003. 241 с.
5. Шикин, Е. В. Исследование операций / Е. В. Шикин, Г. Е. Шикина. М.: ТК Велби, Изд-во Проспект, 2006. 280 с.
6. Саати, Т. Л. Принятие решений. Метод анализа иерархий / Т. Саати. М.: Радио и связь, 1993. 278 с.
7. Подиновский, В. В. Парето-оптимальные решения многокритериальных задач. / В. В. Подиновский, В. Д. Ногин. М.: Наука. Главная редакция, 2007. - 256 с.
ПРИЛОЖЕНИЕ
Листинг программы
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace OPR
{
public partial class Form1 : Form
{
int[,] proiz = new int[2, 5];
int[,] stoim = new int[2, 5];
double[,] effect = new double[2, 5];
int limit = 10000;
int hours = 200;
int money = 1000;
double energy = 50000;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
#region Чтение из файла
string temp;
StreamReader f = new StreamReader("input/stanki_proiz.txt");
int i = 0;
int j = 0;
while ((temp = f.ReadLine()) != null)
{
proiz[i, j] = Convert.ToInt32(temp);
j++;
if (j == 5)
{
i++;
j = 0;
}
if (i == 2) break;
}
string temp2;
StreamReader f2 = new StreamReader("input/stanki_stoim.txt");
int i2 = 0;
int j2 = 0;
while ((temp2 = f2.ReadLine()) != null)
{
stoim[i2, j2] = Convert.ToInt32(temp2);
j2++;
if (j2 == 5)
{
i2++;
j2 = 0;
}
if (i2 == 2) break;
}
string temp3;
StreamReader f3 = new StreamReader("input/stanki_effect.txt");
int i3 = 0;
int j3 = 0;
while ((temp3 = f3.ReadLine()) != null)
{
effect[i3, j3] = Convert.ToDouble(temp3);
j3++;
if (j3 == 5)
{
i3++;
j3 = 0;
}
if (i3 == 2) break;
}
#endregion
textBox1.Text = Convert.ToString(limit);
textBox2.Text = Convert.ToString(hours);
textBox3.Text = Convert.ToString(money);
textBox4.Text = Convert.ToString(energy);
}
private void button1_Click(object sender, EventArgs e)
{
limit = Convert.ToInt32(textBox1.Text);
hours = Convert.ToInt32(textBox2.Text);
money = Convert.ToInt32(textBox3.Text);
energy = Convert.ToInt32(textBox4.Text);
textBox1.ReadOnly = true;
textBox2.ReadOnly = true;
textBox3.ReadOnly = true;
textBox4.ReadOnly = true;
button1.Enabled = false;
button2.Enabled = true;
}
private void button2_Click(object sender, EventArgs e)
{
button2.Enabled = false;
int hours2 = hours * 12;
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
{
dataGridView1.Rows.Add();
dataGridView1.Rows[dataGridView1.RowCount - 1].Cells[0].Value = String.Format("ST1{0} + ST2{1}", (i + 1), (j + 1));
if (proiz[0, i] > proiz[1, j]) dataGridView1.Rows[dataGridView1.RowCount - 1].Cells[1].Value = hours2 * proiz[1, j];
else dataGridView1.Rows[dataGridView1.RowCount - 1].Cells[1].Value = hours2 * proiz[0, i];
dataGridView1.Rows[dataGridView1.RowCount - 1].Cells[2].Value = stoim[0, i] + stoim[1, j];
if (proiz[0, i] > proiz[1, j]) dataGridView1.Rows[dataGridView1.RowCount - 1].Cells[3].Value = hours * proiz[1, j] * (effect[0, i] + effect[1, j]);
else dataGridView1.Rows[dataGridView1.RowCount - 1].Cells[3].Value = hours * proiz[0, i] * (effect[0, i] + effect[1, j]);
}
for (int i = 0; i < dataGridView1.RowCount; i++)
{
if (Convert.ToDouble(dataGridView1.Rows[i].Cells[3].Value) <= energy && Convert.ToDouble(dataGridView1.Rows[i].Cells[1].Value) >= limit && Convert.ToDouble(dataGridView1.Rows[i].Cells[2].Value) <= money)
{
dataGridView2.Rows.Add();
dataGridView2.Rows[dataGridView2.RowCount - 1].Cells[0].Value = dataGridView1.Rows[i].Cells[0].Value;
dataGridView2.Rows[dataGridView2.RowCount - 1].Cells[1].Value = dataGridView1.Rows[i].Cells[1].Value;
dataGridView2.Rows[dataGridView2.RowCount - 1].Cells[2].Value = dataGridView1.Rows[i].Cells[2].Value;
dataGridView2.Rows[dataGridView2.RowCount - 1].Cells[3].Value = dataGridView1.Rows[i].Cells[3].Value;
}
}
if (dataGridView2.RowCount == 0) label6.Visible = true;
else
{
label5.Visible = true;
dataGridView2.Visible = true;
}
}
}
}
Листинг программы
Form2.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace OPR
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
double[,] marks1 = new double[6, 6]; //оценки экспертов
double[] k = new double[6]; // оценка для каждого притерия
double[,] ser = new double[2, 5]; // массив сервиса в безразмерной величине
double[,] ud = new double[2, 5]; // массив удобства в безразмерной величине
int[,] proiz = new int[2, 5]; //массив производительности
int[,] stoim = new int[2, 5]; // массив стоимости
double[,] effect = new double[2, 5]; //массив эффективности
string[,] serv = new string[2, 5]; // массив сервиса
int[,] nadej = new int[2, 5]; // массив надёжности
string[,] udob = new string[2, 5]; // массив удобства
int limit; // необходимая произв
int hours; // часов в месяц
int money; // денег на покупку
double energy; // кВт-ч в месяц
double[,] mas = new double[40, 40]; // массив безразмерных оценок
int t = 0;
#region Marks
private void comboBox1_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox1.Text);
comboBox11.Text = Convert.ToString(temp);
}
private void comboBox11_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox11.Text);
comboBox1.Text = Convert.ToString(temp);
}
private void comboBox2_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox2.Text);
comboBox12.Text = Convert.ToString(temp);
}
private void comboBox12_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox12.Text);
comboBox2.Text = Convert.ToString(temp);
}
private void comboBox5_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox5.Text);
comboBox13.Text = Convert.ToString(temp);
}
private void comboBox13_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox13.Text);
comboBox5.Text = Convert.ToString(temp);
}
private void comboBox3_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox3.Text);
comboBox16.Text = Convert.ToString(temp);
}
private void comboBox16_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox16.Text);
comboBox3.Text = Convert.ToString(temp);
}
private void comboBox6_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox6.Text);
comboBox15.Text = Convert.ToString(temp);
}
private void comboBox15_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox15.Text);
comboBox6.Text = Convert.ToString(temp);
}
private void comboBox8_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox8.Text);
comboBox14.Text = Convert.ToString(temp);
}
private void comboBox14_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox14.Text);
comboBox8.Text = Convert.ToString(temp);
}
private void comboBox4_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox4.Text);
comboBox17.Text = Convert.ToString(temp);
}
private void comboBox17_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox17.Text);
comboBox4.Text = Convert.ToString(temp);
}
private void comboBox7_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox7.Text);
comboBox18.Text = Convert.ToString(temp);
}
private void comboBox18_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox18.Text);
comboBox7.Text = Convert.ToString(temp);
}
private void comboBox9_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox9.Text);
comboBox19.Text = Convert.ToString(temp);
}
private void comboBox19_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox19.Text);
comboBox9.Text = Convert.ToString(temp);
}
private void comboBox10_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox10.Text);
comboBox20.Text = Convert.ToString(temp);
}
private void comboBox20_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox20.Text);
comboBox10.Text = Convert.ToString(temp);
}
private void comboBox40_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox40.Text);
comboBox30.Text = Convert.ToString(temp);
}
private void comboBox30_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox30.Text);
comboBox40.Text = Convert.ToString(temp);
}
private void comboBox29_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox29.Text);
comboBox39.Text = Convert.ToString(temp);
}
private void comboBox39_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox39.Text);
comboBox29.Text = Convert.ToString(temp);
}
private void comboBox38_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox38.Text);
comboBox25.Text = Convert.ToString(temp);
}
private void comboBox25_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox25.Text);
comboBox38.Text = Convert.ToString(temp);
}
private void comboBox24_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox24.Text);
comboBox37.Text = Convert.ToString(temp);
}
private void comboBox37_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox37.Text);
comboBox24.Text = Convert.ToString(temp);
}
private void comboBox31_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox31.Text);
comboBox21.Text = Convert.ToString(temp);
}
private void comboBox21_TabIndexChanged(object sender, EventArgs e)
{
double temp = 1 / Convert.ToDouble(comboBox21.Text);
comboBox31.Text = Convert.ToString(temp);
}
#endregion
private void Form2_Load(object sender, EventArgs e)
{
#region Чтение из файла
string temp;
StreamReader f = new StreamReader("input/stanki_proiz.txt");
int i = 0;
int j = 0;
while ((temp = f.ReadLine()) != null)
{
proiz[i, j] = Convert.ToInt32(temp);
j++;
if (j == 5)
{
i++;
j = 0;
}
if (i == 2) break;
}
string temp2;
StreamReader f2 = new StreamReader("input/stanki_stoim.txt");
int i2 = 0;
int j2 = 0;
while ((temp2 = f2.ReadLine()) != null)
{
stoim[i2, j2] = Convert.ToInt32(temp2);
j2++;
if (j2 == 5)
{
i2++;
j2 = 0;
}
if (i2 == 2) break;
}
string temp3;
StreamReader f3 = new StreamReader("input/stanki_effect.txt");
int i3 = 0;
int j3 = 0;
while ((temp3 = f3.ReadLine()) != null)
{
effect[i3, j3] = Convert.ToDouble(temp3);
j3++;
if (j3 == 5)
{
i3++;
j3 = 0;
}
if (i3 == 2) break;
}
string temp4;
StreamReader f4 = new StreamReader("input/stanki_serv.txt");
int i4 = 0;
int j4 = 0;
while ((temp4 = f4.ReadLine()) != null)
{
serv[i4, j4] = temp4;
j4++;
if (j4 == 5)
{
i4++;
j4 = 0;
}
if (i4 == 2) break;
}
string temp5;
StreamReader f5 = new StreamReader("input/stanki_nadej.txt");
int i5 = 0;
int j5 = 0;
while ((temp5 = f5.ReadLine()) != null)
{
nadej[i5, j5] = Convert.ToInt32(temp5);
j5++;
if (j5 == 5)
{
i5++;
j5 = 0;
}
if (i5 == 2) break;
}
string temp6;
StreamReader f6 = new StreamReader("input/stanki_udob.txt");
int i6 = 0;
int j6 = 0;
while ((temp6 = f6.ReadLine()) != null)
{
udob[i6, j6] = temp6;
j6++;
if (j6 == 5)
{
i6++;
j6 = 0;
}
if (i6 == 2) break;
}
#endregion
#region Альтернативные варианты
for (i = 0; i < 5; i++)
{
dataGridView1.Rows.Add();
dataGridView1.Rows[i].Cells[0].Value = String.Format("ST1{0}", (i + 1));
dataGridView1.Rows[i].Cells[1].Value = proiz[0,i];
dataGridView1.Rows[i].Cells[2].Value = stoim[0, i];
dataGridView1.Rows[i].Cells[3].Value = effect[0, i];
dataGridView1.Rows[i].Cells[4].Value = serv[0, i];
dataGridView1.Rows[i].Cells[5].Value = nadej[0, i];
dataGridView1.Rows[i].Cells[6].Value = udob[0, i];
}
for (i = 0; i < 5; i++)
{
dataGridView2.Rows.Add();
dataGridView2.Rows[i].Cells[0].Value = String.Format("ST2{0}", (i + 1));
dataGridView2.Rows[i].Cells[1].Value = proiz[1, i];
dataGridView2.Rows[i].Cells[2].Value = stoim[1, i];
dataGridView2.Rows[i].Cells[3].Value = effect[1, i];
dataGridView2.Rows[i].Cells[4].Value = serv[1, i];
dataGridView2.Rows[i].Cells[5].Value = nadej[1, i];
dataGridView2.Rows[i].Cells[6].Value = udob[1, i];
}
for (i = 0; i < 2; i++)
for (j = 0; j < 5; j++)
{
if (serv[i, j].CompareTo("Да") == 0) ser[i, j] = 1;
if (serv[i, j].CompareTo("Нет") == 0) ser[i, j] = 0;
}
for (i = 0; i < 2; i++)
for (j = 0; j < 5; j++)
{
if (udob[i, j].CompareTo("плохо") == 0) ud[i, j] = 0;
if (udob[i, j].CompareTo("хорошо") == 0) ud[i, j] = 0.33;
if (udob[i, j].CompareTo("очень хорошо") == 0) ud[i, j] = 0.66;
if (udob[i, j].CompareTo("отлично") == 0) ud[i, j] = 1;
}
#endregion
}
void upd()
{
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
{
if ( ((hours * 12 * proiz[1, j]) >= limit && (hours * 12 * proiz[0, i]) >= limit) && ((hours * proiz[0, i] * effect[0, i]) <= energy && (hours * proiz[1, j] * effect[1, j]) <= energy) && (stoim[0, i] + stoim[1, j]) < 1000 )
{
dataGridView3.Rows.Add();
dataGridView3.Rows[dataGridView3.RowCount - 1].Cells[0].Value = String.Format("ST1{0} + ST2{1}", (i + 1), (j + 1)); //nazvan
if (proiz[0, i] > proiz[1, j]) dataGridView3.Rows[dataGridView3.RowCount - 1].Cells[1].Value = proiz[1, j]; //----
else dataGridView3.Rows[dataGridView3.RowCount - 1].Cells[1].Value = proiz[0, i]; //proizv
dataGridView3.Rows[dataGridView3.RowCount - 1].Cells[2].Value = stoim[0, i] + stoim[1, j]; //stoim
dataGridView3.Rows[dataGridView3.RowCount - 1].Cells[3].Value = effect[0, i] + effect[1, j];
dataGridView3.Rows[dataGridView3.RowCount - 1].Cells[4].Value = (ser[0, i] + ser[1, j]) / 2;
if (nadej[0, i] > nadej[1, j]) dataGridView3.Rows[dataGridView3.RowCount - 1].Cells[5].Value = nadej[1, j]; //----
else dataGridView3.Rows[dataGridView3.RowCount - 1].Cells[5].Value = nadej[0, i];
dataGridView3.Rows[dataGridView3.RowCount - 1].Cells[6].Value = (ud[0, i] + ud[1, j]) / 2;
}
}
} // заполнение таблицы подходями по ограничениям альтернативами
private void button1_Click(object sender, EventArgs e)
{
upd(); // обращение к методу заполнения таблицы
// проверка на заполненность экспертных оценок
if (comboBox1.Text == "" || comboBox2.Text == "" || comboBox5.Text == "" || comboBox3.Text == "" || comboBox6.Text == "" || comboBox8.Text == "" || comboBox4.Text == "" || comboBox7.Text == "" || comboBox9.Text == "" || comboBox10.Text == "" || comboBox31.Text == "" || comboBox37.Text == "" || comboBox38.Text == "" || comboBox39.Text == "" || comboBox40.Text == "") MessageBox.Show("Заполните все поля оценок!");
else
{
limit = Convert.ToInt32(textBox1.Text);
hours = Convert.ToInt32(textBox2.Text);
money = Convert.ToInt32(textBox3.Text);
energy = Convert.ToInt32(textBox4.Text);
textBox1.ReadOnly = true;
textBox2.ReadOnly = true;
textBox3.ReadOnly = true;
textBox4.ReadOnly = true;
button1.Enabled = false;
button2.Enabled = true;
comboBox1.Enabled = false;
comboBox2.Enabled = false;
comboBox3.Enabled = false;
comboBox4.Enabled = false;
comboBox5.Enabled = false;
comboBox6.Enabled = false;
comboBox7.Enabled = false;
comboBox8.Enabled = false;
comboBox9.Enabled = false;
comboBox10.Enabled = false;
comboBox11.Enabled = false;
comboBox12.Enabled = false;
comboBox13.Enabled = false;
comboBox14.Enabled = false;
comboBox15.Enabled = false;
comboBox16.Enabled = false;
comboBox17.Enabled = false;
comboBox18.Enabled = false;
comboBox19.Enabled = false;
comboBox20.Enabled = false;
comboBox21.Enabled = false;
comboBox24.Enabled = false;
comboBox25.Enabled = false;
comboBox29.Enabled = false;
comboBox30.Enabled = false;
comboBox31.Enabled = false;
comboBox37.Enabled = false;
comboBox38.Enabled = false;
comboBox39.Enabled = false;
comboBox40.Enabled = false;
marks1[0, 0] = 1;
marks1[0, 1] = Convert.ToDouble(comboBox11.Text);
marks1[0, 2] = Convert.ToDouble(comboBox12.Text);
marks1[0, 3] = Convert.ToDouble(comboBox16.Text);
marks1[0, 4] = Convert.ToDouble(comboBox17.Text);
marks1[0, 5] = Convert.ToDouble(comboBox21.Text);
marks1[1, 0] = Convert.ToDouble(comboBox1.Text);
marks1[1, 1] = 1;
marks1[1, 2] = Convert.ToDouble(comboBox13.Text);
marks1[1, 3] = Convert.ToDouble(comboBox15.Text);
marks1[1, 4] = Convert.ToDouble(comboBox18.Text);
marks1[1, 5] = Convert.ToDouble(comboBox24.Text);
marks1[2, 0] = Convert.ToDouble(comboBox2.Text);
marks1[2, 1] = Convert.ToDouble(comboBox5.Text);
marks1[2, 2] = 1;
marks1[2, 3] = Convert.ToDouble(comboBox14.Text);
marks1[2, 4] = Convert.ToDouble(comboBox19.Text);
marks1[2, 5] = Convert.ToDouble(comboBox25.Text);
marks1[3, 0] = Convert.ToDouble(comboBox3.Text);
marks1[3, 1] = Convert.ToDouble(comboBox6.Text);
marks1[3, 2] = Convert.ToDouble(comboBox8.Text);
marks1[3, 3] = 1;
marks1[3, 4] = Convert.ToDouble(comboBox20.Text);
marks1[3, 5] = Convert.ToDouble(comboBox29.Text);
marks1[4, 0] = Convert.ToDouble(comboBox4.Text);
marks1[4, 1] = Convert.ToDouble(comboBox7.Text);
marks1[4, 2] = Convert.ToDouble(comboBox9.Text);
marks1[4, 3] = Convert.ToDouble(comboBox10.Text);
marks1[4, 4] = 1;
marks1[4, 5] = Convert.ToDouble(comboBox30.Text);
marks1[5, 0] = Convert.ToDouble(comboBox31.Text);
marks1[5, 1] = Convert.ToDouble(comboBox37.Text);
marks1[5, 2] = Convert.ToDouble(comboBox38.Text);
marks1[5, 3] = Convert.ToDouble(comboBox39.Text);
marks1[5, 4] = Convert.ToDouble(comboBox40.Text);
marks1[5, 5] = 1;
}
}
private void button2_Click(object sender, EventArgs e) //Reshenie
{
button2.Enabled = false;
for (int i = 0; i < 6; i++) // вычисление суммы оценок по каждому критерию
for (int j = 0; j < 6; j++)
k[i] = k[i] + marks1[i, j];
double ksum = 0; // сумма всех оценок
for (int j = 0; j < 6; j++)
ksum = k[j] + ksum;
for (int i = 0; i < 6; i++) // вычисление веса критерия
k[i] = k[i] / ksum;
label25.Visible = true;
label26.Visible = true;
label27.Visible = true;
label28.Visible = true;
label29.Visible = true;
label30.Visible = true;
label25.Text = Convert.ToString(k[0]);
label26.Text = Convert.ToString(k[1]);
label27.Text = Convert.ToString(k[2]);
label28.Text = Convert.ToString(k[3]);
label29.Text = Convert.ToString(k[4]);
label30.Text = Convert.ToString(k[5]);
double pro = 0;
double sto = 0;
double ene = 0;
double ser = 0;
double nad = 0;
double udo = 0;
for (int i = 0; i < dataGridView3.RowCount; i++) // нахождение суммарного значения по каждому критерию
{
pro = pro + Convert.ToDouble(dataGridView3.Rows[i].Cells[1].Value);
sto = sto + Convert.ToDouble(dataGridView3.Rows[i].Cells[2].Value);
ene = ene + Convert.ToDouble(dataGridView3.Rows[i].Cells[3].Value);
ser = ser + Convert.ToDouble(dataGridView3.Rows[i].Cells[4].Value);
nad = nad + Convert.ToDouble(dataGridView3.Rows[i].Cells[5].Value);
udo = udo + Convert.ToDouble(dataGridView3.Rows[i].Cells[6].Value);
}
for (int i = 0; i < dataGridView3.RowCount; i++) // заполнение массива безразмерных оценок
{
mas[i, 0] = Convert.ToDouble(dataGridView3.Rows[i].Cells[1].Value) / pro * k[0];
mas[i, 1] = Convert.ToDouble(dataGridView3.Rows[i].Cells[2].Value) / sto * k[1];
mas[i, 2] = Convert.ToDouble(dataGridView3.Rows[i].Cells[3].Value) / ene * k[2];
mas[i, 3] = Convert.ToDouble(dataGridView3.Rows[i].Cells[4].Value) / ser * k[3];
mas[i, 4] = Convert.ToDouble(dataGridView3.Rows[i].Cells[5].Value) / nad * k[4];
mas[i, 5] = Convert.ToDouble(dataGridView3.Rows[i].Cells[6].Value) / udo * k[5];
}
double tem = 0;
for (int i = 0; i < dataGridView3.RowCount; i++) // получение оценки для каждой альтернативы
{
tem = mas[i, 0] + mas[i, 1] + mas[i, 2] + mas[i, 3] + mas[i, 4] + mas[i, 5];
dataGridView3.Rows[i].Cells[7].Value = tem;
}
tem = Convert.ToDouble(dataGridView3.Rows[0].Cells[7].Value); // присваиваем временному значению первый элемент таблицы для поиска наилучшей альтернативы
Подобные документы
Выбор технологии, языка и среды программирования. Анализ процесса обработки информации и оценка структур данных для ее хранения. Разработка основных алгоритмов решения и структурной схемы программного продукта. Проектирование интерфейса пользователя.
курсовая работа [449,8 K], добавлен 14.01.2011Выбор технологии, языка и среды программирования. Анализ процесса обработки информации и выбор структур данных для ее хранения, разработка основных алгоритмов. Проектирование интерфейса пользователя. Выбор стратегии тестирования и разработка тестов.
курсовая работа [332,3 K], добавлен 09.12.2014Описание генетических алгоритмов. Применение генетического алгоритма для решения задачи коммивояжера. Постановка задачи безусловной оптимизации. Изучение распространения генетических алгоритмов на модель с несколькими взаимодействующими популяциями.
дипломная работа [979,1 K], добавлен 30.05.2015Описание использованных структур данных, характеристика процедур и функций. Структура приложения и интерфейс пользователя. Системные требования и имеющиеся ограничения. Тестирование приложения. Анализ временных характеристик и выводы по эффективности.
курсовая работа [3,3 M], добавлен 23.07.2012Основные особенности эволюционных алгоритмов. Описание алгоритмов селекции, мутации, скрещивания, применяемых для реализации генетических алгоритмов. Вычисление функции приспособленности. Программная реализация. Тестирование и руководство пользователя.
курсовая работа [1,3 M], добавлен 11.03.2014Анализ входной информации необходимой для решения задачи. Разработка исходных данных контрольного примера создания базы данных. Описание технологии и алгоритмов решения задачи и их математических реализаций. Разработка диалогов приложения пользователя.
курсовая работа [1,3 M], добавлен 26.04.2015Оптимизация решения задачи с помощью алгоритма отжига. Анализ теории оптимизации как целевой функции. Метод градиентного спуска. Переменные и описание алгоритма отжига. Представление задачи коммивояжера через граф. Сведение задачи к переменным и решение.
курсовая работа [784,0 K], добавлен 21.05.2015Исследование симметричных алгоритмов блочного шифрования. Минусы и плюсы алгоритма IDEA. Разработка программы аутентификации пользователя и сообщений на основе алгоритма IDEA. Выбор языка программирования. Тестирование и реализация программного средства.
курсовая работа [314,2 K], добавлен 27.01.2015Создание класса прямоугольников со сторонами, параллельными осям координат. Основные требования к программе. Описание классов и диаграмма их взаимодействия. Интерфейс пользователя и руководство по эксплуатации программы. Блок-схемы разработанных методов.
курсовая работа [622,8 K], добавлен 18.03.2011Описание технологии asp.net. Страницы веб-приложения, тестирование системы. Описание функциональной, динамической модели системы. Диаграммы вариантов использования, последовательности, база данных приложения. Реализация программы, интерфейс, тестирование.
курсовая работа [3,2 M], добавлен 30.01.2013