Помогите решить логическую задачку

1. DitriX 2096 03.01.14 21:47 Сейчас в теме
Дело было вечером, сидел после одного программиста отлавливал - какой из его регламентов сделан не совсем по феншую и, после которого, отжирает 1С постоянно по 50 - 200 Метров оперативки. Я навоял быстрый скрипт и построил график, на котором видно память, которую отжирает 1С за каждую секунду и, таким образом, нашел 3 регламента, все три - запускались с очередностью 600секунд. После них - 1С хавало много оперативки и не хотело ее отдавать.

Далее я подумал о том, что надо бы эти рекламенты разделить во времени и посмотреть - какой из них таки отжирает столько памяти, а может память отжирается только если они все одновременно запускаются? Но суть не в том, проблему я решил, а вот вопрос у меня один возник.

В итоге получилась весьма занятная задачка, решение которой, может быть интересно не только мне.
Суть задачи - есть от трех и более регламентов, которые первый раз стартуют одновременно, можно указывать только время в количестве секунд до следующего запуска регламента.

Цель - отследить все времена запуска каждого из этих трех регламентов без точек пересечения ограничив область или промежутком времени, или количеством вызовов. Шикарно будет - если можно будет указать еще и минимальное расстояние между запусками.

Пример - есть три регламента А,Б,В. Регламент А - стартует каждые 10сек, регламент Б - 30сек, регламент В - 24сек.
Получаем такую табличку:

Кол.зап/имя | А | Б | В |
1 | 0 | 0 | 0 |
2 | 10 | 30 | 24 |
3 | 20 | 60 | 48 |
4 | 30 | 90 | 72 |
5 | 40 | 120 | 96 |
6 | 50 | 150 | 120 |
6 | 60 | 180 | 144 |

Жирным - я выделил время, когда регламент А и Б начнуться одновременно, курсивом - время когда А, Б и В начнуться одновременно.
А надо, что бы не было пересечений по времени старта. И расстояние между регламентами - было определенным. Например регламент В - делает очень большой запрос, который система выполняет 5 секунд. При первом вызове - регламента В, регламенты А и Б начнутся через 6 секунд, что является допустимым, а вот при втором вызове регламента В - регламент А стартанет через 2 секунды и т.д.

З.Ы. Не надо мне рассказывать о том, что регламенты можно запустить по другому, про оптимизацию кода и т.д. Давайте просто решим задачку. Не исключаю, что кто то уже знает решение из школьного курса, то можете подсказать где про это прочитать.

З.З.Ы. Вознаграждение отдано будет тому, кто первый даст готовое решение в виде обработки (v8) или экселя, или чего угодно другого, что можно запустить на компе.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
14. anytrac 07.01.14 20:39 Сейчас в теме
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. cool.vlad4 2 03.01.14 22:29 Сейчас в теме
какая нафиг логическая задача, когда нет того, что требуется найти. есть какая-то цель.
А надо, что бы не было пересечений по времени старта
я, конечно, прошу прощения за грубость, но НОК проходят этак в школе, классах 5-ом, 6-ом. да, можно даже в школе не учиться, а сразу догадаться, что пересечения будут в любом случае, хотя бы одно, являющееся простым перемножением чисел.
ЗЫ. по поводу задачи - надо разложить числа на простые множители, исходя из разложения, найти кратные.
3. DitriX 2096 03.01.14 22:32 Сейчас в теме
(2) давайте не превращать инфостарт в мисту, ок? Вначале внимательно читаем тему, находим такой абзац:
Цель - отследить все времена запуска каждого из этих трех регламентов без точек пересечения ограничив область или промежутком времени, или количеством вызовов. Шикарно будет - если можно будет указать еще и минимальное расстояние между запусками.

И идем думать дальше :)
Если все так просто - помогите ее решить в поставленных условиях и дать готовое решение. Примените свой опыт 5 класса и получите вознаграждение :)
4. пользователь 03.01.14 22:40
Сообщение было скрыто модератором.
...
5. vova-1c 153 04.01.14 10:37 Сейчас в теме
Я не претендую на вознаграждение, попробуйте составить систему уравнений по количеству запускаемых регламентов, а корни данной системы и будут точками пересечения графиков этих уравнений , если корней будет 0 значит точек пересечения нет , если 1 то 1 пересечение и т.д... это правда не 5 класс, а алгебра по моему 8 класса, но все равно решаемо, да уравнения должны быть по моему периодическими функциями если вам надо чтобы регламенты запускались с постоянной периодичностью. Вообщем как то так.
6. DitriX 2096 04.01.14 13:17 Сейчас в теме
(5)вот приблизительно где то так и я помню :) даже начал уже уравнение составлять, но как только пришел к границам - то застрял :)
Задача выглядит простой, но с учетом ограничений и конечным результатом в виде программы ...
7. awa 2607 04.01.14 22:18 Сейчас в теме
(6) Ну вообще-то в (2) тебе совершенно правильно написали. НОК - наименьшее общее кратное. Вся проблема в том, что первый запуск регламентных заданий у тебя происходит одновременно. В этих условиях, какая бы не была периодичность запуска заданий, всегда произойдет еще один одновременный запуск заданий, а потом еще, еще и т.д.
Пусть у тебя есть два рег.задания с периодичностью запуска X сек. и Y сек. Тогда через каждые НОК(X, Y) сек. будет происходить одновременный запуск заданий. Т.е. через каждые НОК(X, Y) сек. картина будет повторяться. Единственный выход - изначально запускать рег.задания не одновременно, а с необходимыми промежутками между заданиями. При этом минимальная периодичность заданий будет у всех одинакова и равна сумме длительности всех заданий. Например, максимальное время выполнения задания А равно 3 сек, Б - 5 сек, В - 6 сек. Делаем периодичность всех заданий 14 сек (3+5+6=14) (или больше, если ни одно задание не нужно запускать так часто, но периодичность у всех должна быть одинаковой) и запускаем А в некий момент Х, Б в момент Х+3, а В в момент Х+8.
Если какие-то задания можно запускать реже, то периодичность любого задания можно увеличить в несколько раз, но он обязательно должно оставаться кратным 14 сек (28, 42 и т.д.). Главное - начальное смещение запуска.
Если же при этом получится, что какое-то задание запускается слишком редко (нпример, задание А должно запускаться не реже, чем каждые 10 секунд), то можно изменить цикл с АБВ на АБАВ, например. Так как АБ длится 8 секунд, а АВ - 9 секунд, то можно сделать такое расписание:
А запускается в момент времен Х периодичностью 9 сек.
Б запускается в момент времени Х+3 с периодичностью 18 сек. (или любой периодичностью, кратной 18 сек.)
В запускается в момент времени Х+12 с периодичностью 18 сек. (или любой периодичностью, кратной 18 сек.)
8. MaxDavid 127 04.01.14 22:38 Сейчас в теме
В каком виде нужны выходные данные?
9. DitriX 2096 04.01.14 23:00 Сейчас в теме
(8)
З.З.Ы. Вознаграждение отдано будет тому, кто первый даст готовое решение в виде обработки (v8) или экселя, или чего угодно другого, что можно запустить на компе.

(7) ну вот, прям ждал такого ответа :)
Давайте вчитаемся в текст (0), а потом прочтем еще раз то, что написали вы.

Вы говорите:
Тогда через каждые НОК(X, Y) сек. будет происходить одновременный запуск заданий. Т.е. через каждые НОК(X, Y) сек. картина будет повторяться.

Я говорю:
Цель - отследить все времена запуска каждого из этих трех регламентов без точек пересечения ограничив область или промежутком времени, или количеством вызовов. Шикарно будет - если можно будет указать еще и минимальное расстояние между запусками.

Вы берете общий случай, я говорю о частном.

По этой теме разобрались. Я надеюсь, что вы согласитесь, что в определенных рамках - пересечений не будет.

Идем дальше:
А запускается в момент времен Х периодичностью 9 сек.
Б запускается в момент времени Х+3 с периодичностью 18 сек. (или любой периодичностью, кратной 18 сек.)
В запускается в момент времени Х+12 с периодичностью 18 сек. (или любой периодичностью, кратной 18 сек.)

Я же не зря сюда приплел 1С. Теперь скажите мне - как это реализовать в 1С? Т.е. сделать красиво, а не костылем (ну что то типо того, что в код вставить искусственную задержку).
Поясню почему - вы в 1С можете указать старт задания, ну к примеру в 18:00:00, а у второго 18:00:05. Делаем им по 10 секунд регламент и ... ну и типо все круто - пересечений не будет. А нифига. Теперь, после очередной перезагрузки сервера (по абсолютно любой причине), ну допустим сервер перезагрузили в 22:00:00, или даже просто службу 1С.
Отгадайте теперь, что случится с вашими регламентами? Верно! Они начнутся одновременно и дальше - будут постоянно идти одинаково во времени.

Ну как то так :)

З.Ы. Я прекрасно понимаю, что от математики не уйдешь, что пересечения будут. Но если их будет за сутки - 3, а не 300, то это уже что-то :)

Ну и опять таки - если так все просто, найти НОК для 3 чисел и т.д., то прошу - код в студию :) Иногда самая элементарная задача по математике - решается далеко не в 1 десяток строк :)
10. MaxDavid 127 04.01.14 23:42 Сейчас в теме
(9) DitriX,
Вознаграждение отдано будет тому, кто первый даст готовое решение в виде обработки (v8) или экселя, или чего угодно другого, что можно запустить на компе.
Это я понял. Меня интересует формат выходных данных - диаграмма Ганта или набор колонок в экселе или вообще текстовый файл с набором циферок ))

В случае одновременного запуска задача решения не имеет. Но можно попытаться максимизировать время работы до момента следующего одновременного запуска регламентов. Тогда в общем виде задача могла бы решаться так:
Берем взаимно простые (или обычные простые, но несовпадающие) числа a, b, c, d... - по числу регламентов.
Находим время работы самого длительного регламента, обозначаем его буквой n. Тогда первый регламент будет стартовать каждые a*n секунд, второй - каждые b*n секунд, третий - каждые c*n секунд и т.д.
Время работы системы до следующего одновременного старта равно n*a*b*c*d... В течение этого времени не будет работать одновременно более одного регламента.
12. DitriX 2096 05.01.14 14:28 Сейчас в теме
(10) просто список значений. Можно конечно и в диаграмму вывести, но это уже как вы захотите.
Меня интересует только список.
(11)
Т.е. дальше 120 сек. рассматривать нечего, все будет циклически повторяться.

это да, но еще и при 30 и 60 - тоже пересечения есть. и при 150 будет. Не пытайтесь где то усложнить задачу, а где то упростить. Я же не зря все условия описал :)
11. awa 2607 04.01.14 23:46 Сейчас в теме
(9) Да, конечно, я понимаю, что я говорю не о той задаче, что написана в (0), и писал я свой пост не за вознаграждение.
Конкретно про задачу в (0) - непонятно, в чем проблема. Задача решается в лоб перебором всех времен запуска от 0 до НОК периодичностей всех рег. заданий. В примере из (0) НОК(10, 24, 30) = 120. Т.е. дальше 120 сек. рассматривать нечего, все будет циклически повторяться. Или задача в оптимизации перебора при 50-и рег.заданиях?
ну допустим сервер перезагрузили в 22:00:00, или даже просто службу 1С.
Отгадайте теперь, что случится с вашими регламентами? Верно! Они начнутся одновременно и дальше - будут постоянно идти одинаково во времени.

Не проверял, 1С действительно себя так ведет? Я всегда думал, что при задании старта 18:00:05 и периодичности 10 секунд 1С составляет себе что-то типа расписания запусков рег.задания, т.е. даже после рестарта сервера задания будут запускаться в 22:00:05, 22:00:15 и т.д. Если это не так, то можно задать ДетальныеРасписанияДня, где программно сформировать все времена запусков.
13. Infector 201 07.01.14 20:01 Сейчас в теме
Задача определенного решения в том виде, как задана, не имеет. Можно бороться просто за снижение статистической вероятности одновременного запуска. Для этого - добыть таблицу простых чисел и назначить интервал запуска наиболее удобными разными значениями из нее (X,Y,Z).
В любом случае пересечения двух заданий будут в точках X*Y*K Y*Z*K X*Z*K и пересечения всех трех заданий в точках X*Y*Z*K, где K - любое натуральное число.

Очевидно, что чем крупнее простые числа X,Y,Z тем меньше пересечений получим. С другой стороны в зависимости от назначения запускаемых заданий существует определенный лимит сверху (например почту желательно получать несколько раз в час, но построения/перестроения индексов таблиц можно делать много реже).

Еще один вывод - самое первое пересечение вы получите в точке X*Y При условии что X<Y<Z или Y<X<Z
16. DitriX 2096 07.01.14 20:47 Сейчас в теме
(13) все о чем вы рассказали - я описал в условии и специально ограничил до количества интераций или времени.
ну собственно нужное мне уже дали в (16)

Всем спасибо.

Теперь только надо подобрать нужные числа.
17. Infector 201 07.01.14 21:18 Сейчас в теме
(16) DitriX, внимательнее, пересечения 2 и 3 файл не показывает
19. DitriX 2096 08.01.14 01:25 Сейчас в теме
(17) почему же, показывает.
(18) а если регламент надо не менее 5 минут делать? но не более раз в 20 минут?
20. jigourt 31 08.01.14 02:31 Сейчас в теме
(19) DitriX, а это уже дополнительное условие
22. DitriX 2096 08.01.14 13:30 Сейчас в теме
(20) ну так оно указано в первом посте.
Цель - отследить все времена запуска каждого из этих трех регламентов без точек пересечения ограничив область или промежутком времени, или количеством вызовов. Шикарно будет - если можно будет указать еще и минимальное расстояние между запусками.


(21) давайте еще раз - математику не обмануть. Я это понимаю. И я, например, согласен, что бы эти регламенты в течении дня пересекались 5 - 10 раз, но не 100 - 200.
В этом и была вся суть задачи. Регламенты то должны выполняться каждый определенный промежуток времени.
Т.е. синхронизация должна делать раз в 5 - 10 минут, но не чаще и не реже. Выгрузка цен от раз в час, до раз в 3 часа, остатки - от получаса до часа. 1С, допустим, все эти операции выполняет в течении 30 - 60 секунд.
Вот собственно и все.

Я же не зря описал это все со стороны 1С, а не просто - мифические цифры :)
24. MaxDavid 127 08.01.14 14:22 Сейчас в теме
(22) DitriX, наконец-то какие-то вменяемые ограничения, а не условие вида принеси то - не знаю что.

Синхронизацию выполняем раз в 7 минут.
Остатки - раз в 47 минут.
Выгрузка цен - раз в 97 минут.

Первый раз они стартуют одновременно. Следующий момент одновременного старта произойдет через 31913 минут.

UPD. Можно использовать числа 6, 46 и 82. Пересечение будет через 5658 минут, примерно через четверо суток.
25. jigourt 31 08.01.14 14:48 Сейчас в теме
(24) MaxDavid, а первый и второй одновременно стартанут через 329 минут. на самом деле у этой задачи нет нормального решения, потому что нет как таковой задачи
21. Infector 201 08.01.14 11:44 Сейчас в теме
(19) DitriX, расчет у Вас ведется по процессу 1, т.е. пересечение 2 и 3 показывает только при условии что интервал процесса 2 или процесса 3 кратен интервалу процесса 1. Назначте все три интервала разными простыми числами и все увидите.
14. anytrac 07.01.14 20:39 Сейчас в теме
15. Infector 201 07.01.14 20:40 Сейчас в теме
В качестве примера - 547, 557, 563

первое пересечение ожидается через 3,5 суток. Можно при желании поэкспериментировать с другими базовыми числами, благо их перечень доступен в гугле.
18. jigourt 31 07.01.14 23:54 Сейчас в теме
вообще, не совсем понял задачу, но в итоге, я бы взял в частном случае промежутки 11,13 и 17 секунд как наименьшие
23. Infector 201 08.01.14 14:19 Сейчас в теме
Дело в том, что расчет изначально сделан на "круглых" числах. Но если берем из максимально близких к Вашим: 11,23,31 из расчета выпадают все пересечения кратные 11*31=341 и 31*23 = 713. А они на самом деле есть. ;)
26. DitriX 2096 08.01.14 15:10 Сейчас в теме
(23) расчет в примере? или где? В примере я спецом так сделал, что бы показать суть.
(24)
DitriX, наконец-то какие-то вменяемые ограничения, а не условие вида принеси то - не знаю что.

Внимательней тему читайте, я просто повторил то что выше было.

Синхронизацию выполняем раз в 7 минут.
Остатки - раз в 47 минут.
Выгрузка цен - раз в 97 минут.

Прекрасно. А если другие условия на регламенты? :)
Эти условия я от балды придумал. Или добавьте сюда 4 регламент :)


UPD. Можно использовать числа 6, 46 и 82. Пересечение будет через 5658 минут, примерно через четверо суток.

Шикарно, но до этого - 43 раза пересекутся первое и второе задание.

(25)
на самом деле у этой задачи нет нормального решения, потому что нет как таковой задачи

ну вот к чему эти фразы?
Т.е. как сделать выгрузку и загрузку в эксель товаров из одной базы в другую - все быстро отвечают, кидают линки и т.д. И болт все ложили, что это все решается сериализацией. Никто не говорит что проблемы не существует и т.д., что это задача сформулированна не верно и прочее.
А как только встает задача, в которую надо вникнуть - так сразу находят сотни причин высказать свое "фе". Не справедливо, не находите?

Если вы столкнувшись с аналогичной задачей - решали ее по своему, то это, как минимум, не значит, что решение верно только ваше, а существуют и другие верные решения.
А как максимум - может и ваше решение было вовсе не верным, хотя и "работало".

Поэтому давайте не пустословить, а говорить конкретно по теме.

Если вы говорите что задачи нет - объясните почему, приведите свой пример решения, но в заданных рамках условий указанных в теме, или лучше ничего не пишите :)
Каждый трактует задачу в меру своей испорченности своего опыта :)
27. jigourt 31 08.01.14 15:22 Сейчас в теме
(26) DitriX, почему я считаю, что нет задачи, да потому что, когда я привел пример 3 значений, Вы ответили, что это слишком часто, на другие 3 значения от другого человека, вы сказали "а если будет 4 регламента"... у Вас условия меняются по ходу обсуждения... формулы для расчета оптимальных значений в этой теме тоже были... лично моих решений подобных задач нет, потому что если регламент должен выполняться чаще чем раз в сутки, для меня это злой регламент... ну а если Вы считаете, что я не прав, тогда виноват, удаляюсь...
29. DitriX 2096 08.01.14 16:04 Сейчас в теме
(27) там где я сказал про 4 регламент, я внизу написал, почему его ответ не подходит, и совсем не потому что - там 3, а не 4 регламента :)

формулы для расчета оптимальных значений в этой теме тоже были

Замечательно, но решения не было. Если бы я просто хотел спросить "КАК?" - я бы так и спросил, но я попросил решение, и готов был выдать за него вознаграждение.
Где я не прав? :)

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

У меня просто скрипт есть, он ежесекундно собирает инфу о процессе 1с - какое количество памяти он занимает.
Далее я строю график и смотрю - где у меня пики появляются и соответствуют ли они регламентам когда они выполняются отдельно или же сумма пиков соответствует отдельно взятым пикам каждого регламента или нет.
Сколько при этом 1С освобождает памяти.
Пока я заметил одну зависимость - если выполняется регламент отдельно, то он он захватывает 10метров и освобождает 9 метров.
А вот если все 3 одновременно, то они захватывает 200метров, а освобождают 100метров.
Но для того, что бы это понять - надо иметь график с пиками и данные о всевозможных точках пересечения.
28. Infector 201 08.01.14 15:33 Сейчас в теме
(26) DitriX,
Да, если считать по цифрам из Вашего примера то нормально. Но чтобы получить минимум пересечений - принцип я описывал. Берем для каждого задания базу из таблицы простых чисел, для каждого задания число разное. Затем эти базы увеличиваем в N раз.
Шикарно, но до этого - 43 раза пересекутся первое и второе задание.

Боюсь, что при целоминутном подходе значительно сократить это число пересечений не получится. Т.к. интервалы 6-46-82 базируются уже на простых числах (эквивалент - 3-23-41). Единственный оставшийся путь - наращивать сами интервалы.

в.2 - перейти от целых минут к секундам и оперировать более крупными простыми числами. (т.е. не 6-46-82 а, скажем 359-2753-4919)

Прекрасно. А если другие условия на регламенты? :)
Эти условия я от балды придумал. Или добавьте сюда 4 регламент :)

Тот же принцип - за базу нужно взять любое другое простое число, отличное от использованных и адекватно назначению самого задания.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот