Запишем функциональные уравнения для последнего года планового периода F1(t) и последних k лет планового периода Fk(t) при исходных числовых значениях параметра:
Пользуясь этими выражениями, будем последовательно вычислять значения максимальной прибыли Fk(t) и записывать их в табл. 1. Первую строку получим, придавая параметру t в равенстве (1) значения 0, 1, 2, +, 10 и используя исходные данные. Например при t = 0: = 20 (сохранение).
Аналогично расчет ведется до t = 9: = 7 (сохранение).
Заметим, что если прибыль от нового оборудования ровна прибыли от старого, то старое лучше сохранить еще на год. При t = 10= = = 7 (замена).
Из табл.1 видно, что r(t) - λ(t) с ростом t убывает. Поэтому при t > 9 оптимальной будет политика замены оборудования. Чтобы различать, в результате какой политики получается условно-оптимальное значение прибыли, будем эти значения разграничивать (до t = 9 включительно оптимальной является политика сохранения). Для заполнения второй строки табл.1, используем формулу (2) для k = 2:
Придавая параметру t значения 0, 1, 2,+ ,10, используя исходные данные и значения F1(t+1) из первой строки таблицы, заполним вторую строку. Например, при t = 4= = =28(сохранение).
Для третьей строки таблицы используем формулу (2) для k = 3:= = и т.д.
Таблица 1
т | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
F1(t) | 20 | 20 | 17 | 16 | 15 | 13 | 12 | 10 | 9 | 7 | 7 |
F2(t) | 40 | 37 | 33 | 31 | 28 | 27 | 27 | 27 | 27 | 27 | 27 |
F3(t) | 57 | 53 | 48 | 44 | 44 | 44 | 44 | 44 | 44 | 44 | 44 |
F4(t) | 73 | 68 | 61 | 60 | 60 | 60 | 60 | 60 | 60 | 60 | 60 |
F5(t) | 88 | 81 | 77 | 76 | 75 | 75 | 75 | 75 | 75 | 75 | 75 |
F6(t) | 101 | 97 | 93 | 91 | 90 | 88 | 88 | 88 | 88 | 88 | 88 |
F7(t) | 117 | 113 | 108 | 106 | 104 | 104 | 104 | 104 | 104 | 104 | 104 |
F8(t) | 133 | 128 | 123 | 120 | 120 | 120 | 120 | 120 | 120 | 120 | 120 |
F9(t) | 148 | 143 | 137 | 136 | 135 | 135 | 135 | 135 | 135 | 135 | 135 |
F10(t) | 163 | 157 | 153 | 151 | 150 | 150 | 150 | 150 | 150 | 150 | 150 |
Пусть, например, в начале планового периода имелось оборудование возраста T = 5 лет. Разработаем политику "замен" на десятилетний период доставляющий максимальную прибыль. Информация для этого представлена в табл.1 на пересечении столбца t = 5 строки F10(t); она составляет 150 единиц.
Значение максимальной прибыли F10(5) = 150 записано в области "политики замены". Это значит, что для достижения в течение 10 лет максимальной прибыли в начале первого года оборудование надо заменить. В течение первого года новое оборудование постареет на год, т.е., заменив оборудование и проработав на нем год, за 9 лет до конца планового периода будем иметь оборудование возраста 1 год. Из табл. 1 берем F9(1) = 143. Это значение располагается в области "политики сохранения", т.е. во втором году планового периода надо сохранить оборудование возраста 1 год, и, проработав на нем год, за 8 лет до конца планового периода будем иметь оборудование возраста 2 года.
Значение F8(2) = 123 помещено в области сохранения. Работаем на оборудовании еще год. Теперь до конца планового периода осталось 7 лет, а возраст оборудования составляет 3 года. Находим F7(3) = 106. Это область сохранения. Работаем на оборудовании еще год. Его возраст становится равным 4 годам. До конца планового периода остается 6 лет. Определяем F6(4) = 90. Это область сохранения. Работаем на оборудовании еще год. Его возраст становится равным 5 годам. До конца планового периода остается 5 лет. Определяем F5(5) = 75. Это область замен. Заменяем оборудование на новое. Проработаем на нем в течение пятого года. Оно постареет на год. До конца планового периода остается 4 года. Продолжая подобные рассуждения, получим, что F4(1) = 68, F3(2) = 48, F2(3) = 31, F1(4) = 15 расположены в области сохранения. Разработанную политику изобразим следующей цепочкой:
F10(5) F9(1) F8(2) F7(3) F6(4) F5(5) F4(1)
F3(2) F2(3) F1(4)
Из табл.1 можно найти оптимальную стратегию замены оборудования с любым начальным состоянием от 0 до 10 лет и на любой плановый период, не превосходящий 10 лет.
В приложении рассмотрена задача для любого начального возраста оборудования и для любого расчетного периода.
Список использованных источников
1. А.В. Кузнецов, В.А. Сакович, Н.И. Холод Математическое программирование. - М.: Вышэйшая школа,1994.
2. Исследование операций в экономике: Учеб. пособие для вузов / Н.Ш. Кремер, Б.А. Путко, И.М. Тришин, М.Н. Фридман; Под ред. проф. Н.Ш. Кремера. - М.: Банки и биржи, ЮНИТИ, 1997.
3. Колемаев В.А. Математическая экономика.- М.: Юнити,1998.
Приложение
program Kurs;
uses
Crt;
const
(* ACTIONS CONSTANT *)
SELL = 0;
SAVE = 1;
(* TYPES SIZE CONSTANT *)
MAX_VECTOR_SIZE = 64;
type
TOutMatrixCell = record
action : byte;
value : real;
end;
TOutMatrix = record
rows : word;
cols : word;
items : array[1..MAX_VECTOR_SIZE - 1, 0..MAX_VECTOR_SIZE - 1] of TOutMatrixCell;
end;
TPlanCell = record
year : word;
action : byte;
end;
IVector = record
size : word;
items : array[1..MAX_VECTOR_SIZE - 1] of byte;
end;
DVector = record
size : word;
items : array[0..MAX_VECTOR_SIZE - 1] of real;
end;
var
vectorR : DVector;
vectorU : DVector;
outMatrix : TOutMatrix;
optimalPlan : IVector;
startTime : word;
count : word;
{----------------------------------------------------------------------------}
procedure ReadData(path : string);
var
inFile : Text;
i : word;
elem : real;
s : string;
begin
Assign(inFile, path);
Reset(inFile);
Writeln('Условие:');
repeat
Readln(inFile, s);
Writeln(s);
until (s = '');
Writeln('Начальные данные:');
Write('R(x) : ');
i := 0;
while not Eoln(inFile) do
be
Read(inFile, elem);
Write(elem:3:1, ' ');
vectorR.items[i] := elem;
Inc(i);
end;
vectorR.size := i;
Readln(inFile);
Writeln;
Write('U(x) : ');
i := 0;
while not Eof(inFile) do
begin
Read(inFile, elem);
Write(elem:3:1, ' ');
vectorU.items[i] := elem;
Inc(i);
end;
vectorU.size := i;
Close(inFile);
Writeln;
Write('начальный возраст оборудования = ');
Readln(startTime);
Write('расчетный период = ');
Readln(count);
Writeln;
end;
{----------------------------------------------------------------------------}
procedure WriteData;
var
i : word;
q : array[0..1] of string;
begin
Writeln('Решение:');
q[0] := 'заменить';
q[1] := 'сохранить';
for i := 1 to optimalPlan.size do
Writeln(i, ' year -> ', q[optimalPlan.items[i]]);
end;
{----------------------------------------------------------------------------}
function S(t : word) : real;
begin
S := 2;
end;
{----------------------------------------------------------------------------}
function P(t : word) : real;
begin
P := 15;
end;
{----------------------------------------------------------------------------}
function U(t : word) : real;
begin
U := vectorU.items[t];
end;
{----------------------------------------------------------------------------}
function R(t : word) : real;
begin
R := vectorR.items[t];
end;
{----------------------------------------------------------------------------}
function F(t : word; order: word; var action : byte) : real;
var
a : real;
b : real;
begin
if (order = 1)
then
begin
a := R(t) - U(t);
b := S(t) - P(t) + R(0) - U(0);
if (b >= a)
then
begin
F := b;
action := SELL;
end
else
begin
F := a;
action := SAVE;
end;
exit;
end;
a := R(T) - U(T) + outMatrix.items[order - 1, t + 1].value;
b := S(T) - P(T) + R(0) - U(0) + outMatrix.items[order - 1, 1].value;
if (b >= a)
then
begin
F := b;
action := SELL;
end
else
begin
F := a;
action := SAVE;
end;
end;
{----------------------------------------------------------------------------}
procedure BuildOutMatrix;
var
i : word;
j : word;
action : byte;
begin
outMatrix.rows := vectorR.size - 1;
outMatrix.cols := vectorR.size;
for i := 1 to outMatrix.rows do
for j := 0 to outMatrix.cols do
begin
outMatrix.items[i, j].value := F(j, i, action);
outMatrix.items[i, j].action := action;
end;
end;
{----------------------------------------------------------------------------}
procedure GetOptimalPlan(startTime : word; count : byte);
var
i : word;
currTime : word;
begin
currTime := startTime;
optimalPlan.size := count;
for i := count downto 1 do
begin
optimalPlan.items[count - i + 1] := outMatrix.items[i, currTime].action;
if (outMatrix.items[i, currTime].action = SELL)
then
currTime := 1
else
Inc(currTime);
end;
end;
{----------------------------------------------------------------------------}
begin
ClrScr;
ReadData('data.txt');
BuildOutMatrix;
GetOptimalPlan(startTime, count);
WriteData;
Readln;
end.