Консультация № 185119
08.01.2012, 18:56
405.73 руб.
0 35 0
Уважаемые эксперты! Требуется решить следующую задачу:
По графу состояний СМО (прикрепляю архив с построенным графом и первоначальными условиями по которым он был построен ниже) построить имитационную модель использую метод имитации Марковских процессов (программа на языке Turbo Pascal).

Граф СМО:Graf_SMO.rar (124.5 кб)

Примечание:
так же есть информация, что для построения этой имитационной модели сначала провести "короткую" имитацию для N1=1000 для нахождения оценок Pi0. Затем по этой модели провести "длинную" имитацию стационарного режима с определением вероятностей Pi и точностью E(эпсилон)=0,003.

Прошу программу подкрепить комментариями. Спасибо.

Обсуждение

Неизвестный
12.01.2012, 13:18
общий
и - источник информации, к1- первый канал, к2-второй канал, имеющий один накопитель Н, к3- третий канал имеющий один накопитель Н. В маткад файле приведена имитация, подобную мы и должны реализовать на языке паскаль. в итоге должно получиться на выходе программы18 состояний системы, и вероятности переходов в эти состояния, сумма вероятностей должна равняться 1.
давно
Профессионал
304622
583
12.01.2012, 15:05
общий
и - источник информации, к1- первый канал, к2-второй канал, имеющий один накопитель Н, к3- третий канал имеющий один накопитель Н.


Теперь ясно. (С каналами я догадался, а про накопители, спасибо, ты разъяснил.) Впрочем, если ставить задачу моделирования именно марковского процесса с готовой матрицей переходов (уже заданной графом, как исходные данные), то внутренняя структура системы (наличие накопителей и т.д.) уже не столь важна. Хотя безусловно полезна для понимания.

Т.е. преобразование исходной схемы с каналами и накопителями в граф переходов -- это предварительная работа, котрую я сейчас считаю уже выполненной и ограничиваюсь написанием паскаль-программы, имитирующей сам процесс. Потом могу проверить правильность формирования графа (если надо).

В маткад файле приведена имитация, подобную мы и должны реализовать на языке паскаль


Это не совсем так. В маткад-файле дано теоретическое решение -- через решение системы дифф. уравнений. А в заднии требуется имитационное моделирование. Обычно под понимается стохастическое моделирование -- через разыгрывание случайных значений для переходов из текущего состояния в какое-либо другое на каждом шаге.
давно
Профессионал
304622
583
12.01.2012, 15:09
общий
Повторяю ещё раз прошлый вопрос:

Не совсем ясно, чем принципиально отличается "короткая" имитация от "длинной". Вероятно, разница только в количестве шагов?
Неизвестный
12.01.2012, 15:39
общий
Вы все правильно поняли. Дальнейшая реализация программы возможна? если да, то через какой промежуток времени она будет готова?
Неизвестный
12.01.2012, 15:41
общий
количество накопителей необходимо ввести с терминала
давно
Профессионал
304622
583
12.01.2012, 15:58
общий
Дальнейшая реализация программы возможна? если да, то через какой промежуток времени она будет готова?


Думал к этому первый набросок будет, но возникла ещё одна неясность -- ниже спрошу. Сегодня вечером, наверно, можно что-то получить.

активность консультации по 13 январе


ДО 13 января или завтра включительно?
Неизвестный
12.01.2012, 16:01
общий
у меня есть аналогичная рабочая программа, но она выполнена по графу с начальными условиями: И-К1-Н3Н2Н1К2. Могли бы вы переделать ее под наше задание? Программа нужна срочно.
Неизвестный
12.01.2012, 16:10
общий
Вот программа: LABAAAAA.PAS (2.7 кб)
давно
Профессионал
304622
583
12.01.2012, 16:14
общий
Важный вопрос, котрый я забыл уточнить сразу: для моделирования рассматривается случайные процесс с дискретным или непрерывным временем? В первом случае, на каждом шаге как бы заново бросается монетка для каждого возможного перехода. Во втором случае, момент времени каждого следующий события (перехода) разыгрывается по показательному закону распределения. В принципе, для этой задачи возможно и то, и другое.
Неизвестный
12.01.2012, 16:16
общий
12.01.2012, 16:19
Случайный процесс с дискретным временем
давно
Профессионал
304622
583
12.01.2012, 16:23
общий
Могли бы вы переделать ее под наше задание? Программа нужна срочно.


Почему бы и нет?

Так. Судя по тексту, процесс с непрерывным временем. Поглядим.

Программа нужна срочно.


Т.е. сегодня вечером?
Неизвестный
12.01.2012, 16:26
общий
Да, программа нужна сегодня вечером, до полуночи.
давно
Профессионал
304622
583
12.01.2012, 16:27
общий
Цитата: 359057
Случайный процесс с дискретным временем


Вот это выражение:
Код:
t1:=-ln(random)/(graf[j].ves);

обычно применяется для вычисления следующего случайного момента на непрерывной оси времени. Посмотрим.
Неизвестный
12.01.2012, 16:30
общий
Значит делать по аналогии, возьметесь?
давно
Профессионал
304622
583
12.01.2012, 16:38
общий
Да, конечно.
Неизвестный
12.01.2012, 16:40
общий
Будем ждать, если будут вопросы - пишите
давно
Профессионал
304622
583
12.01.2012, 17:05
общий
Я очень удивился, прочитав ваше пояснение:
количество накопителей необходимо ввести с терминала


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

Вероятно, вы неправильно понимаете (и, соответственно, формулируете) постановку задачи. Граф, который вы выложили в задании -- это не исходные данные, а частный пример решения.

Сейчас прерываюсь. Остальное дома. (Думаю, сегодня всё получится.)
давно
Профессионал
304622
583
12.01.2012, 23:07
общий
Надо отметить, что эта программа расчитанна не на
"И-К1-Н3Н2Н1К2",
как вы написали, а на
"И-НК1-НК2"

По сути же предложенная вами программа вызывает у меня очень сильные сомнения. Как-то она странно организована -- по моему она работает неправильно. В ней расчёт коэффициентов перехода задан через вложенные циклы: 2 цикла для 2 каналов. У вас 3 канала -- как перекладывать этот алгоритм 3 цикла очень туманно.

Неизвестный
12.01.2012, 23:18
общий
нет, выложенная программа была написана именно для И-К1-Н3Н2Н1К2 , где при вводе количества накопителей пишется L1=0, L2=3.
по поводу циклов, именно это мы и просили Вас осуществить, сделать из программы для 2 каналов программу для 3 каналов где само собой должен быть цикл для m3 (интенсивность обслуживания)
Неизвестный
12.01.2012, 23:23
общий
если Вам удобнее будет реализовать эту задачу методом не схожим с выложенной программой, то я не против, главное для меня это аналогичный результат
давно
Профессионал
304622
583
12.01.2012, 23:52
общий
Нет, система формируется каким-то совершенно невероятным образом. Формирование системы надо переделывать полностью. Моделирование можно оставить.

Жаль только времени уже поздно. Завтра уже никак?
Неизвестный
12.01.2012, 23:58
общий
Время только до завтрашнего утра, до 10 часов, дальше смысла решать нет. Программы прикрепленная Вам хотя и функционирует невероятным образом, выдает правильные результаты, нам бы такую же невероятную программу, но с правильными результатами для нашего задания.
давно
Профессионал
304622
583
13.01.2012, 00:49
общий
выдает правильные результаты


Откуда там возьмутся правильные результаты? Если ей задать L1=1 и L2=1, т.е. 2 канала с 2 накопителями, то в графе получается 6 дуг с весом [$955$]. А посмотрите готовый граф для вашей задачи: 3 каналс с 2 накопителями -- 5 дуг с весом [$955$].

Ваша программа выстраивает состояния в матрицу, где номер строки -- это количество накопившихся заявок на 1-м канале, а номер столбца -- на 2-м.

Дуги с весом [$955$] задаются по строкам:
от первого до последнего элемента 1-й строки,
(if j<n2 then graf[z].vh:=S[i,j+1])
от него переход на первый элемент второй,
(else graf[z].vh:=S[i,j]+1)
снова по строке и т.д. кроме последней строки.
(for i:=1 to (n1-1) do)
Цепочка обрывается на первом элементе последней строки.

Последовательная цепочка по строке означает, что каждая новая заявка ставится в накопитель 2-го канала, пока он не заполнится.

Переход с последнего элемента одной строки на первый элемент следующей означает, что при заполнении накопителя 2-го канала новая заявка добавляется в 1-й канал, но накопитель 2-го при этом обнуляется!!! Это же вздор?!
давно
Профессионал
304622
583
13.01.2012, 00:56
общий
Пока я прикидываю как бы по другому формировать систему.

Вы, действительно уверены, что количество накопителей надо задавать произвольным?

Программа вашего друга, оказывается, должна работать только при определённых значениях L1 и L2! Зачем тогда вводить их с клавитатуры и катастрофически усложнять алгоритм. Так не бывает. Может вы всё-таки неправильно поняли задание?
давно
Профессионал
304622
583
13.01.2012, 01:00
общий
Учтите, что в маткад-файле система построена в соответствии с графом из файла "Граф СМО.doc", а значит совершенно не соответствует программе LABAAAAA.PAS.
Неизвестный
13.01.2012, 01:08
общий
реализуйте программу как считаете нужным, нас интересует только правильность решения для конкретно нашего задания. программа высланная имела совсем иные исходные данные, результат по своему заданию (по смыслу схожим с нашим) выполнявшая верно, пусть даже и сомнительным методом .
Неизвестный
13.01.2012, 01:13
общий
т.к. каналов в нашем задании 3 штуки то от нас требуют чтобы программа запрашивала так же три раза число накопителей (L1,L2,L3). L1 мы соответственно должны ввести равным нулю. остальное в прогоне вам известно. на каком Вы этапе? и стоит ли нам все еще надеяться на решение данной задачи до 10 утра?
Неизвестный
13.01.2012, 01:17
общий
если Вы зададите число накопителей константой, я думаю преподаватель мой не станет сильно возражать. просто в образце ввод тех же констант производился с терминала
давно
Профессионал
304622
583
13.01.2012, 01:50
общий
Вот чем могу помочь сегодня.

В файле graf.txt задан готовый граф состояния (по дугам):

[code h=200] 1 2 1.0
2 3 1.0
2 1 0.4
3 4 1.0
3 2 0.5
3 12 0.4
4 5 1.0
4 3 0.8
4 8 0.5
4 14 0.4
5 6 1.0
5 4 0.5
5 9 0.4
5 10 0.8
6 5 0.8
6 11 0.5
6 15 0.4
7 1 0.8
8 2 0.8
8 7 0.4
9 13 0.8
9 14 0.5
10 3 0.5
10 13 0.4
11 4 0.8
11 16 0.4
11 18 0.5
12 1 0.5
13 12 0.5
14 7 0.5
14 12 0.8
15 9 0.8
15 16 0.5
16 14 0.4
16 17 0.5
17 7 0.8
18 8 0.8
18 17 0.4[/code]

Ваша программа считывает граф из файла и делает расчёт:
[code h=200]Program lab3;
uses crt;
const
Op=32000;
type Elem=record
icx,vh:word;
ves:real;
end;
var f,g:text;
graf:array[1..200] of elem;
pp:array[1..100] of real;
i,j,jj,z,n,str,ir,k:integer;
x1,x2,tt,t1,min,sum,od:real;

BEGIN
clrscr;

assign(g,'graf.txt');
reset(g);
z:=0;
n:=0;
while not eof(g) do
begin
inc(z);
readln(g,graf[z].icx,graf[z].vh,graf[z].ves);
if graf[z].icx>n then n:=graf[z].icx;
if graf[z].vh>n then n:=graf[z].vh;
writeln(z:4,graf[z].icx:4,graf[z].vh:4,graf[z].ves:6:1);
end;
close(g);
readkey;


assign(f,'asd.txt');
rewrite(f);
for j:=1 to n do {n kol vershin}
pp[j]:=0;
i:=1;
str:=0; {vibiraem vershinu no 1, strok b fail }

x1:=0;

{providim Op=32000 opitov}
for ir:=1 to Op do
begin
if ir mod 1000=0 then writeln('pachet iz',Op,' provideno oЇitov',ir:5);
min:=9.0e+20;
for j:=1 to z do
begin
if graf[j].icx=i
then
begin
t1:=-ln(random)/(graf[j].ves);
if t1<min
then
begin
min:=t1; k:=graf[j].vh
end;
end;end;

x2:=x1+min;
if str<=10 {v fail c:\fil.prn otpravil 16 strok}
then
begin
str:=str+1;
writeln(f,k:5,x1:13:3,x2:13:4);
end;

if ir=Op div 5
then tt:=x1;
if ir>=Op div 5
then pp[i]:=pp[i]+(x2-x1);
x1:=x2;
i:=k;
end;
writeln(' x2=',x2:8:5,' -obshi vrma paboti cictem');
writeln;
close(f);
for j:=1 to n do
begin
pp[j]:=pp[j]/(x2-tt);
writeln( 'P[',j:2,']=',pp[j]:7:3);
end;
sum:=0;
for j:=1 to n do
sum:=sum+pp[j];
writeln;
writeln(' summa P=',sum:5:4);
readkey;
end.
[/code]

Это соответствует поставленной задаче. Если надо построение графа в программе, то завтра-послезавтра.
Неизвестный
13.01.2012, 06:59
общий
Граф состояния должен был формироваться самой программой.
Нет, спасибо и на этом. Сегодня я ее буду сдавать, так что дальнейшая работа над ней не имеет смысла
Форма ответа