Оптимальное распределение ресурсов методом динамического программирования

Автор: Пользователь скрыл имя, 12 Февраля 2013 в 23:40, курсовая работа

Описание работы

Целью данной работы является реализация на ЭВМ решения задачи оптимального распределения средств на расширение производства.
Задачи курсовой работы:
Рассмотреть теоретические аспекты решения задач динамического программирования; рекуррентность природы задач данного типа; принципы оптимальности Беллмана.
Разработка алгоритма. Блок - схемы. Структура алгоритма.
Реализация на ЭВМ разработанного алгоритма на выбранном языке программирования.

Содержание

ВВЕДЕНИЕ ……………………………………………2
Динамическое программирование
Основные понятия …………………4
Принципы динамического программирования. Функциональные уравнения Беллмана …………………….5
Особенности задач динамического программирования……………….10
Задача распределения ресурсов……………………12
Общая постановка задачи ………………………….13
Блок схема программы
Структура алгоритма программы
Результат работы программы
Заключение
Список используемой литературы

Работа содержит 1 файл

курсак.xlsx.docx

— 1.03 Мб (Скачать)

Дадим математическую формулировку принципа оптимальности. Для простоты будем считать, что  начальное x0 и конечное xT состояния системы заданы. Обозначим через z10, u1) значение функции цели на первом этапе при начальном состоянии системы x0 и при управлении u1, через z21,u2) – соответствующее значение функции цели только на втором этапе, ..., через 
zii-1,ui) – на i-м этапе, ..., через zNN-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 этапах и т. д. Поэтому функциональные уравнения часто называют рекуррентными (возвратными) соотношениями Беллмана.

    1. Особенности задач динамического программирования

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

  • Рассматривается система, состояние которой на каждом шаге определяется вектором xt. Дальнейшее изменение ее состояния зависит только от данного состояния xt и не зависит от того, каким путем система пришла в это состояние. Такие процессы называются процессами без последействия.
  • На каждом шаге выбирается одно решение ut, под действием которого система переходит из предыдущего состояния xt-1 в новое хt. Это новое состояние является функцией состояния на начало интервала xt-1 и принятого в начале интервала решения ut, т. е. xt = xt(xt-1,ut).
  • Действие на каждом шаге связано с определенным выигрышем (доходом, прибылью) или потерей (издержками), которые зависят от состояния на начало шага (этапа) и принятого решения.
  • На векторы состояния и управления могут быть наложены ограничения, объединение которых составляет область допустимых решений .
  • Требуется найти такое допустимое управление ut для каждого шага t, чтобы получить экстремальное значение функции цели за все Т шагов.

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

Геометрическая  интерпретация задачи динамического  программирования состоит в следующем. Пусть n – размерность пространства состояний. В каждый момент времени координаты системы имеют вполне определенное значение. С изменением времени t могут изменяться значения координат вектора состояния. Назовем переход системы из одного состояния в другое траекторией ее движения в пространстве состояний. Такой переход осуществляется воздействием на координаты состояния. Пространство, в котором координатами служат состояния системы, называется фазовым. Особенно наглядно задачу динамического программирования можно интерпретировать в случае, если пространство состояний двухмерно. Область возможных состояний в этом случае изобразится некоторой фигурой , начальное и конечное состояния системы – точками х0, , (рис. 1). Управление – это воздействие, переводящее систему из начального состояния в конечное. Для многих экономических задач не известно начальное либо конечное состояние, а известна область X0 или XT, которой эти точки принадлежат.

Рисунок 1

Тогда допустимые управления переводят точки  из области Х0 в XT. Задача динамического программирования геометрически может быть сформулирована следующим образом: найти такую фазовую траекторию, начинающуюся в области Х0 и оканчивающуюся в области ХT, для которой функция цели достигает экстремального значения. Если в задаче динамического программирования известны начальное и конечное состояния, то говорят о задаче с закрепленными концами. Если известны начальные и конечные области, то говорят о задаче со свободными концами.

    1. ЗАДАЧА РАСПРЕДЕЛЕНИЯ РЕСУРСОВ

2.1 Общая постановка задачи

  Рассмотрим применение метода динамического программирования на примере распределения средств между шестью объектами реконструкции предприятия горводоканала:

1. Центральная насосно-фильтровальная  станция;

2. Восточная насосно-фильтровальная  станция;

3. Водопроводная насосная станции  перекачки;

4. Центральная станция аэрации;

5. Восточная станция аэрации;

6. Загородная станция аэрации.

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

 

 

 

 

 

 

 

Таблица 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. Блок схема программы

Рисунок 1. Основная программа



          QtObj – количество объектов


          QtRes – количество ресурсов



effMatrix  - матрица                                        производительности объектов,


distVector – вектор выделенных              ресурсов



нет  да


 

 Шаг 1. Условная оптимизация


 

 

 


 Шаг 2. Безусловная оптимизация


 I = QtObj-1,0 формируем вектор результат



 


 

да нет


 

 

 

 

 

Рисунок 2. Ввод данных

                                                           distVector – вектор дистанций,               effMatrix = матрица производительности




 


      


 

да нет



 если все элементы матрицы введены


да  нет


если  вектор   производительности- не

отрицательный

 

 

 

 

 

 

 

 

 

 

 

 

Рисунок 3. Условная оптимизация,

формируем мартицу выхода (максимум функции  цели)


                                                               outMatrix – матрица максимума цели

                                            QtObj – количество объектов

                                           QtRes – количество ресурсов

                                                        Matrix – матрица производительности

                                                  distVect – вектор дистанций (вектор  ресурсов)








 нет да Если первое предприятие


 


 


 

 нет


 



 

 


Поиск максимума

 нет


 

 да maxItem = temp; outMatrix[i][j] = maxItem


    1. Структура алгоритма программы
      1. Ввод данных – класс DataDlg.

Переменные члены класса.

          //вектор для хранения объема  ресурсов

         std::vector<int> distVector;

 

   //матрица производительности объектов 

               int**  effMatrix;

 

          //функция  перевода строки в число

           int  StringToInt(CString);

 

          //функция  проверки корректности введенных  данных

            BOOL FillMatrix();

 

           //функция  очистки ресурсов, после закрытия  окна

            virtual BOOL DestroyWindow();

     

           //функция  инициализации диалога

              virtual BOOL OnInitDialog();

 

 

      1. Вычисление результатов – основной класс программы courseWorkDlg

Переменные члены  класса

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();//очистка ресурсов программы

 

      1. Вывод результатов класс Report

Назначение данного класса – это вывод вектора результата в табличной форме.

 

2.4 Результаты работы программы

Начальный ввод данных

 

 

 

 

 

 

 

 

 

    1. Ввод данных о продуктивности объектов реконструкции
        1. Если не все поля заполнены

        1. Если введен неправильный символ

 

 

Корректный ввод данных

Показ результата

 

 

 

Пример 2.

      1. Ввод данных

Результат работы программы

 

 

 

 

Пример 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(); j ++){

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);

Информация о работе Оптимальное распределение ресурсов методом динамического программирования