Автор: Пользователь скрыл имя, 12 Февраля 2013 в 23:40, курсовая работа
Целью данной работы является реализация на ЭВМ решения задачи оптимального распределения средств на расширение производства.
Задачи курсовой работы:
Рассмотреть теоретические аспекты решения задач динамического программирования; рекуррентность природы задач данного типа; принципы оптимальности Беллмана.
Разработка алгоритма. Блок - схемы. Структура алгоритма.
Реализация на ЭВМ разработанного алгоритма на выбранном языке программирования.
ВВЕДЕНИЕ ……………………………………………2
Динамическое программирование
Основные понятия …………………4
Принципы динамического программирования. Функциональные уравнения Беллмана …………………….5
Особенности задач динамического программирования……………….10
Задача распределения ресурсов……………………12
Общая постановка задачи ………………………….13
Блок схема программы
Структура алгоритма программы
Результат работы программы
Заключение
Список используемой литературы
return false;
}
}
}
}
return flag;
}
BOOL DataDlg::DestroyWindow()
{
for (int i = 0; i < Statics.GetSize(); i ++ )
{
CStatic * temp = Statics.GetAt(i);
if(temp->m_hWnd != NULL)
{
temp->DestroyWindow();
delete temp;
}
}
for (int i = 0; i< Cells.GetSize(); i ++ )
{
Cell * c = Cells.GetAt(i);
for (int j = 0; j < c -> Edits.GetSize(); j ++ )
{
CEdit * temp = c->Edits.GetAt(j);
if(temp->m_hWnd != NULL)
{
temp->DestroyWindow();
delete temp;
}
}
}
Statics.RemoveAll();
Cells.RemoveAll();
return CDialog::DestroyWindow();
}
void DataDlg::OnBnClickedOk()
{
if ( ! FillMatrix()) return; //если не все поля заполнены, выводим сообщение ошибки и ждем пока заполнит
int i = 0;
//
for (; i < Cells.GetSize(); i ++)
{
for (int j = 0; j < Cells.GetAt(i)->Edits.GetSize(
{
CString str;
CEdit * temp = Cells.GetAt(i)->Edits.GetAt(j)
temp->GetWindowText(str);
//заполним матрицу эффективности и вектор дистанций
int val = StringToInt(str);
if (i == 0)
{
distVector.push_back(val);
continue;
}
effMatrix[i-1][j] = val;
}
}
if ((distVector[1] - distVector[0])<=0)
{
MessageBox(L"Неправильные данные ресурсов", L"Ошибка", MB_ICONERROR | MB_OK);
return;
}
CDialog::OnOK();
}
courseWorkDlg.cpp
//условная оптимизация, формируем мартицу выхода (максимум функции цели)
void Ccourse_workDlg::
{
//выделаем память для матрицы
outMatrix = new Item*[QtObj];
for (int i = 0;i < QtObj; i ++) outMatrix[i] = new Item[QtRes];
//инициализируем матрицу
for (int i = 0; i < QtObj; i++)
{
for(int j = 0; j< QtRes; j++)
{
//для первого предприятия
if (i == 0)
{
Item cell;
cell.Value = Matrix[i][j];
cell.MaxIndex = ResVect[j];
cell.Index = j;
outMatrix[i][j] = cell;
Flag = true;
continue;
}
Item temp;
int step = j;
Item maxItem;
maxItem.Value = -1;
maxItem.MaxIndex = -1;
// уравнение Беллмана
for(int k = 0; k < j + 1; k++)
{
temp.Value = Matrix[i][k] + outMatrix[i-1][step].Value;
temp.MaxIndex = ResVect[k];
temp.Index = j;
--step;
//ищем максимальный элемент
if(maxItem.Value == -1 || maxItem.Value <= temp.Value) maxItem = temp;
}
outMatrix[i][j] = maxItem;
}
}
}
void Ccourse_workDlg::FreeMem(int **Matrix)
{
for(int i = 0; i<QtObj;i++) delete [] Matrix[i];
delete [] Matrix;
}
void Ccourse_workDlg::
{
DataDlg InputData;
int step;
static bool data = false, report = false;
CSpinButtonCtrl* Spin1 = (CSpinButtonCtrl*)GetDlgItem(
CSpinButtonCtrl* Spin2 = (CSpinButtonCtrl*)GetDlgItem(
QtObj= Spin1->GetPos();
QtRes= Spin2->GetPos();
if (!data)
{
InputData.Row = QtObj;
InputData.Column = QtRes;
//покажем диалог для ввода данных
if (InputData.DoModal() == IDOK)
{
//условная оптимизация (формируем матрицу максимума функции цели)
step = InputData.distVector[1] - InputData.distVector[0];
BuildOutMatrix(InputData.
//освобождаем память
FreeMem(InputData.effMatrix);
//безусловная оптимизация (формируем вектор результат)
resVector.reserve(QtObj); //резервируем память для вектора результатов
int j = InputData.distVector[QtRes-1]/
int start_step = InputData.distVector[QtRes-1];
for(int i = QtObj - 1; i >= 0; i--)
{
if(start_step == 0) break;
Result res;
res.Facility = i + 1;
res.Recource = outMatrix[i][j].MaxIndex;
int val = outMatrix[i][j].Value;
resVector.push_back(res);
//
j = (start_step - res.Recource) / step;
start_step -= res.Recource;
}
data = true;
}
}
GetDlgItem(IDC_SPIN1)->
GetDlgItem(IDC_SPIN2)->
m_but.EnableWindow(0);
Report reportDlg;
if (data)
{
reportDlg.Count = resVector.size();
for(int i = 0; i< resVector.size(); i++)
{
reportDlg.object[i] = resVector[i].Facility;
reportDlg.resource[i] = resVector[i].Recource;
}
if(reportDlg.DoModal() == IDOK)
{
CDialogEx::OnCancel();
}
}
}
//освобождаем ресурсы
BOOL Ccourse_workDlg::
{
DataDlg InputData;
if(Flag)
{
for(int i = 0; i< QtObj; i++) delete [] outMatrix[i];
delete [] outMatrix;
}
if (! InputData.distVector.empty()) InputData.distVector.~vector<i
if (! resVector.empty()) resVector.~vector<Result>();
return CDialogEx::DestroyWindow();
}
Report.cpp
Вывод отчета
BOOL Report::OnInitDialog()
{
CDialog::OnInitDialog();
// object = new int[Count];
//resource = new int [Count];
Ccourse_workDlg workDlg;
CSize sz(80,60);
CRect WindowRect;
GetWindowRect(&WindowRect);
ScreenToClient(&WindowRect);
int TableWidth = sz.cx * 2;
if (TableWidth < WindowRect.Width())
{
//ищем стартовую точку
int x = (WindowRect.Width() - TableWidth) / 2;
int y = 30;
//рисуем шапку
CRect rect1 (CPoint(x,y),sz);
CStatic *st = new CStatic();
st->Create(L"№ объекта", WS_CHILD|WS_VISIBLE|SS_CENTER|
Statics.Add(st);
CRect rect2 (CPoint(x + sz.cx,y),sz);
CStatic *st1 = new CStatic();
st1->Create(L"Ресурсы", WS_CHILD|WS_VISIBLE|SS_CENTER|
Statics.Add(st1);
//
y += sz.cy;
CRect rct (CPoint(x,y),sz);
int cnt = Count;
for(int i = 0; i < Count; i ++)
{
CString str;
str.Format(L"%d",object[i]);
for (int j = 0; j < 2; j++)
{
CStatic * stat = new CStatic();
stat->Create(str,WS_CHILD|WS_
Statics.Add(stat);
rct.MoveToX(x + sz.cx);
str = " ";
str.Format(L"%d",resource[i]);
}
y += sz.cy;
rct.MoveToXY(CPoint(x,y));
}
int a = 0;
}
return TRUE; // return TRUE unless you set the focus to a control
// Исключение: страница свойств OCX должна возвращать значение FALSE
}
Очистка ресурсов
BOOL Report::DestroyWindow()
{
for (int i = 0; i < Statics.GetSize(); i ++ )
{
CStatic * temp = Statics.GetAt(i);
if(temp->m_hWnd != NULL)
{
temp->DestroyWindow();
delete temp;
}
}
Statics.RemoveAll();
return CDialog::DestroyWindow();
}
Заключение
В ходе выполнения курсовой работы были
рассмотрены теоретические
FN(x0) = (z1(x0, u1) + FN-1(x1)), (9)
где FN(x0), FN-1(x1) – соответственно условно-оптимальные значения функции цели на всех N этапах, N-1 этапах; zi(xi-1, ui) – значение функции цели на i-том этапе.
Последнее выражение называется рекуррентным уравнением Беллмана. Отчетливо просматривается их рекуррентный характер, т. е. для нахождения оптимального управления на N шагах нужно знать условно-оптимальное управление на предшествующих N – 1 этапах и т. д
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
Информация о работе Оптимальное распределение ресурсов методом динамического программирования