Автор: Пользователь скрыл имя, 12 Февраля 2013 в 23:40, курсовая работа
Целью данной работы является реализация на ЭВМ решения задачи оптимального распределения средств на расширение производства.
Задачи курсовой работы:
Рассмотреть теоретические аспекты решения задач динамического программирования; рекуррентность природы задач данного типа; принципы оптимальности Беллмана.
Разработка алгоритма. Блок - схемы. Структура алгоритма.
Реализация на ЭВМ разработанного алгоритма на выбранном языке программирования.
ВВЕДЕНИЕ ……………………………………………2
Динамическое программирование
Основные понятия …………………4
Принципы динамического программирования. Функциональные уравнения Беллмана …………………….5
Особенности задач динамического программирования……………….10
Задача распределения ресурсов……………………12
Общая постановка задачи ………………………….13
Блок схема программы
Структура алгоритма программы
Результат работы программы
Заключение
Список используемой литературы
Дадим математическую
формулировку принципа оптимальности.
Для простоты будем считать, что
начальное x0 и конечное xT состояния системы заданы.
Обозначим через z1(х0, u1) значение функции
цели на первом этапе при начальном состоянии
системы x0 и при управлении u1, через z2(х1,u2) – соответствующее
значение функции цели только на втором
этапе, ..., через
zi(хi-1,ui)
– на i-м этапе, ..., через zN(хN-1, uN) —на N-м этапе. Очевидно, что
Z = = (1)
Надо найти оптимальное управление u*= ( ; ;...; ), такое, что доставляет экстремум целевой функции (1) при ограничениях .
Для решения этой задачи погружаем ее в семейство подобных. Введем обозначения. Пусть – соответственно области
определения для подобных
задач на последнем этапе, двух последних
и т. д.;
– область определения исходной задачи.
Обозначим через F1(xN-1), F2(xN-2), …, Fk(xN-k), …, FN(x0) соответственно условно-оптимальные
значения функции цели на последнем этапе,
двух последних и т. д., на k последних и т. д., на всех N этапах.
Начинаем с последнего этапа. Пусть хN-1 – возможные состояния системы на начало N-го этапа. Находим:
F1(xN-1) = zN(xN-1, uN). (2)
Для двух последних этапов получаем
F2(xN-2) = (ZN-1(xN-2, uN-1) + F1(xN-1)). (3)
Аналогично:
F3(xN-3) = (ZN-2(xN-3, uN-2) + F2(xN-2)). (4)
………………………………………………….
Fk(xN-k) = (zN-k+1(xN-k, uN-k+1) + Fk-1(xN-k+1)). (5)
…………………………………………………..
FN(x0) = (z1(x0, u1) + FN-1(x1)). (6)
Выражение (6) представляет собой математическую запись принципа оптимальности. Выражение (5) – общая форма записи условно-оптимального значения функции цели для k оставшихся этапов. Выражения (2) – (6) называются функциональными уравнениями Беллмана. Отчетливо просматривается их рекуррентный (возвратный) характер, т. е. для нахождения оптимального управления на N шагах нужно знать условно-оптимальное управление на предшествующих N – 1 этапах и т. д. Поэтому функциональные уравнения часто называют рекуррентными (возвратными) соотношениями Беллмана.
На основании выше сказанного можно выделить следующие особенности задач динамического программирования.
Любую допустимую последовательность действий для каждого шага, переводящую систему из начального состояния в конечное, называют стратегией управления. Стратегия управления, в результате которой можно получить экстремальное значение функции цели, называется оптимальной.
Геометрическая интерпретация задачи динамического программирования состоит в следующем. Пусть n – размерность пространства состояний. В каждый момент времени координаты системы имеют вполне определенное значение. С изменением времени t могут изменяться значения координат вектора состояния. Назовем переход системы из одного состояния в другое траекторией ее движения в пространстве состояний. Такой переход осуществляется воздействием на координаты состояния. Пространство, в котором координатами служат состояния системы, называется фазовым. Особенно наглядно задачу динамического программирования можно интерпретировать в случае, если пространство состояний двухмерно. Область возможных состояний в этом случае изобразится некоторой фигурой , начальное и конечное состояния системы – точками х0, , (рис. 1). Управление – это воздействие, переводящее систему из начального состояния в конечное. Для многих экономических задач не известно начальное либо конечное состояние, а известна область X0 или XT, которой эти точки принадлежат.
Рисунок 1
Тогда допустимые управления переводят точки из области Х0 в XT. Задача динамического программирования геометрически может быть сформулирована следующим образом: найти такую фазовую траекторию, начинающуюся в области Х0 и оканчивающуюся в области ХT, для которой функция цели достигает экстремального значения. Если в задаче динамического программирования известны начальное и конечное состояния, то говорят о задаче с закрепленными концами. Если известны начальные и конечные области, то говорят о задаче со свободными концами.
2.1 Общая постановка задачи
Рассмотрим применение метода динамического программирования на примере распределения средств между шестью объектами реконструкции предприятия горводоканала:
1. Центральная насосно-
2. Восточная насосно-
3. Водопроводная насосная
4. Центральная станция аэрации;
5. Восточная станция аэрации;
6. Загородная станция аэрации.
Общая сумма средств, предоставленная
на развитие составляет не более 195 тысяч
гривен. На основе технико-экономических
расчетов установлено, что в результате
реконструкции в зависимости
от количества потраченных средств
объекты будут иметь
Таблица 1.1 Входные данные продуктивности объектов реконструкции
Порядковый номер объекта |
Объем ресурсов, выданных на развитие объектов (тыс. грн.) | |||||||||||||
0 |
15 |
30 |
45 |
60 |
75 |
90 |
105 |
120 |
135 |
150 |
165 |
180 |
195 | |
Продуктивность объектов результате развития (тыс. м3) | ||||||||||||||
1 |
2250 |
3300 |
3320 |
3330 |
3340 |
3350 |
3360 |
4400 |
4430 |
4440 |
4450 |
4460 |
4470 |
4490 |
2 |
1100 |
2200 |
3300 |
3350 |
4400 |
5500 |
7700 |
9900 |
11100 |
11440 |
11450 |
11500 |
11600 |
11610 |
3 |
3330 |
4450 |
4460 |
4470 |
5520 |
5530 |
5540 |
5550 |
5560 |
5570 |
5580 |
6600 |
6620 |
6630 |
4 |
1160 |
2260 |
3310 |
3360 |
3370 |
4410 |
4430 |
4440 |
4460 |
4480 |
5500 |
5510 |
5570 |
6610 |
5 |
8850 |
11230 |
22010 |
22090 |
33170 |
33750 |
44000 |
44010 |
55000 |
55050 |
55100 |
55200 |
55300 |
55400 |
6 |
445 |
547 |
669 |
881 |
993 |
1105 |
1117 |
1129 |
1141 |
1153 |
1165 |
1177 |
1189 |
2201 |
Рисунок 1. Основная программа
QtObj – количество объектов
QtRes – количество ресурсов
effMatrix - матрица
distVector – вектор выделенных ресурсов
нет да
Шаг 1. Условная оптимизация
Шаг 2. Безусловная оптимизация
I = QtObj-1,0 формируем вектор результат
да нет
Рисунок 2. Ввод данных
да нет
если все элементы матрицы введены
да нет
если вектор производительности- не
отрицательный
Рисунок 3. Условная оптимизация,
формируем мартицу выхода (максимум функции цели)
нет да Если первое предприятие
нет
Поиск максимума
нет
да maxItem = temp; outMatrix[i][j] = maxItem
Переменные члены класса.
//вектор для хранения объема ресурсов
std::vector<int> distVector;
//матрица производительности объектов
int** effMatrix;
//функция перевода строки в число
int StringToInt(CString);
//функция
проверки корректности
BOOL FillMatrix();
//функция очистки ресурсов, после закрытия окна
virtual BOOL DestroyWindow();
//функция инициализации диалога
virtual BOOL OnInitDialog();
Переменные члены класса
struct Item
{
int Value; //значение производительности
int MaxIndex;// максимальный индекс в векторе ресурсов
};
struct Result
{
int Facility;//предприятие
int Recource;//выделенный ресурс
};
Item ** outMatrix; //матрица максимума цели
std::vector<Result> resVector; //вектор результатов
void BuildOutMatrix(int **,std::vector<int>);//функция формирования матрицы цели (условная оптимизация)
afx_msg void
OnBnClickedButton1();//
virtual BOOL DestroyWindow();//очистка ресурсов программы
Назначение данного класса – это вывод вектора результата в табличной форме.
2.4 Результаты работы программы
Начальный ввод данных
Корректный ввод данных
Показ результата
Пример 2.
Результат работы программы
Пример 3.
Начальный ввод данных
Ввод продуктивности объектов
Отчет
Приложение.
Листинг программы
DataDlg.cpp
int DataDlg::StringToInt(CString str)
{
const wchar_t* s = T2CW(str);
int val = _wtoi(s);
return val;
}
// все поля заполнены ?
BOOL DataDlg::FillMatrix()
{
bool flag = true;
for (int i = 0; i < Cells.GetSize(); i ++){
for (int j = 0 ; j < Cells.GetAt(i)->Edits.GetSize(
CString str;
CEdit * temp = Cells.GetAt(i)->Edits.GetAt(j)
if (temp->m_hWnd != NULL){
temp->GetWindowText(str);
if (str.IsEmpty()){
MessageBox(L"Нужно заполнить все поля", L"Ошибка", MB_ICONERROR | MB_OK);
Информация о работе Оптимальное распределение ресурсов методом динамического программирования