- •Содержание
- •Введение
- •1 Постановка задачи оптимизации закупки топлива авиакомпанией
- •1.1 Качественное описание задачи
- •1.2 Концептуальная модель задачи
- •1.3 Математическая постановка задачи
- •2 Алгоритмизация решения задачи оптимизации закупки топлива авиакомпанией
- •2.1 Методы нахождения опорного и оптимального решения транспортной задачи
- •2.2 Описание венгерского метода нахождения оптимального плана
- •2.3 Описание алгоритма нахождения опорного плана методом северо-западного угла
- •2.4 Описание алгоритма нахождения оптимального плана распределительным методом
- •2.5 Проектирование сценария диалога
- •2.6 Описание структур данных
- •2.7 Описание программной системы «Оптимизация закупки топлива авиакомпанией»
- •2.8 Структурная схема сценария диалога и описание его программной реализации
- •2.9 Структурная схема алгоритмов метода северо-западного угла и распределительного и описание их программной реализации
- •2.10 Структурная схема алгоритмов ведения файловых архивов, графического представления результатов и их программная реализация
- •3. Численные эксперименты
- •3.1 Ручная реализация метода северо-западного угла и распределительного
- •3.2 Ручная реализация венгерского метода
- •3.3 Машинные эксперименты с программной системой
- •3.4 Качественная интерпретация полученных результатов
- •Заключение
2.6 Описание структур данных
Структура данных программы описана в таблице 2.1
Таблица 2.1 – Структуры данных программы
№ п/п |
Иден-тифи-катор |
Тип |
Размер, Бит |
Назначение |
1 |
a |
double[] |
64 * a.Count |
Содержит запасы поставщиков. |
2 |
b |
double[] |
64 * b.Count |
Содержит нужды потребителей. |
3 |
с |
double[][] |
64 * b.Count * a.Count |
Содержит матрицу стоимостей. |
4 |
x |
double[][] |
64 * b.Count * a.Count |
Содержит матрицу перевозок. |
5 |
f |
double[][] |
64 * b.Count * a.Count |
Содержит матрицу, отмечающую положение базисных элементов. |
6 |
quanOfVar |
int |
32 |
Содержит количество базисных элементов, которое нужно добавить к плану. |
7 |
bal |
int |
32 |
Содержит разницу между суммарным запасом поставщиков и суммарной потребности потребителей. |
8 |
is1r1c |
bool |
1 |
Отражает факт нахождения в определённом свободном элементе матрицы перевозок наличие на этой строке и на этом столбце более одного базисного элемента. |
9 |
isopt |
bool |
1 |
Отражает факт положительности цен циклов пересчётов до данного. |
10 |
isNegative |
bool |
1 |
Отражает факт отрицательности данного цикла пересчёта. |
11 |
numofmatr |
int |
32 |
Содержит количество итераций, за которое была решена задача. |
12 |
numofc |
int |
32 |
Содержит количесво посчитанных циклов пересчёта. |
13 |
circle |
List<Point> |
64*length |
Содержит цикл пересчёта |
2.7 Описание программной системы «Оптимизация закупки топлива авиакомпанией»
Программа «Оптимизация закупки топлива авиакомпанией» производит на основании введённых данных: матрицы стоимостей, запасов поставщиков и потребностей потребителей, - вычисление оптимального плана перевозок топлива связкой методов: северо-западного угла и распределительного.
Данная программа разработана на Intel-Совместимом компьютере с операционной системой Windows 7 на языке программирования C# с помощью среды разработки Microsoft Visual Studio 2010.
Внешний вид программного интерфейса показан на рисунке 2.2
Рисунок 2.2 – Интерфейс программы
Интерфейс программы имеет три поля ввода и одно поле вывода, а также четыре кнопки. Функционал программы:
- Расчёт опорного плана методом северо-западного угла и оптимального плана распределительным методом
- Выдача оптимального плана на экран, а также количества проделанных итераций и высчитанных циклов пересчёта.
- Сохранение начальных условий
- Загрузка начальных условий
- Сохранение результата
Инструкция по использованию программы:
Для выдачи результата достаточно ввести данные в первые три поля и нажать на кнопку «Выполнить отчёт», однако данные нужно ввести в определённой форме:
Векторы запасов и потребностей вводятся в поля «Поставщики» и «Потребители» по правилу:
<число 1>\n
<число 2>\n
<число 3>\n
…
<число m>
Где \n – перенос строки (нажатие клавиши Enter).
Как видно из примера, значения отделяются знаком переноса без пробелов. Кроме того, знак переноса после последнего элемента не ставится.
Матрица стоимостей вводится в одноимённое поле по правилу:
<число 1 1>*<число 1 2>*…*<число 1 n>\n
<число 2 1>*<число 2 2>*…*<число 2 n>\n
<число 3 1>*<число 3 2>*…*<число 3 n>\n
…
<число m 1>*<число m 2>*…*<число m n>
Где \n – перенос строки (нажатие клавиши Enter);
* - нажатие клавиши «Пробел».
Как видно из примера, строки отделяются знаком переноса без пробелов. Кроме того, знак переноса после последней строки не ставится. Элементы строки разделяются одним пробелом. Пробел после последнего элемента строки не ставится.
Десятичная дробь вводится со знаком «,» (запятая).
Помимо корректности ввода нужно следить за выполнением математических взаимосвязей. Количество строк матрицы стоимостей должно соответствовать количеству поставщиков, а количество столбцов – количеству потребителей. Также должно выполняться условие (2.1) (Сбалансированность задачи). Если задача несбалансированна, нужно провести операции по балансировке, приведённые в подразделе 1.
Если все условия выполнены, в поле ответ будет высвечен результат (Структура результата показана в подразделе 10).
