Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по моделированию систем.doc
Скачиваний:
6
Добавлен:
15.11.2019
Размер:
3.8 Mб
Скачать

§ 11. Моделирование работы конечного автомата

Требуется составить программу, которая имитирует работу конечного автомата при переходе из одного состояния в другое при различных входных сигналах. При этом требуется просчитать общее время нахождения автомата в каждом состоянии, вероятность каждого состояния, количество каждого состояния в % соотношении. Найти среднее состояние автомата.

Пусть дан конечный автомат:

Z

S

1

2

3

1

2

3

1

1

2

3

0

1

3

2

1

1

1

3

6

4

3

1

1

2

1

0

0

Сигналы поступают в автомат в случайный момент времени и образуют простейший поток.

Δt – случайная величина по показательному закону,

λ = 2 (сигналов в единицу времени)

(среднее время между сигналами)

S

1

2

3

p

0,2

0,5

0,3

Составим вот для этой таблицы – таблицу накоплений

S

1

2

3

pN

0,2

0,7

1

Датчик:

function n=diskrdat(pN)

r=rand;

[a,n]=min(pN<r); % массив сравнивается с r (pN<r)

Пример: r=0,5

pN<r = [1 0 0]

min(pN<0,5)=[0,2], где 0,2 – номер интервала куда попало случайное число.

Модель автомата(modelavt)

function modelavt;

global t Tmod lambda pN avt

init; % Инициализация исходных данных

while t < Tmod; % Цикл по времени до конца моделирования

[dT,S]=generat[pN,lambda] ; % Генерируются pN

t=t+dT;

[Vhd,Avt]=avtwork(Avt,S);

end

pprint ; % Вывод результатов

function init;

global t Tmod lambda pN avt

t=0; % Текущее модельное время

Tmod=1000; % Время окончания моделирования

lambda=1; % Интенсивность появления заявок

pN=[0.2 0.7 1]

Avt=struct(... % Структура автомата

'Z',1,... % Текущее состояние автомата, нач.сост.=1

'Tvh',0,... % Время входа в текущее состояние

'nZ',[1,0,0],... % Счетчики состояний

'tZ',[0,0,0],... % Счетчики продолжительности состояний

'mZ',0,... % Подсчет среднего состояния

'TabZ',[1,2,3;1,1,1; 1,1,2],... % Автоматная таблица состояний

'TabVs',[0,1,3; 3,6,4;1,0,0]); % Таблица выходных сигналов

function [dT,Sign]=generat[pN,lambda];

Sign=diskrdat(pN);

dT=pokdat(lambda);

function n=diskrdat(pN);

r=rand;

[a,n]=min(pN<r);

function Z=pokdat(lambda);

t=rand; % Случайное значение на отрезке [0,1]

while

t==1; t=rand;

end; % Пока значение равно 1, повторяем выбор

z=-(1/Lambda)*log(1-t);

function [Vhd,avt]=avtwork(avt,s);

global t

Zst=avt.Z; % Запоминаем текущее состояние автомата

Znov=avt.TabZ(Zst,s); % Находим по таблице новое состояние

Vhd =avt.TabVs(Zst,s); % Определяем выходной сигнал

if Zst ~= Znov % Если состояние изменилось

dT=t-avt.Tvh; % Время, которое провел автомат в старом состоянии

if dT > 0 % Если это время не нулевое

avt.nZ(Zst)=avt.nZ(Zst)+1; % Увеличиваем счетчик старого состояния

avt.tZ(Zst)=avt.tZ(Zst)+ dT; % Находим общее время для старого состояния

avt.mZ = avt.mZ + Zst*dT; % Подсчитываем среднее состояние автомата

end

avt.Tvh=t; % Запоминаем время входа в новое состояние

avt.Z=Znov; % Делаем текущим состоянием новое состояние

end

function pprint(avt);

global Tmod

Nz=sum(Avt.nZ); % Суммируем число всех наблюдаемых состояний

procZ=Avt.nZ/Nz*100 % Процент количества каждого состояния среди всех

sredT=Avt.tZ./Avt.nZ % Среднее время нахождения в каждом состоянии

verZ=Avt.tZ./Tmod % Вероятность каждого состояния