Консультация № 180699
12.11.2010, 20:28
46.09 руб.
0 10 1
Здравствуйте.
Помогте мне пожалуйста написать программу по блок - схеме


Вместо альфа для 1 го канала и для n-го канала исп.фррмулы
tpr1 := T-T1*;
summa(tpr) := summa(tpr1)+tpr1;
R;
t(obsl)=-(1/Mi)*ln(R) := 0;
T1* := T+t(obsl);

где R - генератор случайных чисел
t*-время освобождения канала(окончание обслуживания)
[$8721$]tпр - абсолютная пропускная способность
T - время совершения события

Приложение:
//вот код который я пытался написать

procedure Algorithm;
begin
Readln(Landa,Mi, Tk);
T := 0;
Ti* := 0;
ttpri := 0;
n := 0;
m := 0;
if Tk > T then
begin
R;
t0 := -(1/landa)*ln(R);
T := T+tz;
if T1* > T then
begin
if T2* > T then
begin
if Tn* > T then
begin
m := m+1;
end
else
begin
альфа для n-го канала;
end;
end
else
begin
альфа для 1 го канала;
end;
end
else
begin
tpr1 := T-T1*;
summa(tpr) := summa(tpr1)+tpr1;
R;
t(obsl)=-(1/Mi)*ln(R) := 0;
T1* := T+t(obsl);
end;
n := n+1;
end
else
begin
вычисление характеристик;
end;
end;
end.

Обсуждение

давно
Профессионал
304622
583
13.11.2010, 15:22
общий
Плохое качество картинки. С трудом что-то рабирал. Кое о чём догадался из сопоставления с приложенным текстом.

Замечания, которые можно сделать сразу:
1) Это задача, вероятно, для Паскаля, а не для Делфи
2) Соответственно заголовок надо исправить с "procedure", на "program"
3) После заголовка должен быть раздел "var" с писанием всех переменных
4) Под T1, T2, ..., Tn вероятно подразумевается массив. Например,
T:array[1..n] of integer;
Под tpr1,... вероятно тоже.
5) Первое ветвление поразумевает не условие if, а цикл while. Т.е. не "if Tk>T then", а "while Tk>T do".
6) Каскад ветвлений ниже подразумевает цикл "for i:=1 to n do" для элемента T[i].
7) Соответственно на рисунке вместо "альфа для 1-го канала", вероятно, должно быть написано "альфа для 2-го канала". (Особенно если сопоставить с тем, что под "Tn>T" написано "альфа для n-го канала".)

Непонятно:
1) Где и как задаётся переменная obsl. Можно предположить, что obsl -- это как раз индексная переменная цикла for (вместо i), но тогда выше вместо T1 тоже должно было быть написано T(obsl). Возможно, что автор рисунка специально написал одно и то же значение сначала как T1 (типа для наглядности), а потом как t(obsl).
2) Что должно быть в "вычислении характеристик".

Исходя из вышеперечисленного можно набросать кое-какой текст, хотя запускаться он пока не будет. Если вас это устроит могу закинуть это в ответы.
давно
Профессионал
304622
583
13.11.2010, 16:05
общий
Хм-м! А блок-схему кто составлял? Сам?

Если я правильно понял, эта блок-схема моделирует процесс работы диспетчеров. Это т.н. метод Монте-Карло. В принципе, есть простой теоретический способ рассчёта данной вероятности (одной формулой). Но если нужен именно такой путь, через стохастическое моделирование, то могу попробовать дописать эту программу. Там почти всё ясно.
давно
Профессионал
304622
583
13.11.2010, 16:08
общий
Цитата: 324805
http://i018.radikal.ru/1011/6e/cdb2adfe2937.jpg


Этот рисунок такой же мутный, как и в исходном задании.
давно
Профессионал
304622
583
13.11.2010, 16:20
общий
Цитата: 324805
Pотк=(m/n+m) вероятность отказа в обслуживании


Это я уже понял.

Цитата: 324805
и можно тогда дописать программу


Ориентировочно сегодня-завтра.
давно
Профессионал
304622
583
13.11.2010, 21:21
общий
забыл вам сказать, что t(индекс) и T(индекс) это разные переменные


Ясно.

а вам точно все понятно в задачке, а то боюсь что неправильно получится?


Когда буду писать, посмотрю. Думаю, не надо сильно переживать -- разберёмся. Сроки не сильно поджимают?

Сейчас обратил внимание на твоё пояснение, что это марковский процесс из СМО. Та теоретическая формула, по которую я подумал, тут конечно, не продойдёт.
давно
Мастер-Эксперт
325460
1469
15.11.2010, 13:33
общий
Адресаты:
Вопрос все еще актуален?
или напишет решение?
Об авторе:
to live is to die
давно
Профессионал
304622
583
15.11.2010, 18:55
общий
Адресаты:
Через пару часов выложу свой ответ.
давно
Профессионал
304622
583
15.11.2010, 20:54
общий
это ответ
Здравствуйте, novij2011!

Итак. Для начала отмечу, что в твоём описании параметров,
наверняка, есть ошибка. Поэтому даю два варианта ответа. Сначала
даю (в порядке формализма) первый, сделанный в полном
соответствии данным тобой описанием. Скорее он неверен.

Код:

const nkmax=20; {максимально возможное количество каналов в программе}
var i,Mi,n,m:integer;
Tz,Tpr,Tobsl:array[1..nchmax] of real;
T,Tk,T0,STpr,Landa,Trazg,R:real;

begin
Landa:=strtofloat(edit1.Text);
Mi:=strtofloat(Edit2.Text);
Tk:=strtofloat(Edit3.Text);
{ Tiz:=0; ttpri:=0 }
for i:=1 to Mi do
begin
Tz[i]:=0;
Tpr[i]:=0;
Tobsl[i]:=0;
end;
STpr:=0;
T := 0;
n := 0;
m := 0;
randomize; {делается только одн раз в начале работы программы}
while Tk > T do
begin
{Здесь у тебя, очевидно, выражение, обратное к функции
показательного распределения. Это значит R -- это вероятность
и должно быть случайным в интервале (0;1) }
R:=random;
T0 := -(1/landa)*ln(R);
T := T+T0; {Сомнительно, чтобы тут надо было прибавлять Tz,
т.к. это массив. Строкой выше было вычислена T0 -- его и надо
прибавлять.}
{Каскад if'ов реализуется в виде цикла
для поиска первого Tz[i], который меньше чем T}
i:=1;
while (i<=Mi) and (Tz[i]>T) do
i:=i+1;
if i>Mi {T оказалось меньше всех Tz[i]}
then m:=m+1
else begin {иначе, т.е. нашлось i, что Tz[i]<T}
{альфа для i-го канала;}
Tpr[i] := T-Tz[i];
STpr := STpr+Tpr[i];
R:=random;
T0:=-(1/Mi)*ln(R);
Tobsl[i]:=Tobsl[i]+T0; {Так будет правильнее, по-моему}
Tz[i] := T+T0;

n := n+1;
end;
end;
Edit4.Text:= FloatToStr(m/(m+n)); {вероятность отказа в обслуживании}
Edit5.Text:= IntToStr(m+n); {сколько звонков поступило}
Edit6.Text:= FloatToStr(STpr); {свободных(неиспользованных) минут}
{Ниже: i-ый канал использовался...
Количество использованных каналов в программе нефиксированно, значит
нельзя записывать просто в Edit. Можно использовать Memo, хотя есть
более правильные способы вывода данных}
Memo1.Clear;
for i:=1 to Mi do
Memo1.Lines.Add(FloatToStr(Tobsl[i]));

end;


Теперь, какие здесь проблемы.
1) Переменная Tk не может средним временем телефонного
разговора. Она используется в основном цикле, как ограничитель
на основное время T. Скорее всего Tk -- это "конечное время",
т.е. общее время работы модели. Для среднего времени разговора
я ввёл переменную Trazg.
2) Переменная Mi не может быть количеством диспетчеров. Она
используется в расчёте времени обслуживания -- там делить на
количество диспетчеров бессмысленно. На блок-схеме это n,
которое в T1,...,Tn (причём её нельзя путать с n --
количество обслуженных звонков). Для количества каналов я ввёл
переменную nch.
3) Поскольку перменная Mi используется в формуле расчёта времени
звонка, то (с учётом её названия) это скорее всего т.н.
частота восстановления [$956$] ("мю"). Она обратна к среднему
времени звонка Mi:=1/Trazg.
4) В заданных исходных данных несогласованы единицы измерения: в
одном -- часы, в другом -- минуты. Поскольку результат
запрашивается в минутах, то я задал в программе перевод в
минуты среднего числа ввызовов:
Landa:=strtofloat(edit1.Text)/60.

Таким образом, получается следующий код. Насколько я понял, в
Дельфу ты засунешь это сам. Попробовал -- результат
правдоподобный. Если что -- пиши.


Код:

const nchmax=20; {максимально возможное количество каналов в программе}
var i,n,m,nch:integer;
Tz,Tpr,Tobsl:array[1..nchmax] of real;
T,Tk,T0,STpr,Landa,Trazg,Mi,R:real;

begin
Landa:=strtofloat(edit1.Text)/60;
Trazg:=strtofloat(Edit2.Text);
Mi:=1/Trazg;
Tk:=strtofloat(Edit3.Text);
nch:=strtoint(Edit7.Text);
{ Tiz:=0; ttpri:=0 }
for i:=1 to nch do
begin
Tz[i]:=0;
Tpr[i]:=0;
Tobsl[i]:=0;
end;
STpr:=0;
T := 0;
n := 0;
m := 0;
randomize; {делается только одн раз в начале работы программы}
while Tk > T do
begin
{Здесь у тебя, очевидно, выражение, обратное к функции
показательного распределения. Это значит R -- это вероятность
и должно быть случайным в интервале (0;1) }
R:=random;
T0 := -(1/landa)*ln(R);
T := T+T0; {Сомнительно, чтобы тут надо было прибавлять Tz,
т.к. это массив. Строкой выше было вычислена T0 -- его и надо
прибавлять.}
{Каскад if'ов реализуется в виде цикла
перебирающего Tz[i], пока не найдёт меньший чем T}
i:=1;
while (i<=nch) and (Tz[i]>T) do
i:=i+1;
if i>nch {если T оказалось меньше всех Tz[i]}
then m:=m+1
else begin {иначе, т.е. нашлось i, что Tz[i]<T}
{альфа для i-го канала;}
Tpr[i] := T-Tz[i];
STpr := STpr+Tpr[i];
R:=random;
T0:=-(1/Mi)*ln(R);
Tobsl[i]:=Tobsl[i]+T0; {Так будет правильнее, по-моему}
Tz[i] := T+T0;

n := n+1;
end;
end;
Edit4.Text:= FloatToStr(m/(m+n)); {вероятность отказа в обслуживании}
Edit5.Text:= IntToStr(m+n); {сколько звонков поступило}
Edit6.Text:= FloatToStr(STpr); {свободных(неиспользованных) минут}
{Ниже: i-ый канал использовался...
Количество использованных каналов в программе нефиксированно, значит
нельзя записывать просто в Edit. Можно использовать Memo, хотя есть
более правильные способы вывода данных}
Memo1.Clear;
for i:=1 to nch do
Memo1.Lines.Add(FloatToStr(Tobsl[i]));

end;
5
спасибо за ответ
давно
Профессионал
304622
583
17.11.2010, 11:49
общий
Цитата: 324805
мне очень не нравится что при каждом нажатии равно результат меняется


Именно так и должно быть. Это же стохастическое моделирование. При каджом запуске генерируется какой набор случайных чисел и по ним реассчитывается результат. И он каждый раз отличается, потому что это случайные числа -- детерминированных значений и не должно быть Просто в силу закона больших чисел при увеличении выборки результат в стохастическом смысле сходится истинному значению.

Цитата: 324805
при Tk=10 и более вероятность отказа стояновится=0


У меня получались вполне осмысленные результаты. Выложи свой дельфовский проект -- посмотрю опечатки.

Цитата: 324805
если что я могу на вас рачитывать, если вдруг что то не то?


Да, пиши.
давно
Мастер-Эксперт
680
2811
18.11.2010, 18:50
общий
Не нужно удалять посты из мини-форума. Теряется нить обсуждения.
Содержание мини-форума в рассылку не уходит.
Форма ответа