Автор: Пользователь скрыл имя, 18 Сентября 2011 в 21:13, курсовая работа
Целью данной работы является реализация на ЭВМ решения задачи оптимального распределения средств на расширение производства.
Задачи курсовой работы:
Рассмотреть теоретические аспекты решения задач динамического программирования; рекуррентность природы задач данного типа; принципы оптимальности Беллмана.
Разработка алгоритма. Блок - схемы. Структура алгоритма.
Реализация на ЭВМ разработанного алгоритма на выбранном языке программирования
ВВЕДЕНИЕ 3
1. ДИНАМИЧЕСКОЕ ПРОГРАММИРОВАНИЕ 4
1.1. Основные понятия 4
1.2. Принципы динамического программирования. Функциональные уравнения Беллмана 4
1.3. Особенности задач динамического программирования 8
1.4. Примеры задач динамического программирования. 10
2. ЗАДАЧА РАСПРЕДЕЛЕНИЯ РЕСУРСОВ 12
2.1. Общая постановка задачи. 12
2.2. Пример задачи распределения ресурсов 14
ЗАКЛЮЧЕНИЕ 18
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 19
ПРИЛОЖЕНИЕ А 20
ПРИЛОЖЕНИЕ В 25
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 этапах и т. д
Также в работе приведен числовой пример задачи распределения ресурсов. Структура алгоритма решения таких задач представлена в блок-схемах (см. Приложение А), используя которые опытный программист сможет реализовать этот алгоритм на любом языке программирования. В частности в данной работе представлена реализация задачи на языке программирования Pascal (см. Приложение В). В дальнейшем планируется реализация данного метода на более сложных языках.
Таким
образом, одним из самых эффективных
способов решения задачи распределения
ресурсов является метод динамического
программирования, который легок
в понимании и прост в
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ПРИЛОЖЕНИИЕ А
Рисунок 1 – Основная программа
Рисунок 2 – Процедура ввода данных
Рисунок
3 – Функция Поиск максимального
элемента (вектор, индекс_максимального_элемента)
Рисунок 4 – Функция Z
Рисунок 5 – Функция F
Рисунок
5 – Процедура построения матрицы_результат
Рисунок 6 – Процедура вывода данных
ПРИЛОЖЕНИЕ В
program Kurs;
uses
Crt;
const
MAX_MATRIX_ROWS_COUNT = 40;
MAX_MATRIX_COLS_COUNT = 100;
MAX_VECTOR_SIZE = MAX_MATRIX_COLS_COUNT;
type
DMatrix = record
rows : word;
cols : word;
items : array[1..MAX_MATRIX_ROWS_
end;
DVector = record
size : word;
items : array[1..MAX_VECTOR_SIZE] of real;
end;
TCell = record
indexOfMax : word;
value : real;
end;
TOutMatrix = record
rows : word;
cols : word;
items : array[1..MAX_MATRIX_ROWS_
end;
var
step : real;
effMatrix : DMatrix;
distVector : DVector;
outMatrix
: TOutMatrix;
{-----------------------------
procedure DataInput(path : string);
var
i : word;
j : word;
inFile : Text;
elem : real;
s : string;
begin
Assign(inFile, path);
Reset(inFile);
Writeln('Условие:');
repeat
Readln(inFile, s);
Writeln(s);
until (s = '');
Writeln('Начальные данные:');
i := 0;
while not(Eof(inFile)) do
begin
inc(i);
j := 0;
Read(inFile, elem);
distVector.items[i] := elem;
Write(elem:3:0, ' | ');
while not(Eoln(inFile)) do
begin
inc(j);
Read(inFile, elem);
effMatrix.items[i, j] := elem;
Write(elem:3:0, ' ');
end;
Readln(inFile);
Writeln;
end;
effMatrix.rows := i;
effMatrix.cols := j;
distVector.size := i;
step := distVector.items[2] - distVector.items[1];
Close(inFile);
Writeln;
end;
{-----------------------------
function GetMaxItem(vector : DVector; var indexOfMax : word) : real;
var
i : word;
max : real;
begin
max := -1e-20;
for i := 1 to vector.size do
if (vector.items[i] > max)
then
begin
max := vector.items[i];
indexOfMax := i;
end;
GetMaxItem := max;
end;
{-----------------------------
function FunctionZ(x : real; order : word) : real;
var
i : word;
begin
i := Round(x / step) + 1;
FunctionZ := effMatrix.items[i, order];
end;
{-----------------------------
function FunctionF(x : real; order : word; var indexOfMax : word) : real;
var
i : word;
a : real;
b : real;
vector : DVector;
begin
if (order = 1)
then
begin
FunctionF := FunctionZ(x, 1);
indexOfMax := 1;
exit;
end;
vector.size := round(x / step) + 1;
a := 0;
b := x;
for i := 1 to vector.size do
begin
vector.items[i] := FunctionZ(a, order) + FunctionF(b, order - 1, indexOfMax);
a := a + step;
b := b - step;
end;
FunctionF := GetMaxItem(vector, indexOfMax);
end;
{-----------------------------
procedure BuildOutMatrix;
var
i : word;
j : word;
indexOfMax : word;
begin
outMatrix.rows := effMatrix.rows;
outMatrix.cols := effMatrix.cols;
for j := 1 to outMatrix.cols do
begin
for i := 1 to outMatrix.rows do
begin
outMatrix.items[i, j].value := FunctionF(distVector.items[i], j, indexOfMax);
outMatrix.items[i, j].indexOfMax := indexOfMax;
end;
end;
end;
{-----------------------------
procedure DataOutput(vector : DVector);
var
i : word;
begin
Writeln('Решение:');
for i := 1 to vector.size do
Writeln('x', i, ' = ', vector.items[i]:4:2);
Write('Max = ');
Writeln(outMatrix.items[
Readln;
end;
{-----------------------------
var
i, j : word;
rightBoard : real;
result : DVector;
indexOfMax : word;
value : real;
begin
ClrScr;
DataInput('data.txt');
BuildOutMatrix;
rightBoard := distVector.items[distVector.
result.size := effMatrix.cols;
for j := result.size downto 1 do
if (rightBoard <= 0)
then
result.items[j] := 0
else
begin
i := Round(rightBoard / step) + 1;
indexOfMax := outMatrix.items[i, j].indexOfMax;
value := (indexOfMax - 1) * step;
result.items[j] := value;
rightBoard := rightBoard - value;
end;
DataOutput(result);
end.