IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> СМО с ожиданием, нормальное распределение, динамика ets
Jill
сообщение 26.07.2006 10:28
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 105
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


Не посылайте в FAQ, плз. Я там была. Конкретно по этой теме там пару слов wink.gif

Только начала разбираться, и уже появилось несколько камней преткновения.

Условие. Необходимо создать СМО с ожиданием из 10 элементов, где:
- время прибытия и время обслуживания - случайные числа с нормальным распределением (просто random не подходит)
- остальные компоненты просчитываются, но об этом позже
- соблюдается принцип очереди FIFO в динамике

Код (это не все, только то, что вызывает вопросы):
type
TPClient=^TClient; {описание элементов очереди}
TClient=record
t1:real; {время прибытия}
t2:real; {время ожидания}
next:TPClient;
end;
var
head,node:TPClient;
naf: boolean;
nay: real;
{процедура вывода на экран}
procedure Print1;
var
curr:TPClient;
n:integer;
begin
curr:=head;
while (curr<>NIL)do
begin
writeln(curr^.t1,' ',curr^.t2);
curr:=curr^.next;
end;
end;
{функция генерирования случайных чисел по закону норм.распределения}
function nrandom:real; {вопрос 1}
var u1,u2:real;
begin
naf:=not naf; if naf then nrandom:=nay
else begin
repeat
u1:=random;
until u1>0;
u1:=sqrt(-2*ln(u1));
u2:=random*pi*2;
nay:=u1*cos(u2);
nrandom:=u1*sin(u2);
end;
end;
{создание очереди}
procedure Queure;
var
node:TPClient;
curr:TPClient;
pred:TPClient;
n:integer;
begin
n:=0;
naf:=true;
while n<10 do begin
new(node);
node^.t1:=nrandom;
node^.t2:=nrandom; {вопрос 3}
curr:=head;
pred:=NIL;
while (curr<>NIL) and (node^.t1>curr^.t1) do {вопрос 2}
begin
pred:=curr;
curr:=curr^.next;
end;
if pred=NIL
then
begin
node^.next:=head;
head:=node;
end
else
begin
node^.next:=pred^.next;
pred^.next:=node;
end;
n:=n+1; end;
end;

begin
Queure;
Print1;
readln;
end.

Вопросы:
1. Во всех алгоритмах норм.распределения генерируемые числа - вещественные, а мне необходимы целые. Плюс - числа должны быть >=0. Как грамотно их преобразовать?
2. В первой колонке сформированых чисел, по-моему, должен быть порядок - этот пришел в 0-ой момент времени, этот в 1-ый и т.д. Во второй - упорядочивание не должно проводиться. Как разобраться с этим?
3. Во второй колонке не должен попадаться 0 (время обслуживания не может быть таковым). Достаточно ли просто прибавить 1?
И самый главный вопрос. После прогона получаются ОДИНАКОВЫЕ наборы чисел! Мне необходимо отразить результаты нескольких прогонов, а какой с них толк, если они одинаковые!

Помогите разобраться unsure.gif

Сообщение отредактировано: volvo - 3.11.2006 19:55
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Бродяжник
сообщение 26.07.2006 13:29
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 206
Пол: Мужской

Репутация: -  3  +


Если идет речь о нормально распределенных случайных числах, то они ведь распределены на каком-то интервале, верно?
Итак, имеем
Fi - очередное сгенерированное Вашей функцией вещественное случайное число. Видимо, оно будет в интервале от 0 до 1? Или, в общем случае, от F1 до F2.
TPi - очередное время прибытия. Тоже, надо полагать в некотором интервале - от TP1 до ТP2.
TOi - очередное время обслуживания. В некотором интервале - от TО1 до ТО2.
Тогда
Код
TPi := TP1 + (TP2-TP1)*(Fi-F1)/(F2-F1);
TOi := TO1 + (TO2-TO1)*(Fi-F1)/(F2-F1);

Если Fi лежит в интервале от 0 до 1, тогда формулы упрощаются.
Код
TPi := TP1 + (TP2-TP1)*Fi;
TOi := TO1 + (TO2-TO1)*Fi;

Если нужны именно целые числа (integer), то результат вычислений округляем (TPi := round(...)).
По поводу наборов чисел. Поскольку Ваша функция случайных чисел использует стандартный random, то перед каждым прогоном один раз вызываем процедуру randomize - и будет счастье.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jill
сообщение 26.07.2006 15:23
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 105
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


Так, с этим разобралась smile.gif Спасибо smile.gif
Кст, отдельное спасибо за randomize - вылетело из головы smile.gif

Тут другой вопрос возник. Динамика. Что-то я с ней никак подружиться не могу unsure.gif

Как грамотно при закрытии проги уничтожать очередь, чтоб мусора не оставалось?


Сообщение отредактировано: Jill - 27.07.2006 11:36
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.07.2006 17:52
Сообщение #4


Гость






Цитата(Jill @ 26.07.2006 15:23)
Как грамотно при закрытии проги уничтожать очередь, чтоб мусора не оставалось?
Наверное, так:

procedure Clear;
var curr, deleting: TPClient;
begin
curr := head;
while curr <> nil do begin
deleting := curr;
dispose(deleting);
curr := curr^.next;
end;
head := nil;
end;

begin
writeln('before: ', memavail); { Проверяем: доступная память в начале работы }

Queure;
Print1;
Clear; { <--- Очищаем очередь }

writeln('after: ', memavail); { Доступная память после удаления очереди }
readln;
end.
 К началу страницы 
+ Ответить 
Jill
сообщение 28.07.2006 13:13
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 105
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


Ок, с мусором разобрались. Спасибо smile.gif

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

Так честнее:
procedure Queure;
var
node:TPClient;
n:integer;
F1,F2:real;
begin
n:=0;
naf:=true;
while (n<10) do begin {вроде, можно тут поменять, но ведь node еще не создан...}
new(node);
F1:=nrandom;
F2:=nrandom;
curr:=head;
pred:=NIL;
while (curr<>NIL) do
begin
pred:=curr;
curr:=curr^.next;
end;
if pred=NIL
then
begin
node^.next:=head;
head:=node;
node^.t1:=Abs(round(F1));
end
else
begin
node^.next:=pred^.next;
pred^.next:=node;
node^.t1:=Abs(round(F1))+pred^.t1;
end;
n:=n+1;
node^.t2:=Abs(round(1+(10-1)*(F2-1)/(10-1)))+1;
end;
end;


Суть вопроса. По-моему, я ошиблась в условии - работа системы ограничена во времени, а не по количеству требований. Получается, система должна работать 10 единиц времени (без учета задержки из-за последнего требования). То бишь, до момента, когда node^.t1=10. Как организовать этот цикл? По-моему, repeat в динамике нельзя использовать...? unsure.gif

И еще один глупый вопрос (не ругайте, мне и так стыдно unsure.gif ). Как прервать работу программы при зацикливании?

Сообщение отредактировано: volvo - 3.11.2006 19:56
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 14:02
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"