Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Delphi и Lazarus


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Орловский Дмитрий
Статус: Профессор
Рейтинг: 2717
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2539
∙ повысить рейтинг »
Евгений/Genia007/
Статус: Профессионал
Рейтинг: 1116
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Delphi и Lazarus

Номер выпуска:1565
Дата выхода:17.11.2010, 20:30
Администратор рассылки:Калашников О.А. (Руководитель)
Подписчиков / экспертов:276 / 192
Вопросов / ответов:1 / 1

Вопрос № 180699: Здравствуйте. Помогте мне пожалуйста написать программу по блок - схеме


Вопрос № 180699:

Здравствуйте.
Помогте мне пожалуйста написать программу по блок - схеме


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

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

Отправлен: 12.11.2010, 20:28
Вопрос задал: novij2011 (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Сергей Бендер (5-й класс) :
Здравствуйте, 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;
Tobs l[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:=rand om;
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 используется в формуле расчёта времени
звонка, то (с учётом её названия) это скорее всего т.н.
частота восстановления μ ("мю"). Она обратна к среднему
времени звонка 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:= IntT oStr(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-й класс)
Ответ отправлен: 15.11.2010, 20:54
Номер ответа: 264076

Оценка ответа: 5
Комментарий к оценке:
спасибо за ответ

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264076 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.23 от 10.11.2010

    В избранное