Консультация № 180520
31.10.2010, 14:19
46.75 руб.
0 0 0
Здравствуйте.
Задание:
Орудие стреляет по цели. Цель может находиться в одном из трех состояний: не повреждена, частично повреждена и полностью разрушена. Матрица вероятностей переходов задана
[table]
[row][col] 0.4[/col][col]0.4 [/col][col] 0.2[/col][/row]
[row][col]0.3 [/col][col] 0.2[/col][col]0.5 [/col][/row]
[row][col] 0.1[/col][col]0.8 [/col][col] 0.2[/col][/row]
[/table]
Определить среднее количество снарядов для разрушения цели.

Нужно решить задачу.

Напишу вкратце алгортим:
1)Вводим матрицу 3*3 и проверяем каждую строку, равна ли она 1
2)начальное состояние i(0)
3)генерирует случайное число (пример:0,2567)
4) если не конец моделирования, то вычисляем j по приенципу моделирования полной группы несовместных случайных событий->i:=j -> моделирование перехода
5)если конец моделирования то вычисляем характеристики

алгоритм для пункта 4:
R:случайное число водим
{if R<R1 then
s0 else
R:=R-R1 if R<R2 then
s1 else R:=R-R2 if R<R3then
s2 else
s1; }
где s0:цель не поражена, s1 частично, s2 поражена

Вот пример:
Используя модель и метод статистического моделирования, попытаемся решить следующую задачу: определить среднее количество снарядов, необходимое для полного разрушения цели.

Проимитируем, используя таблицу случайных чисел, процесс стрельбы. Пусть начальное состояние будет S0. Возьмем последовательность из таблицы случайных чисел: 0.31, 0.53, 0.23, 0.42, 0.63, 0.21, … (случайные числа можно взять, например, из этой таблицы).

0.31: цель находится в состоянии S0 и остается в состоянии S0, так как 0 < 0.31 < 0.45;
0.53: цель находится в состоянии S0 и переходит в состояние S1, так как 0.45 < 0.53 < 0.45 + 0.40;
0.23: цель находится в состоянии S1 и остается в состоянии S1, так как 0 < 0.23 < 0.45;
0.42: цель находится в состоянии S1 и остается в состоянии S1, так как 0 < 0.42 < 0.45;
0.63: цель находится в состоянии S1 и переходит в состояние S2, так как 0.45 < 0.63 < 0.45 + 0.55.

Так как достигнуто состояние S2 (далее цель переходит из S2 в состояние S2 с вероятностью 1), то цель поражена. Для этого в данном эксперименте потребовалось 5 снарядов.





Приложение:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Button1: TButton;
Button3: TButton;
Edit10: TEdit;
Edit11: TEdit;
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
i:integer;
R:real;
st:integer;//счетчик тактов
s:integer;//текущее состояние
P:array [1..3,1..3] of Real;{Матирца состояний}
implementation

{$R *.dfm}

function NS(Se:Byte):Byte;
var
i:Byte; {Текущее состояние}
Ver:Real;{Накопитель вероятности по мере продвижения по строке}
R:Real; {Случайное число от 0 до 1}
begin
Ver:=0; {Инициализируем Ver}
R:=Random;{Находим псевдослучайное число}
i:=0; {Инициализируем текущее состояние}
repeat {Начало цикла с постусловием}
i:=i+1; {прибавляем к текущему состоянию 1}
Ver:=Ver+P[S,i];{Добавляем к Ver значение вероятности текущего состояния}
until Ver>R;{Если Ver>R, то выходим из цикла}
NS:=i;{Возвращаем текущее сосотояние.}
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
p[1,1]:=Strtofloat(Edit1.text);
p[1,2]:=Strtofloat(Edit2.text);
p[1,3]:=Strtofloat(Edit3.text);

p[2,1]:=Strtofloat(Edit4.text);
p[2,2]:=Strtofloat(Edit5.text);
p[2,3]:=Strtofloat(Edit6.text);

p[3,1]:=Strtofloat(Edit7.text);
p[3,2]:= Strtofloat(Edit8.text);
p[3,3]:=Strtofloat(Edit9.text);


randomize;
R:=Random();
Edit10.Text:=floattostr(R);
i:=1;
R:=strtofloat(Edit10.Text);
st:=0;{Обнуляем счётчик тактов}
for i:=1 to 10000 do {Делаем 10000 итераций}
begin
s:=1; {Начальное состояние - первое}
repeat
S:=Ns(S);{Находим следующее состояние}
st:=st+1;{Приращаем счётчик тактов}
until S=3;{Выполняем цикл пока не будет достигнуто 3-е состояние}
end;
edit11.Text:=floattostr(st/10000);
end;



procedure TForm1.Button3Click(Sender: TObject);
begin
if (strtofloat(Edit1.Text)+strtofloat(Edit2.Text)+strtofloat(Edit3.Text))<>1 then begin
MessageDlg('сумма чисел в первой строке должна быть = 1', mtConfirmation, [mbOk], 0);
end;
if (strtofloat(Edit4.Text)+strtofloat(Edit5.Text)+strtofloat(Edit6.Text))<>1 then begin
MessageDlg('сумма чисел во второй строке должна быть = 1', mtConfirmation, [mbOk], 0);
end;
if (strtofloat(Edit7.Text)+strtofloat(Edit8.Text)+strtofloat(Edit9.Text))<>1 then begin
MessageDlg('сумма чисел в третьей строке должна быть = 1', mtConfirmation, [mbOk], 0);
end;
end;

end.

Обсуждение

Форма ответа