Метод динамического программирования
2.1 Теоретическая часть Математически задачу выбора набора параметров из заданной их совокупности можно сформулировать следующим образом. Пусть работоспособность объекта контроля характеризуется совокупностью n взаимосвязанных параметров. Образующих множество S={x1, x2,…,xn}. Проверка всех параметров из S влечет контроль всех N элементов системы и дает однозначный ответ: объект исправен, если все N элементов исправны, или неисправен. Если по крайней мере один из элементов отказал. Для Пусть Ω – некоторый набор параметров из множества S, т.е.
Задача выбора параметров в этом случае формулируется двояко: 1) Найти набор, для которого
при
2) Найти набор Ω. Для которого: (1.12)
при где - апостериорная вероятность работоспособного состояния объекта контроля при положительном исходе контроля выбранных параметров; c{xi} - затраты на контроль i-ого параметра; - требуемая достоверность контроля; С – ограничение на общую стоимость контроля.
Байеса. Так, если полагать в изделии наличие лишь одного отказа, то (1.13) где
(1.14)
Тогда вероятность того, что отказ будет обнаружен при проверки i-ого параметра можно вычислить по формуле:
(1.15)
, аналог выражения (1.1),
Пусть тогда при всех
R(
Æ, то И
Что приводит к условию задачи с пересекающимися параметрами. Для решения рассматриваемой задачи рассмотрим простой численный метод, не требующий предварительного определения всех допустимых наборов и основанный на рекуррентных соотношениях (1.15). Для всех целых
2.2 Практическая часть Дано: Нормированные вероятности отказов для элементов Qi, затраты на контроль i-ого параметра C(xi).
Найти: Выбрать такие параметры, чтобы C≤18 при Q=Qmax. Для удобства расчетов проранжируем таблицу следующим образом:
Решение: Весь имеющийся ресурс При При При
Аналогично проводим расчёты на последующих шагах. Результат пошаговой работы алгоритма представлен в виде таблицы 2. Таблица 2.
Таким образом, решением является набор проверок Ω* = {X2;X3;X4;X6;X7;X8;X9;X10}.
2.3 Программные расчеты и сравнение результатов Наряду с ручным расчётом, решение задачи реализовано с помощью программного алгоритма, написанного на языке программирования Delphi 7.0. Листинг программы представлен в приложении 2. Результаты программного расчёта сохраняются в текстовый файл kr2.txt и представлены на рисунке 3. Рис.3. Результат работы программы для метода динамического программирования
Выводы При решении поставленной задачи оба метода дали одинаковый результат, что показывает правильность выполнения и, соответственно, понимания курсовой работы. Таким образом, необходимо использовать следующие параметры контроля: Метод ветвей и границ является вариацией метода полного перебора с той разницей, что мы сразу исключаем заведомо неоптимальные решения. Главный недостаток алгоритма метода ветвей и границ заключается в необходимости полностью решать задачи линейного программирования, ассоциированные с каждой из вершин многогранника допустимых решений. Для задач большой размерности это требует значительных затрат времени. Динамическое программирование – один из наиболее мощных методов оптимизации. Этот метод исключительно привлекателен благодаря простоте и ясности своего основного принципа – принципа оптимальности. Этот метод отличается от линейного программирования, исходная постановка основных задач которых имеет статический характер. Главным недостатком метода является – его сложность возрастает с увеличением размерности задачи. Список используемой литературы 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.
Популярное: Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы... Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы... Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение... ![]() ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (498)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |