Консультация № 181114
05.12.2010, 16:38
50.00 руб.
0 91 1
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:

Помогите пожалуйста правильно написать программу. (блок-схема прилагается)
Ссылка для скачивания задания
Блок-схема

тема:
Моделирование одноканальной СМО с буфером конечной емкости



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

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
Label5: TLabel;
Edit4: TEdit;
Label6: TLabel;
Edit5: TEdit;
Label7: TLabel;
Label8: TLabel;
Edit6: TEdit;
Label9: TLabel;
Edit7: TEdit;
Label10: TLabel;
Edit8: TEdit;
Label11: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var landa,R,K,Tk,n,m,p:integer;
Potk,tz,T,bTz,tobsl,Tzvezda:real;
begin
Landa:=Strtoint(edit1.Text);//интенсивность автомобилей в час
M:=Strtoint(Edit2.Text);//среднее время
Tk:=720;//минут в сутки
P:=Strtoint(Edit3.Text);//емкость накопителя
T := 0;
Tzvezda := 0;
K := 0;
n := 0;
m := 0;
Randomize;
R:=random(100);;
tz := (1/Landa)*Ln(R);
bTz:=T+tz;
while T < Tk do
begin
if Tzvezda > bTz then
begin
T := bTz;
K := K+1;
if p+1 >= K then
begin
n := n+1;
end
else
begin
K := K-1;
m := m+1;
end;
if K = 1 then
begin
R:=random(100);
tobsl := (-1/M)*ln(R);
Tzvezda := bTz+tobsl;
end
else
begin
end;
R:=Random(100);
tz := (-1/Landa)*ln(R);
bTz := bTz+tz;
end
else
begin
T := Tzvezda;
if K > 0 then
begin
K := K-1;
end
else
begin
end;
if K = 0 then
begin
Tzvezda := Tk;
end
else
begin
R:=Random(100);
tobsl := (-1/M)*Ln(R);
Tzvezda := T+Tobsl;
end;
end;
end;
//вычисление характеристик
//вероятность отказа
if p = 1
then Potk := 1/(m+2)
else Potk := (Power(p, (m-1))*(1-p))/(1-(Power(p, (m+2))));
Edit6.Text:=floattostr(Potk);
end;
end.

Обсуждение

Неизвестный
09.12.2010, 11:42
общий
я сам в шоке
Неизвестный
09.12.2010, 11:49
общий
среднее время ожидания клиента в очереди

а это сложно реализовыается?
Время брать с компьютера.
давно
Мастер-Эксперт
325460
1469
09.12.2010, 12:04
общий
не! время берется с модели реализации с блок-схемы, там когда приходит, уходит заявка, ну надо посидеть...
сейчас нет времени, а это срочно надо?
к примеру вероятность пересчитать - не проблема.
а вот с временами и вероятность без очереди... надо подумать, проработать всю блок-схему, разобрать приход уход и времена.
Об авторе:
to live is to die
Неизвестный
09.12.2010, 12:17
общий
я могу подождать,но там время активной консультации осталось немного. Там ведь edit 8 пересчтать только по новому алгоритму нужно.
давно
Мастер-Эксперт
325460
1469
09.12.2010, 12:22
общий
ОБСУЖДЕНИЕ МОЖНО ПРОДОЛЖАТЬ И ПОСЛЕ ЗАВЕРШЕНИЯ КОНСУЛЬТАЦИИ НЕ ПЕРЕЖИВАЙТЕ.
в общем если брать все параметры из модельного процесса то у нас все формулы рассчитаны неправильно.

Так давайте еще раз с заданием, чтобы все верно и правильно.
формулы, которые даны в доковском файле они нужны только для реализации модели?
или по ним нужно произвести вычисления (если этот вариант нужный, то у нас все правильно)?
иначе нужно переделать алгоритм модуляции введя в него несколько параметров, которые покажут сколько автомобилей было обслужено без очереди, сколько времени обслуживался каждый автомобиль.
Об авторе:
to live is to die
Неизвестный
09.12.2010, 12:27
общий
получается что формулы только были нужны чтобы посчитать вручную. А для программы придется все таки тогда нужно переделать алгоритм модуляции введя в него несколько параметров, которые покажут сколько автомобилей было обслужено без очереди, сколько времени обслуживался каждый автомобиль.

Извините что так получилось. Сам незнал до сегодняшнего дня.
давно
Мастер-Эксперт
325460
1469
09.12.2010, 12:35
общий
ничего, переделаем :)
не сильно сложно, сейчас придумаем чего.
Об авторе:
to live is to die
Неизвестный
09.12.2010, 13:05
общий
Для сверки результата правильности работы программы:
Pотк=0,13 (у нас такой же почти ответ)
P(без отказа) = 0,81
среднее время ожидания заявки в очереди = 0,54
давно
Мастер-Эксперт
325460
1469
09.12.2010, 13:27
общий
теперь берем все из алгоритма, внимательно пересмотрите все, сделал несколько изменений в блок-схеме
теперь все параметры берутся из модели, если что не понятно спрашиваем
Код:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
Label5: TLabel;
Edit4: TEdit;
Label6: TLabel;
Edit5: TEdit;
Label7: TLabel;
Label8: TLabel;
Edit6: TEdit;
Label9: TLabel;
Edit7: TEdit;
Label10: TLabel;
Edit8: TEdit;
Label11: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
K,p,i,io,n,m:integer;ro,Potk,Pbo,tz,bTz,tobsl,Tzvezda:real;
landa,Toc,T,Tk,Mi,R,Trazg:real;
Tin: array [0..300] of real;
Tout: array [0..300] of real;
begin
Landa:=Strtofloat(edit1.Text);//интенсивность автомобилей в час
Trazg:=Strtofloat(Edit2.Text)/60;//среднее время
Mi:=1/Trazg;
Tk:=24;//часов в сутки
P:=Strtoint(Edit3.Text);//емкость накопителя
ro:= Landa/ Mi;
T := 0;
Tzvezda := 0;
K := 0;
n := 0; // обслужено
m := 0; // отказано
Pbo:=0;
i:=0;
io:=0;
Randomize;
R:=random;
tz := (1/Landa)*Ln(R);
bTz:=T+tz;
while T < Tk do
begin
if Tzvezda > bTz then
begin

T := bTz;
K := K+1;
if p+1 >= K then
begin
Tin[i]:=T;
i:=i+1;
// i:=i-1;
n := n+1;
if K=1 then
begin
Pbo:= Pbo+1;
end;
end
else
begin

K := K-1;
m := m+1;
end;
if K > 0 then
begin
R:=random;
tobsl := -(1/Mi)*ln(R);
Tzvezda := bTz+tobsl;
end;

R:=Random;
tz := -(1/Landa)*ln(R);
bTz := bTz+tz;
end
else
begin
T := Tzvezda;
if K > 0 then
begin
Tout[io]:=T;
io:=io+1;
K := K-1;
end;
if K = 0 then
begin
Tzvezda := Tk;
end
else
begin
R:=Random;
tobsl := -(1/Mi)*Ln(R);
Tzvezda := T+Tobsl;
end;
end;
end;

//вычисление характеристик
n:=n-K;
Toc:=0;
for i:= 0 to io-1 do
begin
Toc:=Toc+Tout[i]-Tin[i];
end;
Toc:=Toc/io;

// клиентов прибыло
Edit4.Text:=inttostr(n+m);
//количество отказов
Edit5.Text:=inttostr(m);
// n-m количество обслуженных машин
//вероятность отказа
Potk:=m/(n+m);
Edit6.Text:=floattostr(Potk);
// вероятность что будет обслужена без очереди
Pbo := Pbo/(n+m);
Edit7.Text:=floattostr(Pbo);
// время ожидания
Edit8.Text:=floattostr(Toc);
end;
end.
Об авторе:
to live is to die
давно
Мастер-Эксперт
325460
1469
09.12.2010, 13:30
общий
не подгоняем к ответу, а правильно реализовываем.
откуда у Вас блок-схема?
по-моему она не верная.
из нее нельзя получить модель системы.
смотрите выше приведенный код, все вроде должно работать верно, и цифры хорошие получены.
Об авторе:
to live is to die
Неизвестный
09.12.2010, 13:34
общий
блок-схему нам дали. Сейчас посмотрю программу.
давно
Мастер-Эксперт
325460
1469
09.12.2010, 13:44
общий
по этой блок-схеме решение получится не может
как может уменьшится количество заявок при постановке машины на очередь?
и K=1 тут имеется ввиду есть хоть ли одна заявка а это условие K>0
если делать так как понял я то и m и n и k принимают значения которые Вы раньше говорили, ничего не надо перекручивать.
надеюсь мы получили окончательный вариант, по всем параметрам сходится.
Об авторе:
to live is to die
давно
Мастер-Эксперт
325460
1469
09.12.2010, 13:47
общий
смотрим среднее время ожидания клиента по времени 0.54+- 20 мин это в пределах от 0.8 до 0.3
вероятность что автомобиль будет обслужен без ожидания это не тоже самое что вероятность без отказа!
вероятность без отказа это 1- вероятность отказов.
у вас в задании посчитать вероятность того что не будет очереди, когда прибудет машина.
Об авторе:
to live is to die
Неизвестный
09.12.2010, 13:49
общий
Массив до 300. А почему именно 300? Не большее число, не меньшее?


Ладно мучить больше не буду. Думаю, если что не так смогу исправить сам.
давно
Мастер-Эксперт
325460
1469
09.12.2010, 13:54
общий
вообще лучше сделать чуть больше
300 т.к. в сутки в среднем прибывает 12 автомобилей 12*24 = 288 но еще надо учесть разброс 10-15% поэтому максимум 288*1,15=330 больше быть не должно.
вообще-то можно и уменьшить, т.к. количество обслуженных машин мы смотрим а это 10*24=240+10%=270 ну 300 чтобы наверняка :)

спрашивайте если еще что не понятно.
Об авторе:
to live is to die
Неизвестный
09.12.2010, 13:58
общий
А что то я не увидел ответа на вопрос что обозначает переменная io?

И еще вы случайно не знаете как сделать результат точнее? (в прошлой программе я просто увеличивал Tk - время моделирования)
давно
Мастер-Эксперт
325460
1469
09.12.2010, 14:03
общий
io мы ввели переменную для подсчета обслуженных заявок
Об авторе:
to live is to die
Неизвестный
09.12.2010, 14:06
общий
Цитата: CradleA
io мы ввели переменную для подсчета обслуженных заявок

спасибо, теперь все понятно.
давно
Мастер-Эксперт
325460
1469
09.12.2010, 14:07
общий
отлично :)
удач при защите работы :)
Об авторе:
to live is to die
Неизвестный
09.12.2010, 14:10
общий
отлично :)
удач при защите работы :)

спасибо. И вам удачи.
Неизвестный
09.12.2010, 14:50
общий
Адресаты:
Меня только немножко пугает такой разброс ответов
Potk=0.13
0,15
0,09
0,33
0,23
давно
Мастер-Эксперт
325460
1469
09.12.2010, 18:42
общий
да, разброс великоват...
но так генерит, может и нормально, сложно сказать на сколько все хорошо, но где можем ошибаться?
вот если бы 0.33 не было, то результаты в рамки входят.
Об авторе:
to live is to die
Неизвестный
09.12.2010, 19:32
общий
Адресаты:
вот ты когда изменял код , то были значения почти статическими, а то появлялся разброс. Какой нибудь бы сглаживающий кодик прописать.
давно
Мастер-Эксперт
325460
1469
09.12.2010, 19:38
общий
думаю, не стоит.
хотя можно со временем чего-нить помудрить, но вроде тут не плохо получается :)
пробуем защищать :)
главное что все понимаете в задаче, и можете объяснить. Если блок-схему дали, то сложно сказать почему такая, ведь не совсем верная она.
мое мнение такое, что надо пробовать защищать полученный код.
ведь у нас случайные величины, которые имеют определенный разброс. т.к. время моделирования маленькое, то и величины могут быть с таким разбросом (по-моему он вписывается в реальную модель).
Об авторе:
to live is to die
Неизвестный
09.12.2010, 19:53
общий
Адресаты:
спасибо. Ладно, оставим как есть, раз такие блок-схкмы дают.Пойду пробовать защищать.

p.s.
Теперь буду думать, как остальные программы без блок -схем писать.
давно
Профессионал
304622
583
09.12.2010, 22:10
общий
Адресаты:
Хм-м. сдаётся мне, что без массивов всё-таки можно было обойтись. Может проверите? Возьмите общее работы, вычтите время когда очередь была пустой и поделите на количество обслуженных машин. У меня такое ощущение, что как раз среднее пребывания в очереди и получите.
давно
Мастер-Эксперт
325460
1469
10.12.2010, 10:48
общий
Адресаты:
вполне Ваш вариантможно реализовать, но с массивами мне кажется проще для понимания.
Об авторе:
to live is to die
Неизвестный
10.12.2010, 11:40
общий
Продлил вопрос на сутки, чтобы была возможность закончить обсуждение. Если потребуется еще продлить, обращайтесь.
давно
Профессионал
304622
583
10.12.2010, 12:47
общий
Нет, больше ничего принципиального не нужно. Задача решена -- остальное уже так, разговоры.
Неизвестный
10.12.2010, 13:09
общий
Адресаты:
Да нет ненужно. Пусть так и останется с массивами. Так мне понятнее, ну и так преподаватель объяснил.
Форма ответа