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

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

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

> Очередь, Задача с тремя конвейерами
БелАчкА
сообщение 29.10.2007 20:01
Сообщение #1


Новичок
*

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

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


Задача такая:

Имеются три конвейера. Конвейеры работают независимо друг от друга. Изначально на первом конвейере располагаются детали N типов, а второй и третий – пусты. Время обработки детали каждого типа с каждого конвейера задается матрицей Time[1..N, 1..3]. После обработки детали с конвейера k она поступает на конвейер k+1. Деталь после третьего конвейера считается изготовленной. Требуется по начальному расположению деталей на первом конвейере определить время, через которое все детали будут изготовлены.

Помогите, пожалуйста, понять хотя бы алгоритм решения: вообще не могу разобраться wacko.gif , где здесь используется очередь и как, собственно, высчитывается само время обработки.


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
БелАчкА
сообщение 2.11.2007 15:03
Сообщение #2


Новичок
*

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

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


Цитата
По очень простой причине: у меня было 4 часа ночи..
Ну что же Вы так? huh.gif Конвейеры могли бы и подождать, полноценный сон важнее... blush.gif
Цитата
Первый кажется эффективнее - попробуй его реализовать.
Как только полностью разберусь со вторым, попытаюсь это сделать smile.gif

Lapp, вот за это отдельное огромное спасибо! Правда, очень помогло... yes2.gif
Код
T=  47.000
aaabbccccceeeeehhhhhhhhffffaaagggggg
---aab----cc---ee------hhhhhf-aa----gg
-----aaab---c----e----------hhhhhfffffaaag
--------aabbbcc---eee------------hhhh-f--aagg
----------a--bbbbbc--eeee------------h-f---a-gg


Прогресс на лицо: процентов 90 уже понятно applause.gif. Но есть еще вопросы:

Здесь используются элементы d[i] массива d... но чем он у нас заполнен? он же пустой... или я туплю blink.gif
for i:=1 to Nk do begin      //цикл по конвеерам в каждой КТ
//если время совпадает с КТ, значит на этом конвеере
//закончилась обработка текущей детали.
//для всех, кроме последнего, перекладываем деталь в очередь следующего К
//для последнего просто увеличивает Dd
if (Abs(T-Tk[i])<e) then if i<Nk then Put(K[i+1],d[i]) else Inc(Dd);
//если К свободен, взять деталь из очереди (если там есть что-то)
if (T>=Tk[i]-e) and Get(K[i],d[i]) then begin
for x:=Round(Tk[i]) to Round(T)-1 do s[i]:=s[i]+'-'; //псевдографика
//отметить КТ для этого К, как время окончания обработки детали
Tk[i]:=T+TDK[d[i],i];
for x:=1 to Round(TDK[d[i],i]) do s[i]:=s[i]+Char(96+d[i]) //псевдографика
end
end;


Далее...
  for i:=1 to Nk do if T1<Tk[i] then T1:=Tk[i];
//найти минимальную КТ, бОльшую текущего времени (т.е. следующую)
for i:=1 to Nk do if (T<Tk[i]) and (Tk[i]<T1) then T1:=Tk[i];
//продвигаем текущее время вперед
T:=T1

(?)Переменной T1 не было присвоено начальное значение. Я так понимаю, что если делать таким образом: T1:=<very_large_value>, то этого не требуется. А если как в проге, то возникает (?).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 3.11.2007 15:09
Сообщение #3


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(БелАчкА @ 2.11.2007 15:03) *
Ну что же Вы так? huh.gif Конвейеры могли бы и подождать, полноценный сон важнее...
Такие уж Мы... программеры - что с Нас взять?.. smile.gif

Цитата(БелАчкА @ 2.11.2007 15:03) *
Как только полностью разберусь со вторым, попытаюсь это сделать
Поторапливайся.. Руки-то чешутся! Еле сдерживаюсь.. smile.gif

Цитата(БелАчкА @ 2.11.2007 15:03) *
Здесь используются элементы d[i] массива d... но чем он у нас заполнен? он же пустой... или я туплю
Вот тут мы действительно используем d. Но мы в эту строчку гарантированно не заходим на первом проходе цикла (поскольку Т=0, а Тk<0).
      //если время совпадает с КТ, значит на этом конвеере
//закончилась обработка текущей детали.
//для всех, кроме последнего, перекладываем деталь в очередь следующего К
//для последнего просто увеличивает Dd
if (Abs(T-Tk[i])<e) then if i<Nk then Put(K[i+1],d[i]) else Inc(Dd);

А вот тут мы заполняем массив d (обрати внимание, что второй параметр в Get описан как var):
      //если К свободен, взять деталь из очереди (если там есть что-то)
if (T>=Tk[i]-e) and Get(K[i],d[i]) then begin
И на втором проходе d уже оказывается заполненным (где надо).

Цитата(БелАчкА @ 2.11.2007 15:03) *
(?)Переменной T1 не было присвоено начальное значение. Я так понимаю, что если делать таким образом: T1:=<very_large_value>, то этого не требуется. А если как в проге, то возникает (?).
Не совсем так. Слова "этого не требуется" относятся только к первой строчке из двух. Эта строчка нужна, чтоб положить в Т1 зачение, заведомо не меньшее, чем следующая КТ:
    for i:=1 to Nk do if T1<Tk[i] then T1:=Tk[i];

Теперь смотри: если Т1 было маленьким, то ему присвоится значение. Если оно было большим - то и присваивать не нужно smile.gif. Так что с любым начальным значением Т1 мы получим желаемый результат. А вот вторая строчка выполняет реальную работу: ищет следующую КТ:
    for i:=1 to Nk do if (T<Tk[i]) and (Tk[i]<T1) then T1:=Tk[i];
Ее выкидывать никак нельзя!..
Я понятно ответил?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
БелАчкА   Очередь   29.10.2007 20:01
Lapp   не могу разобраться :wacko: , где здесь используе...   30.10.2007 14:04
БелАчкА   Что такое "очередь", ее структура и тд.....   30.10.2007 15:45
compiler   когда-то делал подобную задачу для двух конвееров....   30.10.2007 15:56
Lapp   как находить время: неужели просто последовательно...   30.10.2007 23:43
БелАчкА   Нужно моделировать процесс. То есть, например, К...   31.10.2007 17:07
Lapp   :mega_chok: А вот этого не надо! держи себя ...   1.11.2007 14:31
БелАчкА   Lapp, большое спасибо! :) Вопросы, конечно же...   1.11.2007 17:49
Гость   Вопросы, конечно же, есть... [code=pas]begin fo...   1.11.2007 22:32
Lapp   БелАчкА, чтобы лучше разобраться, просто представь...   2.11.2007 2:18
БелАчкА   Ну что же Вы так? :huh: Конвейеры могли бы и подо...   2.11.2007 15:03
Lapp   Ну что же Вы так? :huh: Конвейеры могли бы и подо...   3.11.2007 15:09
БелАчкА   Про d поняла, про Т1 нет... Вот место, где впервы...   3.11.2007 16:00
Lapp   Вот место, где [b]впервые встречается Т1: for i:...   4.11.2007 3:11
klem4   :blink: Что-то вы перемудрили мне кажется ... п...   4.11.2007 11:30
Lapp   :blink: Что-то вы перемудрили мне кажется ...Мож...   5.11.2007 5:45
Lapp   klem4, еще раз прошу тебя ответить на вопрос (изви...   5.11.2007 12:12
klem4   Сколько времени пройдет до того момента, как пос...   5.11.2007 11:09
klem4   а это у меня не предусмотрено, то есть всегда пото...   5.11.2007 13:57
Lapp   всегда поток такой: 1, 2, 3, 4, ..., NЯсно. Но у...   5.11.2007 14:07
БелАчкА   Все, я окончательно растерялась... не знаю, куда с...   7.11.2007 1:17
Lapp   Пробовала сравнивать переменную, объявив ее, но н...   7.11.2007 1:41
Lapp   БелАчкА, как дела? Все понятно уже?   8.11.2007 3:48


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

 



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