Метод динамического программирования

2.1 Теоретическая часть

Математически задачу выбора набора параметров из заданной их совокупности можно сформулировать следующим образом.

Пусть работоспособность объекта контроля характеризуется совокупностью n взаимосвязанных параметров. Образующих множество S={x1, x2,…,xn}. Проверка всех параметров из S влечет контроль всех N элементов системы и дает однозначный ответ: объект исправен, если все N элементов исправны, или неисправен. Если по крайней мере один из элементов отказал. Для Метод динамического программирования - student2.ru xi определено подмножество R(xi) элементов, проверяемых при контроле i-ого параметра. Причем предполагается, что эти подмножества могут пересекаться, т.е. Метод динамического программирования - student2.ru i, j: R(xi) ∩ R(xj).

Пусть Ω – некоторый набор параметров из множества S, т.е. Метод динамического программирования - student2.ru . Тогда Метод динамического программирования - student2.ru и Метод динамического программирования - student2.ru , где Ω-набор контролируемых параметров, а Метод динамического программирования - student2.ru - неконтролируемый набор. Значение из S можно представить булевым вектором, причем:

1, если xi Метод динамического программирования - student2.ru
0. если xi Метод динамического программирования - student2.ru
xi=

Задача выбора параметров в этом случае формулируется двояко:

1) Найти набор, для которого

Метод динамического программирования - student2.ru Р(Ω)=max (1.11)

при

2) Найти набор Ω. Для которого:

(1.12)

при

где - апостериорная вероятность работоспособного состояния объекта контроля при положительном исходе контроля выбранных параметров;

c{xi} - затраты на контроль i-ого параметра;

- требуемая достоверность контроля;

С – ограничение на общую стоимость контроля.

Метод динамического программирования - student2.ru Значение зависит от принятых допущений и может быть найдено по формуле

Байеса. Так, если полагать в изделии наличие лишь одного отказа, то

(1.13)

где Метод динамического программирования - student2.ru - априорная вероятность безотказной работы объекта:

Метод динамического программирования - student2.ru Метод динамического программирования - student2.ru - нормированная вероятность отказа системы из-за отказа i-ого элемента:

(1.14)

Метод динамического программирования - student2.ru - априорная вероятность отказа i-ого элемента.

Тогда вероятность того, что отказ будет обнаружен при проверки i-ого параметра можно вычислить по формуле:

Метод динамического программирования - student2.ru Метод динамического программирования - student2.ru

Метод динамического программирования - student2.ru При возможности наличия в ОК произвольного числа отказов

(1.15)

Метод динамического программирования - student2.ru Для решения задач (1.11) и (1.12) можно использовать простой перебор вариантов, однако возникающие при этом вычислительные трудности не позволяют сделать этого даже для простых систем ( при n>10). В связи с этим комплектование набора трактуется как многошаговый процесс, состоящий из последовательного выбора отдельных параметров. В соответствии с общим принципом оптимальности, разобьем весь имеющийся ресурс стоимости С на С отрезков единичной длины. (В практических случаях заданные положительные величины c(xi) и С можно считать всегда целыми. Если это не так, то необходимо перейти к более мелким стоимостным единицам в зависимости от разрядности дробной части.) Рассмотрим наряду с интересующей нас исходной задачей множество аналогичных задач

, аналог выражения (1.1),

Метод динамического программирования - student2.ru где через XС обозначено множество неотрицательных целочисленных векторов Ω, отвечающих наборам, в которых общая стоимость проверки параметров не превосходит величины С.

Пусть

тогда при всех Метод динамического программирования - student2.ru соответствующие множества XY состоят. Очевидно, из одного нулевого элемента и f(С)=0 для всех таких С. Для ресурса Метод динамического программирования - student2.ru согласно общей схеме динамического Метод динамического программирования - student2.ru программирования справедливы следующие рекуррентные соотношения:

Метод динамического программирования - student2.ru (1.16)

Метод динамического программирования - student2.ru где Метод динамического программирования - student2.ru

R( Метод динамического программирования - student2.ru )-множество тех i, для которых Метод динамического программирования - student2.ru , начиная с номера уравнение (1.16) решается для всех i=1,n:

Метод динамического программирования - student2.ru Метод динамического программирования - student2.ru - сумма вероятностей элементов i-го параметра, которые пересекаются с элементами подмножества Метод динамического программирования - student2.ru , образованного на шаге

Метод динамического программирования - student2.ru Если

Æ, то Метод динамического программирования - student2.ru

И

Метод динамического программирования - student2.ru

(1.17)

Что приводит к условию задачи с пересекающимися параметрами.

Для решения рассматриваемой задачи рассмотрим простой численный метод, не требующий предварительного определения всех допустимых наборов и основанный на рекуррентных соотношениях (1.15). Для всех целых Метод динамического программирования - student2.ru по формуле (1.16) вычисляют величины Метод динамического программирования - student2.ru и при этом фиксируются индексы Метод динамического программирования - student2.ru , на которых достигаются максимумы в (1.16). Искомый вектор Метод динамического программирования - student2.ru формируется последовательно включение в набор параметра Метод динамического программирования - student2.ru и подмножества Метод динамического программирования - student2.ru , зафиксированного на шаге Метод динамического программирования - student2.ru При этом, если Метод динамического программирования - student2.ru Метод динамического программирования - student2.ru , то на данном шаге этот параметр исключается из рассмотрения, так как каждый параметр может включаться в набор не более одного раза. Если на н6екотором Метод динамического программирования - student2.ru v-м шаге окажется, что то вы качестве Метод динамического программирования - student2.ru принимается я подмножество Метод динамического программирования - student2.ru и фиксируется параметр Метод динамического программирования - student2.ru , причем за Метод динамического программирования - student2.ru принимается значение Метод динамического программирования - student2.ru . Заметим, что если в (1.11) принять более жесткое ограничение, а именно

Метод динамического программирования - student2.ru то последнее недопустимо, так как в этом случае Метод динамического программирования - student2.ru может быть меньше Метод динамического программирования - student2.ru из-за того, что он достигает на и другом подмножестве параметров.

2.2 Практическая часть

Дано:

Нормированные вероятности отказов для элементов Qi, затраты на контроль i-ого параметра C(xi).

Qi 0,04 0,15 0,13 0,08 0,02 0,09 0,06 0,08 0,03 0,04
C(xi)

Найти: Выбрать такие параметры, чтобы C≤18 при Q=Qmax.

Для удобства расчетов проранжируем таблицу следующим образом:

Qi 0,15 0,04 0,03 0,08 0,06 0,09 0,08 0,13 0,04 0,02
C(xi)

Решение:

Весь имеющийся ресурс Метод динамического программирования - student2.ru разбиваем на отрезки единичной длины. Таким образом, Метод динамического программирования - student2.ru .

При Метод динамического программирования - student2.ru соответствующее множество Метод динамического программирования - student2.ru состоит из одного нулевого элемента и целевая функция Метод динамического программирования - student2.ru .

При Метод динамического программирования - student2.ru : в множество Метод динамического программирования - student2.ru можем включить один из трёх подходящих параметров по стоимости затрат, но выбираем тот параметр, который обладает наибольшей вероятностью, а именно Метод динамического программирования - student2.ru , вероятность которого равна Метод динамического программирования - student2.ru . Вычислили значение целевой функции Метод динамического программирования - student2.ru и зафиксировали индекс параметра Метод динамического программирования - student2.ru .

При Метод динамического программирования - student2.ru : на этом шаге для включения в множество Метод динамического программирования - student2.ru можем выбрать параметр со стоимостью, равной единицы, тогда множество Метод динамического программирования - student2.ru будет состоять из двух параметров, или же можем выбрать со стоимостью, равной два. Соответственно выбираем Метод динамического программирования - student2.ru c вероятностями Метод динамического программирования - student2.ru . Целевая функция Метод динамического программирования - student2.ru

Метод динамического программирования - student2.ru и фиксируем Метод динамического программирования - student2.ru .

Аналогично проводим расчёты на последующих шагах. Результат пошаговой работы алгоритма представлен в виде таблицы 2.

Таблица 2.

Выделяемое количество затратных единиц, Ck Значение целевой функции, f(Ck) Выбор на данном шаге, i*Ck Выбранный массив, Ω*
-
0,15
0,19 2;10
0,23 2;4
0,27 2;4;10
0,3 2;4;10;9
0,33 2;4;10;7
0,36 2;4;10;7;9
0,4 2;4;10;3
0,43 2;4;10;3;9
0,44 2;4;10;3;7
0,47 2;4;10;3;7;9
0,52 2;4;10;3;9;6
0,55 2;4;10;3;6;7
0,58 2;4;10;3;6;7;9
0,6 2;4;10;3;6;9;8
0,63 2;4;10;3;6;8;7
0,66 2;4;10;3;6;8;7;9
0,66 - 2;4;10;3;6;8;7;9

Таким образом, решением является набор проверок Ω* = {X2;X3;X4;X6;X7;X8;X9;X10}.

2.3 Программные расчеты и сравнение результатов

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

Листинг программы представлен в приложении 2.

Результаты программного расчёта сохраняются в текстовый файл kr2.txt и представлены на рисунке 3.

Метод динамического программирования - student2.ru

Рис.3. Результат работы программы для метода динамического программирования

Выводы

При решении поставленной задачи оба метода дали одинаковый результат, что показывает правильность выполнения и, соответственно, понимания курсовой работы. Таким образом, необходимо использовать следующие параметры контроля: Метод динамического программирования - student2.ru .

Метод ветвей и границ является вариацией метода полного перебора с той разницей, что мы сразу исключаем заведомо неоптимальные решения. Главный недостаток алгоритма метода ветвей и границ заключается в необходимости полностью решать задачи линейного программирования, ассоциированные с каждой из вершин многогранника допустимых решений. Для задач большой размерности это требует значительных затрат времени.

Динамическое программирование – один из наиболее мощных методов оптимизации. Этот метод исключительно привлекателен благодаря простоте и ясности своего основного принципа – принципа оптимальности.

Этот метод отличается от линейного программирования, исходная постановка основных задач которых имеет статический характер. Главным недостатком метода является – его сложность возрастает с увеличением размерности задачи.

Список используемой литературы

1. Пискунов В.А. Курс лекций и лабораторных работ по дисциплине “Контроль и диагностика систем ЛА”.

2. Пискунов В.А. Учебное пособие “Комбинаторные методы дискретной оптимизации в прикладных задачах организации контроля систем ЛА”.

Приложение 1

Листинг программы

program vetvi;

const

maxmatrix=1000;

maxsize=200;

type linear=array[1..10000] of integer;

label skip;

var matrix:array[1..1000] of pointer;

n:integer;

sizeofm:word;

q,w,e,r:integer;

start_m:integer;

sm:^linear;

bestx,besty:integer;

bz:integer;

ochered:array[1..1000] of

record

id:integer;

ocenka:integer;

end;

nochered:integer;

workm,workc:integer;

leftm,rightm:integer;

first,last:integer;

best:integer;

bestmatr:array[1..maxsize] of integer;

bestmatr1:array[1..maxsize] of integer;

curr:integer;

procedure swapo(a,b:integer);

begin

ochered[1000]:=ochered[a];

ochered[a]:=ochered[b];

ochered[b]:=ochered[1000];

end;

procedure addochered(id,ocenka:integer);

var

curr:integer;

begin

inc(nochered);

ochered[nochered].id:=id;

ochered[nochered].ocenka:=ocenka;

{Uravnoveshivanie ocheredi}

curr:=nochered;

while true do

begin

if curr=1 then break;

if ochered[curr].ocenka< ochered[curr div 2].ocenka

then

begin

swapo(curr,curr div 2);

curr:=curr div 2;

end

else break;

end;

end;

procedure getochered(var id,ocenka:integer);

var

curr:integer;

begin

id:=ochered[1].id;

ocenka:=ochered[1].ocenka;

ochered[1]:=ochered[nochered];

dec(nochered);

curr:=1;

while true do

begin

if (curr*2+1> nochered) then break;

if (ochered[curr*2].ocenka< ochered[curr].ocenka) or

(ochered[curr*2+1].ocenka<ochered[curr].ocenka) then

begin

if ochered[curr*2].ocenka> ochered[curr*2+1].ocenka

then

begin

swapo(curr*2+1,curr);

curr:=curr*2+1;

end

else

begin

swapo(curr*2,curr);

curr:=curr*2;

end;

end else break;

end;

end;

function getid:integer;

var q:integer;

qw:^linear;

begin

if memavail<10000 then

begin

q:=ochered[nochered].id;

{ exit;}

end else

begin

for q:=1 to maxmatrix do

if matrix[q]=nil then break;

getmem(matrix[q],sizeofm);

end;

qw:=matrix[q];

fillchar(qw^,sizeofm,0);

getid:=q;

end;

procedure freeid(id:integer);

begin

freemem(matrix[id],sizeofm);

matrix[id]:=nil;

end;

function i(x,y:integer):integer;

begin

i:=(y-1)*n+x+1;

end;

function simplize(id:integer):integer;

var

q,w:integer;

t:^linear;

add:integer;

min:integer;

begin

t:=matrix[id];

add:=0;

for q:=1 to n do

begin

min:=maxint;

for w:=1 to n do

if t^[i(w,q)]< >-1 then

if min> t^[i(w,q)] then min:=t^[i(w,q)];

if min<>0 then

for w:=1 to n do

if t^[i(w,q)]< >-1 then

dec(t^[i(w,q)],min);

if min>32000 then min:=0;

inc(add,min);

end;

for q:=1 to n do

begin

min:=maxint;

for w:=1 to n do

if t^[i(q,w)]< >-1 then

if min> t^[i(q,w)] then min:=t^[i(q,w)];

if min<>0 then

for w:=1 to n do

if t^[i(q,w)]< >-1 then

dec(t^[i(q,w)],min);

if min>32000 then min:=0;

inc(add,min);

end;

simplize:=add;

end;

function bestziro(id:integer):integer;

var

t:^linear;

q,w,e,x,y:integer;

min1,min2:integer;

l1,l2:array[1..maxsize] of integer;

begin

t:=matrix[id];

fillchar(l1,sizeof(l1),0);

fillchar(l2,sizeof(l2),0);

for q:=1 to n do

begin

min1:=maxint;min2:=maxint;

for w:=1 to n do

if t^[i(w,q)]< >-1 then

begin

if min2> t^[i(w,q)] then min2:=t^[i(w,q)];

if min1> min2 then

begin

e:=min1;

min1:=min2;

min2:=e;

end;

end;

if min1<>0 then min2:=0;

if min2>32000 then min2:=0;

l2[q]:=min2;

end;

for q:=1 to n do

begin

min1:=maxint;min2:=maxint;

for w:=1 to n do

if t^[i(q,w)]< >-1 then

begin

if min2> t^[i(q,w)] then min2:=t^[i(q,w)];

if min1> min2 then

begin

e:=min1;

min1:=min2;

min2:=e;

end;

end;

if min1<>0 then min2:=0;

if min2>32000 then min2:=0;

l1[q]:=min2;

end;

bz:=-32000;

bestx:=0;besty:=0;

for y:=n downto 1 do

for x:=1 to n do

if (t^[i(x,y)]=0) then

if l1[x]+l2[y]> bz then

begin

bestx:=x;

besty:=y;

bz:=l1[x]+l2[y];

end;

bestziro:=bz;

end;

begin

assign(input,'input.txt');

assign(output,'vetvi.out');

reset(input);

rewrite(output);

nochered:=0;

read(n);

sizeofm:=n*(n+2)*2+2;

start_m:=getid;

sm:=matrix[start_m];

for q:=1 to n do

for w:=1 to n do

read(sm^[i(w,q)]);

addochered(start_m,0);

{ ;

bestziro(start_m);}

{Sobstvenno reshenie}

best:=maxint;

while true do

begin

if nochered=0 then break;

getochered(workm,workc);

{process MATRIX}

inc(workc,simplize(workm));

if workc> best then goto skip;

sm:=matrix[workm];

if sm^[1]=n-1 then

begin

best:=workc;

for q:=1 to n do

begin

bestmatr [q]:=sm^[i(q,n+2)];

bestmatr1[q]:=sm^[i(q,n+1)];

end;

goto skip;

end;

q:=bestziro(workm);

if q=-32000 then goto skip;

{Pravaia vetka}

if(bestx=0) or (besty=0) then goto skip;

rightm:=getid;

move(matrix[workm]^,matrix[rightm]^,sizeofm);

sm:=matrix[rightm];

sm^[i(bestx,besty)]:=-1;

addochered(rightm,workc+q);

{Levaia vetka}

leftm:=getid;

move(matrix[workm]^,matrix[leftm]^,sizeofm);

sm:=matrix[leftm];

{Dobavliaetsia rebro iz bestx v besty}

inc(sm^[1]);

sm^[i(bestx,n+2)]:=besty;

sm^[i(besty,n+1)]:=bestx;

first:=bestx;last:=besty;

if sm^[1]< >n-1 then

begin

while true do

begin

if sm^[i(last,n+2)]=0 then break;

last:=sm^[i(last,n+2)];

end;

while true do

begin

if sm^[i(first,n+1)]=0 then break;

first:=sm^[i(first,n+1)];

end;

sm^[i(last,first)]:=-1;

sm^[i(first,last)]:=-1;

sm^[i(besty,bestx)]:=-1;

end;

for w:=1 to n do

begin

sm^[i(w,besty)]:=-1;

sm^[i(bestx,w)]:=-1;

end;

addochered(leftm,workc);

skip:

{Free Matrix}

freeid(workm);

end;

{ freeid(start_m);}

if best=maxint then

begin

writeln('Путь не существует');

end else

begin

writeln('Длина пути:',best);

for q:=1 to n do

if bestmatr[q]=0 then break;

e:=q;

for curr:=1 to n do

if bestmatr[curr]=q then break;

while true do

begin

write(curr,' ');

curr:=bestmatr1[curr];

if curr=0 then

begin

writeln(e);

break;

end;

end;

end;

close(input);

close(output);

end.

Приложение 2

Листинг программы

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ToolWin, ComCtrls, mdCONTROLS, Grids, StdCtrls, ExtCtrls, Unit2,

Buttons;

type

TForm1 = class(TForm)

sgH: TStringGrid;

sgP: TStringGrid;

sgC: TStringGrid;

sgQ: TStringGrid;

lbC: TLabeledEdit;

BitBtn1: TBitBtn;

Label1: TLabel;

sgW: TStringGrid;

Label2: TLabel;

procedure FormCreate(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure sgExit(Sender: TObject);

private

{ Private declarations }

public

H: TH;

P: TP;

C: TC;

W: TW;

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

var i,j: integer;

x: Byte;

f: TextFile;

begin

AssignFile(f, 'data.txt');

Reset(f);

sgW.Cells[0,0] := 'W';

// Ввод исходной матрицы

readln(f);

for j:=1 to 10 do

begin

sgH.Cells[0,j] := IntToStr(j);

sgW.Cells[0,j] := IntToStr(j);

for i:=1 to 10 do

begin

sgH.Cells[i,0] := IntToStr(i);

read(f, x);

sgH.Cells[i,j] := IntToStr(x);

if x = 1 then

H[i-1,j-1] := true

else

H[i-1,j-1] := false;

end;

readln(f);

end;

// Ввод вероятностей

readln(f);

readln(f);

sgP.Cells[0,0] := 'P';

for i:=1 to 10 do

begin

read(f, P[i-1]);

sgP.Cells[i,0] := FloatToStr(P[i-1]);

end;

readln(f);

// Ввод стоимостей

readln(f);

readln(f);

sgC.Cells[0,0] := 'C';

for j:=1 to 10 do

begin

read(f, C[j-1]);

sgC.Cells[0,j] := IntToStr(C[j-1]);

end;

CloseFile(f);

// Ввод вероятностей обнаружения отказа

sgQ.Cells[0,0] := 'Q';

for j:=1 to 10 do

sgQ.Cells[0,j] := FloatToStr(Q(j-1,H,P));

lbC.Text := '1';

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

var i: integer;

begin

label1.Caption := FloatToStr(maxf(1, StrToInt(lbC.Text), H,P,C, W));

for i:=1 to 10 do

begin

sgW.Cells[2,i] := IntToStr(W[i-1].N);

if W[i-1].E then

sgW.Cells[1,i] := '1'

else

sgW.Cells[1,i] := '0';

end;

end;

procedure TForm1.sgExit(Sender: TObject);

var i,j: integer;

begin

for j:=1 to 10 do

for i:=1 to 10 do

if sgH.Cells[i,j] = '1' then

H[i-1,j-1] := true

else

H[i-1,j-1] := false;

for i:=1 to 10 do

P[i-1] := StrToFloat(sgP.Cells[i,0]);

for j:=1 to 10 do

C[j-1] := StrToInt(sgC.Cells[0,j]);

// Ввод вероятностей обнаружения отказа

for j:=1 to 10 do

sgQ.Cells[0,j] := FloatToStr(Q(j-1,H,P));

end;

end.

unit Unit2;

interface

type

TH = array [0..9, 0..9] of boolean;

TP = array [0..9] of extended;

TC = array [0..9] of integer;

TDateW = record

E: boolean;

N: integer;

end;

TW = array [0..9] of TDateW;

function Q(j: integer; H: TH; P: TP): extended;

function maxf(n, Yk: integer; H: TH; P: TP; C: TC; var W: TW): extended;

implementation

function Q(j: integer; H: TH; P: TP): extended;

var i: integer;

begin

Result := 0;

for i:=0 to 9 do

if H[i,j] then

Result := Result + P[i];

end;

function G(j: integer; H: TH; P: TP; W: TW): extended;

var i,k: integer;

begin

Result := 0;

for i:=0 to 9 do

if H[i,j] then

for k:=0 to 9 do

if W[k].E and H[i,k] then

begin

Result := Result + P[i];

Break;

end;

end;

function f(n, Yk, j: integer; H: TH; P: TP; C: TC; var W: TW): extended;

begin

Result := Q(j,H,P) + maxf(n+1, Yk - C[j], H,P,C, W) - G(j,H,P,W);

end;

function maxf(n, Yk: integer; H: TH; P: TP; C: TC; var W: TW): extended;

var j,i: integer;

ft: extended;

Wt: TW;

begin

Result := 0;

for i:=0 to 9 do

begin

W[i].E := false;

W[i].N := 0;

end;

for j:=0 to 9 do

if C[j] <= Yk then

begin

for i:=0 to 9 do

begin

Wt[i].E := false;

Wt[i].N := 0;

end;

ft := f(n, Yk, j, H,P,C, Wt);

if Result < ft then

begin

Result := ft;

W := Wt;

W[j].E := true;

W[j].N := n;

end;

end;

end;

end.

Наши рекомендации