All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
Народ, такая вот проблема.
Есть программа на языке SIMULA, которая в течение определенного времени моделирует систему. Дело в том, что этот чудесный язык имеет свой внутренный таймер и сам отсчитывает время моделирования. Например, мне нужно посмотреть как будут ломаться и чиниться компьютеры в течение года. И вот программа отсчитывает 365 дней.
А вот теперь вопрос. Нужно эту систему написать на ЯВУ. Решила взять Delphi, потому как есть исходники. И теперь проблема - как сформировать счетчик, который бы считал 365 дней и в течение этого времени делал там всякие процедуры, а как только это время прошло - все останавливал. Обычный таймер класса TTimer с его методом Interval не сильно помогает, ведь во время этих 365 дней компьютеры какое-то время работают и определенное время чинятся, то есть нужно еще так сделать, чтобы была синхронизация.
Задание у меня звучит так:
В школе имеется 100 компьютеров. Компьютеры периодически выходят из строя. Время нормальной работы распределено нормально с мат. ожиданием 30 дней и дисперсией 15 дней. Время ремонта распределено равномерно от 1 до 3 дней. Сколько нужно ремонтников для того, чтобы постоянно работало 90 компьютеров в будни дни.
У меня есть задумка, например взять один компьютер, у него например есть величина "общее время работы", постоянно прибавлять к этому значению время работы и время ремонта и потом сравнивать - если значение достигло 365 дней, значит компьютер уходит из системы, если нет - то заново начинаем цикл. Но может быть вы можете предложить что-нибудь попроще? Может есть какая-нибудь библиотека, которая содержит в себе нормальный таймер? Или какой-нибудь другой язык, где это делается проще...
Есть программа на языке SIMULA, которая в течение определенного времени моделирует систему. Дело в том, что этот чудесный язык имеет свой внутренный таймер и сам отсчитывает время моделирования. Например, мне нужно посмотреть как будут ломаться и чиниться компьютеры в течение года. И вот программа отсчитывает 365 дней.
А вот теперь вопрос. Нужно эту систему написать на ЯВУ. Решила взять Delphi, потому как есть исходники. И теперь проблема - как сформировать счетчик, который бы считал 365 дней и в течение этого времени делал там всякие процедуры, а как только это время прошло - все останавливал. Обычный таймер класса TTimer с его методом Interval не сильно помогает, ведь во время этих 365 дней компьютеры какое-то время работают и определенное время чинятся, то есть нужно еще так сделать, чтобы была синхронизация.
Задание у меня звучит так:
В школе имеется 100 компьютеров. Компьютеры периодически выходят из строя. Время нормальной работы распределено нормально с мат. ожиданием 30 дней и дисперсией 15 дней. Время ремонта распределено равномерно от 1 до 3 дней. Сколько нужно ремонтников для того, чтобы постоянно работало 90 компьютеров в будни дни.
У меня есть задумка, например взять один компьютер, у него например есть величина "общее время работы", постоянно прибавлять к этому значению время работы и время ремонта и потом сравнивать - если значение достигло 365 дней, значит компьютер уходит из системы, если нет - то заново начинаем цикл. Но может быть вы можете предложить что-нибудь попроще? Может есть какая-нибудь библиотека, которая содержит в себе нормальный таймер? Или какой-нибудь другой язык, где это делается проще...
-
-
18.06.2011 в 21:11Если забить на библиотеки, я бы сделал так
Создал бы класс "Таймер" и, например, "Объект моделирования".
"Таймер" содержит список всех известных ему "объектов моделирования" (далее, "ОМ"), в том числе, методы, позволяющие зарегистрировать новый "ОМ".
"ОМ" имеет методы "сделать это".
"Таймер", с какой-то периодичностью, проходит по списку известных ему "ОМ" и вызывает у каждого метод "сделать это".
В вашей программе, создаете объект "компьютер", наследуете "ОМ". Переопределяете метод "сделать это", в него добавив расчет вероятности поломки, ремонта и всего прочего.
Регистрируете каждый компьютер в "таймере", запускаете его.
Профит.
Могу нарисовать, если очень непонятно объяснил.
-
-
18.06.2011 в 21:27Если же всё-таки надо смоделировать (то есть как я понимаю, задача с формулировкой сколько нужно ремонтников, означает что нужно найти максимальное количество отказавших машин), то есть системы вида gpss и anylogic. Хотя тут моделирования по сути нет. Особенно когда у вас дан интервал времени и периодичность отказов зависит от времени (от дня и не может быть меньше). От времени работы переходите к вероятности поломки, а дальше в цикле по дню делаете следующее - бросаете случайное число от 0 до 1. Если оно меньше, чем вероятность поломки, то всё хорошо. Если больше - значит компьютер сломался. Сохраняете сколько компов поломалось в этот день. Запускаете второй цикл по количеству сломавшихся компов, оцениваете вероятность, что в этот день его починят.
Мы похожие задачи решали на матлабе
-
-
18.06.2011 в 21:31Так СИМУЛА же. Но нам нужно именно что на языке программирования, а не моделирования. На языке моделирования я уже написала.
Если забить на библиотеки, я бы сделал так Создал бы класс "Таймер" и, например, "Объект моделирования". "Таймер" содержит список всех известных ему "объектов моделирования" (далее, "ОМ"), в том числе, методы, позволяющие зарегистрировать новый "ОМ". "ОМ" имеет методы "сделать это". "Таймер", с какой-то периодичностью, проходит по списку известных ему "ОМ" и вызывает у каждого метод "сделать это".
Я поняла, что вы предлагаете. Но дело в том, что после ремонта каждый компьютер получает заново новое время работы и новое время ремонта. Починенный компьютер не вылетает из системы, а начинает цикл заново. К тому же как именно идет секундомер таймера? Допустим он увеличивается на десятую суток. Как именно будет производится возрастание времени?
Плюс я забыла сказать, нужно еще учитывать очереди. Компьютеры, прежде чем пойти на ремонт, должны посмотреть - есть ли свободный ремонтник. Если нет - компьютер встает в очередь ожидающих ремонт и ждет, когда его начнут ченить. Ремонтники аналогично - если сломанных компьютеров нет, они встают в очередь на ожидание, и новый компьютер запускает работу ремонтника.
Ох, мне кажется я так сложно все объяснила(
-
-
18.06.2011 в 21:37-
-
18.06.2011 в 21:40эм.. так нам же надо посчитать, сколько нужно ремонтников? как они тогда могут ждать? или там какая-то хитрая формула с коэффициентами затрат на зарплаты ремонтников и т. п.? в формулировке задания что в первом посте у вас количество ремонтников должно быть равно максимальному числу одновременно сломавшихся за этот год компов
-
-
18.06.2011 в 21:43Да вот так вот и получается - они практически не отдыхают и очередь на ремонт обычно всегда пуста, редко когда какой-нибудь ремонтник заскочит.
в формулировке задания что в первом посте у вас количество ремонтников должно быть равно максимальному числу одновременно сломавшихся за этот год компов
Нет, оно должно быть таким, чтобы максимальное количество сломавшихся компов в день не превышало 10.
-
-
18.06.2011 в 22:02У нас в институте была симула. И аналогичное задание.
И был какой-то обычный язык (но старый, аля модула), но для него была известна библиотека, которая удобно позволяет проводить моделирование.
Ту архитектуру, что я привел выше, можно использовать для базы. Это единый таймер, например, дней.
Вы можете, таким образом, для всех комьютеров одинаково учитывать дни.
Но уже что вы напишете в конкретном "сделать это" - ваше дело. Можно вводить счетчики или статусы комьютеру, которые бы ставили поломку и пр.
-
-
18.06.2011 в 22:11-
-
18.06.2011 в 22:21Ну, у компьютера есть счетки "Я работал N дней".
Каждый раз, когда выполняется метод "сделать это" у комьютера счетчик наращиваем на единицу.
Плюс, проверяем вероятности выхода из строя. Если срабатывает - ставим статус "сломано".
Возможно, регистрируем этот компьютер в некотором классе ремонтников.
При этом, когда срабатывает метод "сделать это" для сломанного компьютера - ничего не делаем.
Но счетчик продолжает срабатывать каждый свой такт и остальные компьютеры продолжают работу, как ничего не было.
-
-
18.06.2011 в 22:47без этого условия набросал такой вот код на питончике:
и дополнительные условия - сначала компам задаётся априорное время работы... причём нормальное распределение такое хитрое, что даже с матожиданием 30 и дисперсией 15 оно мне умудрилось выдать отрицательное значение уже на первом прогоне, поэтому отрицательные времена считаются за 0 дней работы... допущение следующее - если у компа 0 дней работы, то он сломается обязательно, иначе вероятность поломки 1-(1/дней_работы).. и последнее допущение - ремонтники опять же ремонтируют только 1 2 или 3 дня))) хотя это как раз можно исправить в функции addqueue()
-
-
18.06.2011 в 22:52-
-
18.06.2011 в 23:11причём нормальное распределение такое хитрое, что даже с матожиданием 30 и дисперсией 15 оно мне умудрилось выдать отрицательное значение уже на первом прогоне, поэтому отрицательные времена считаются за 0 дней работы...
Это не только на Питоне такой траббл, в Делфи абсолютно также. Только в Симуле все было гуд, но там распределения есть уже в самой библиотеке.
Так, я не знаю этот язык, но я хочу понять ваш код, поэтому ща я буду вас построчно мучить)
compsPos = [] - что значит эта строчка? Массив?
queue = {} - я так понимаю, это что-то вроде записей (ссылок)?
l = math.floor(random.gauss(2, 1)) - а нет ли в Питоне равномерного распределения? Или вы просто не гуглили? Я поищу, если что. Просто тут нужно именно что равномерное.
Кстати, я тут подумала. Если в нормальном распределении будет отрицательное значение, то можно сделать время работы по умолчанию 30 дней. Так правильнее будет. (Боже, я кажется начала понимать Питон).
compsPos.append(cv) - это он их по порядку в массив записывает, так?
for j in range(0, maxComp, 1): - ммм, а почему с нуля идет цикл? Тогда в итоге получается перевод 101 компа.
if (j in queue.iterkeys()): - я не могу найти что значит метод iterkeys().
после сотни прогонов получается, что в среднем требуется 20 ремонтников, 17 минимальное, 22 максимальное.. то есть реально по-моему и без моделирования получить такую формулу)))
В Симуле количество ремонтников - 13 максимум(
Таааак, чувствую, придется прибегнуть к старым действенным методам заэкранных функций.
А не подскажете где можно скачать компилятор для Питона?
-
-
19.06.2011 в 04:45compsPos = [] - пустой массив
queue = {} - в принципе тоже массив, только ассоциативный... в том что выше ключи - целые числа и идут по порядку, здесь ключ - строка)) не помню что в дельфи по этому поводу, но в пхп, например, всё array()
l = math.floor(random.gauss(2, 1)) - вообще вы определитесь тогда, какое у вас распределение.. из вашего первого поста
Время нормальной работы распределено нормально с мат. ожиданием 30 дней и дисперсией 15 дней.
то есть в условии распределение нормальное)) нормальное == гауссовское))
random.gauss() - нормальное распределение, первый параметр - мат ожидание, второй - дисперсия
compsPos.append(cv) - просто добавляет элемент в массив.. ибо в питоне, если это массив, а не ассоциативный массив, нельзя написать a = [] a[0] = 1 a[1] = 546 и так далее)) append() просто добавляет в конец
for j in range(0, maxComp, 1): в си-подобных языках будет for (int j = 0; j < maxComp; j++), то есть последним значением будет 99, а не 100.. массивы начинаются с нуля, а длина массива (==количество элементов) будет 100
iterkeys означает то же самое, что keys (чуть ниже по коду) - возвращает массив ключей массива))) у меня логика такая - компы идут по порядку, заполняются временами, в массиве очередь на iм месте стоит время починки iго компа... поэтому в этом цикле мы получаем ключи, то есть, грубо говоря, перечень компов, которые на починке... разница между iterkeys и keys только в том, что во втором случае наш исходный массив можно редактировать (что собственно и происходит, во втором цикле починенные компы удаляются)
если отрицательные времена хотите превратить не в 0, а в 30 дней, то в функции getWorkTime() поменять cv=0 на cv = 30
вообще питон интерпретируемый язык)))) а скачать, как ни странно, можно на www.python.org/
-
-
19.06.2011 в 04:56тогда эту строку можно заменить по идее на random.randrange(1,4) (4 опять же потому, что < 4, то есть максимальное будет 3)
для более точного рандома есть ещё либа numpy ))) там будет
from numpy import random
x = random.uniform(1, 3)
-
-
19.06.2011 в 12:56Я так понимаю, получится консольное приложение?
Кстати, насчет количества ремонтников. У нас ведь должно работать 90 компов, то есть может быть сломано 100-90=10 компов. Из максимального количества сломанных компов вычитаем 10 и получаем такой же результат как в Симуле)
-
-
19.06.2011 в 16:00да, в данном случае консольное)) стучите))
я хз как получится со сломанными, но у меня в одном из прогонов в очереди был прирост с 6 до 18, то есть сломалось за день как минимум 12 компов)) в принципе математически ничего не запрещает такому быть)) просто, кхмм, вероятность того, что мы выкинем такие вероятности при поломке компов, мала))