|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
Всем привет! Предлагаю отвлечься от годовой отчетности и финальных релизов и немного размять мозги. Задача Работники обрабатывают коробки на складе, при это работники имеют следующие характеристики speed - время обработки одной коробки в минутах capacity - число коробок, которые работник в состоянии обработать без перерыва delay - длительность перерыва в минутах За какое минимальное время работники смогут обработать N коробок (задаётся биндом или константой, не суть)? Пример данных Код: plsql 1. 2. 3. 4.
Если число коробок 10, то работники их смогут обработать за 8 минут. Двое обработали по 4-ре коробки и один две (по три минуты каждую). Как обычно, объявляется конкурс на SQL решение. Если кто захочет решить на PL/SQL - это тоже не возбраняется, но лучше засунуть под спойлер. Тесты Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
PS. Не дождался пятницы. Праздники и всё такое. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 11:13 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
dbms_photoshop, Добавте id работника, будет интереснее (легче) анализировать 1-й 4 коробки 2-й 2 коробки 3-й 4 коробки зы авторвремя обработки одной коробки в минутах 10 коробок, на таких данных время не может быть меньше 10 ззы к слову, время может быть дробным (напр 1.5 полтора минуты) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 11:33 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
Stax Добавте id работника, будет интереснее (легче) анализировать Данных предоставлено ровно столько сколько требуется для нахождения решения. Stax 10 коробок, на таких данных время не может быть меньше 10 Stax к слову, время может быть дробным (напр 1.5 полтора минуты) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 11:54 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
dbms_photoshop всё достаточно тривиально и глубокого анализа не потребуется. с тривиальностью у меня как-раз проблема подожду решений (без модельки), и гляну где я ступил ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 12:24 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
dbms_photoshop ...всё достаточно тривиально и глубокого анализа не потребуется. ... Для того, чтобы на самом деле всё правильно сошлось, из двух одновременно освободившихся работников, становящихся конкурентами за следующую коробку, надо первым выбирать для следующей работы того, у кого время обработки наименьшее. Пока я не вполне ясно понимаю, как это красиво сделать на sql (вероятно, рекурсивный запрос должен в итоге как надо подкрутиться) а для pl/sql это правда не сильно сложная задача. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 15:31 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
booby, dbms_photoshop решил без Ид (11строк кода) как-то он хитро раздает коробки зы правда почему-то создал таблицу, мож ровид заюзал чувствую что неправильно мыслю, зациклился я на ид работника старею, утро-вечера мудренее ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 16:06 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
Stax booby, dbms_photoshop решил без Ид (11строк кода) как-то он хитро раздает коробки зы правда почему-то создал таблицу, мож ровид заюзал чувствую что неправильно мыслю, зациклился я на ид работника старею, утро-вечера мудренее ..... stax Если не удаётся решить без ID работника - не понимаю в чём проблема проставить его с помощью rownum. Написанное ниже вполне имеет смысл и не завязано на ID работника (это, впрочем, не значит что я решал так :)). booby надо первым выбирать для следующей работы того, у кого время обработки наименьшее Если SQL вызывает трудности можно в конце концов написать на PL/SQL и прикинуть переписываемо ли оно на pure SQL. На мой взгляд на SQL решается вполне изящно и гармонично. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 16:20 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
Stax, пронумеровать работников по их скорости в любом случае можно. Это, так или иначе, почти наверно пригодится. А 11 строк кода надо сначала посмотреть.... Мне такую задачу проще сначала записать в pl/sql решить. И там (в pl/sql) ее нельзя решить правильно, если порядок по скорости работы не будет явно поддерживаться. Я так как-то думаю.. попробую записать на pl/sql чуть позже. Про sql потом яснее станет. PS в этой задаче два порядка - по времени следующей доступности работника и по быстродействию самих работников. решение должно правильно их комбинировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 16:24 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
dbms_photoshop . На мой взгляд на SQL решается вполне изящно и гармонично. Скажем так, model я вряд ли был бы готов признать за гармонию, а в альтернативах надо аккуратно разбираться с порядком следования, что для sql исторически несколько чужеродно. возможно и гармонично, я не отрицаю пока, но хочу сначала увидеть, как это должно выглядеть на pl/sql позже положу ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 16:28 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
dbms_photoshop Никаких завязок на rowid у меня в решении нет. верю, просто я не в ту сторону думаю залезло в голову, кто сколько коробок обработал, и мешает ps алгоритм придумал (без ид), завтра реализую ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 16:34 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
Stax ... залезло в голову, кто сколько коробок обработал, и мешает .... stax это тоже не трудно получить, но в исходной постановке не требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 17:50 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
dbms_photoshop, не причисывал Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 18:02 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
на pl/sql получилось так. Строк вместе 271 на спецификацию и тело пакет, 237 на тело. 8 на первоначальных исходных данных получено ну, и я, более-менее, без долгого тестирования верю, в то, что здесь написано. Осталось быстро поверить в sql. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 18:22 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
booby, текущее время в итоге не пригодилось, но забылось удалиться. Так что, не без дефектов, но он и набросок. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 18:27 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
Stax не причисывал У меня несколько иной подход. Подождём может еще будут предложены решения. Потом чуть детальнее прокоментирую. booby ну, и я, более-менее, без долгого тестирования верю, в то, что здесь написано Код экстремально избычтоный и я не уверен что легче - переписать его сократив раз в десять или искать ошибку в том, что есть, но на данных ниже для 31 коробки выдаёт 175 вместо 152 (у меня и Станислава результат одинаков). Код: plsql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 19:31 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
ок, я посмотрю позже, где ошибка. Но 152 тоже не похоже на правильный ответ. его как-то надо лучше обосновать, чем указанием на одинаковость, возможно одинаково неправильных решений. вот при ручной трассировке ваших новых условий навскидку получается, при дополнительном условии, что исполнители на первую работу назначаются в порядке их личных скоростей исполнители id speed capacity delay1 10 12 22 30 12 53 20 4 54 35 100 100 трейс работы исполнителей во времени время Коробка работник всего обработано готовность коробки прим0 1 1 1 10 0 2 3 1 20 0 3 2 1 30 0 4 4 1 35 10 5 1 2 20 20 6 1 3 30 20 7 3 2 40 30 8 1 4 40 30 9 2 2 60 35 10 4 2 70 40 11 1 5 50 40 12 3 3 60 50 13 1 6 60 60 14 1 7 70 60 15 3 4 80 next stop60 16 2 3 90 70 17 1 8 80 70 18 4 3 105 80 19 1 9 90 80 20 3 4 85 отдых85 21 3 5 105 90 22 1 10 100 90 23 2 4 120 100 24 1 11 110 105 25 3 6 125 105 26 4 4 140 110 27 1 12 120 next stop120 28 1 12 122 отдых122 29 1 13 132 125 30 3 7 145 132 31 1 14 142 руками вот так 145 получается я посмотрю, где у меня ошибка. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2021, 20:16 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
booby, проверил, правильный ответ именно 175 при One off получится 150 чтобы получить 152 надо две ошибки совершить 1) one off 2) присобачить где-то к нему время отдыха 1го работника, или ошибиться каким-то иным способом. в предыдущих ручных выкладках я сам ошибся на строках отдыха, засчитав им живые коробки. правильный финиш, начиная с 20й коробки, такой: время коробка работник обработал всего готовность прим80 19 1 9 90 последняя правильная в пред. посте80 0 3 4 85 отдых85 20 3 5 105 90 21 1 10 100 90 22 2 4 120 100 23 1 11 110 105 24 3 6 125 105 25 4 4 140 110 26 1 12 120 next stop120 0 1 12 122 отдых120 27 2 5 150 122 28 1 13 132 125 29 3 7 145 132 30 1 14 142 140 31 4 5 175 PS надеюсь, у нас не найдется повода обсуждать экстремальную избыточность кода, чтобы не превращать топик совсем уж в посмешище. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2021, 01:51 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
booby, впрочем, 152 действительно получается, если на последней коробке сменить стратегию, и назначать следующую коробку не первому освободившемуся, а перейти к ожиданию освобождения работника с минимальным суммарным временем следующая готовность + обработка. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2021, 03:06 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
booby, если у меня забрать min, то выдаст как работали забрать where, то пошаговая раздача работы (к-во итераций равно к-ву коробок) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2021, 10:01 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
dbms_photoshop У меня несколько иной подход. я сначала тоже пошел по другому пути(возможно неправильному), потом бросил 1) считаем минимальное время когда работает один человек, получаем стартовое 2) Параллельная обработка творит чудеса (c dbms_photoshop ). далее время уменьшием (пополам, золотое сечение, ...) 3) считаем скоко за ето время коробок откроют при максимальном паралелизме (работают все) 4) далее если полученное к-во коробок меньше то - увеличиваем время, если больше уменьшаем, если равно то п6 5) п3 6) накручиваем точность ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2021, 12:14 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
Я пока не вникал в предложенные выше решения. Писать код пока не пробовал, только думал над решением. Надумал вот что: Подход 1: раскидывание коробок по сотрудникам пачками. В этом случае у каждого работника есть две характеристики: скорость работы S (заданная в условии) и средняя скорость работы с учетом перерывов, равная C * S / (C + D * S) (если я в формулах не напутал). Соответственно, если коробок мало, и все сотрудники успеют обработать коробки до ухода на перерыв, надо учитывать пиковую скорость работы, а если коробок много - то учитывать среднюю. Есть еще промежуточный вариант, когда часть работников успела сделать перерыв, а часть - нет. Дальше мне показалось, что этот путь тупиковый, и я перешел к подходу 2: обрабатывать коробки по одной. Берем коробку, смотрим свободных сотрудников. Выбираем самого быстрого (с максимальной скоростью). Даем коробку ему. Берем следующую коробку. Выбираем самого быстрого из оставшихся, и т. д. Если сотрудников больше нет - ждем. Отдельно нужно вести учет времени - когда кто-то освободился, выдавать коробку ему. Чем-то это начинает напоминать недавно проскакивавшую задачу про поезда, где надо было перегружать грузы из одного в другой, и на входе были вагоны с номерами и грузоподьемностью, а на выходе - из какого вагона в какой сколько груза грузить. Только тут у нас поезд 1 - это коробки, а поезд 2 - это минуты. "Грузоподъемность" имеет разные единицы измерения, поэтому нужен "коэффициент пересчета". И это - табличка с работниками. Это пока все, что надумал. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2021, 17:07 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
Никанор Кузьмич, Осталась самая малость, перевести на буржуинский select from where часть перевода (speed, capacity, delay) Александр уже засветил ps в задачке с поездами, если камазы не разгружать, а выставить навпротив соответствующих вагонов, то придем к "красивому" решению ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2021, 18:28 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
Stax к-во итераций равно к-ву коробок и считаю сколько коробок обработано (finished - может быть 1 или несколько). Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
lvl фигурирует в решении просто для нумерации проходов. "cycle lvl set cycle to 1 default 0" указано потому что Ораклу всегда мерещаться циклы при наличии cross apply. Если сделать "select * from r" то можно увидеть в какие моменты времени и сколько коробок убвало. Очевидно, что на каждом проходе выполняется перебор всех работников. Этого можно избежать если выстраивать их в очередь по близости освобождения, но тут уже потребуется PL/SQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2021, 19:40 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
Если правильно понял задачу Дано: 1,2,3 3,10,3 2,4,3 Условия: 1) два человека не могут открывать одну коробку (разбирать содержимое) 2) минимальный шаг времени 1 минута 3) коробки идут без перерывов Тогда получаем, что за 4 мин - втроем сделают 5 коробок и за 5 мин тоже только 5 коробок, а за 6 минут уже 8. Т.е. 7 коробок все равно сделают за 6 мин и быстрей никак (плюс одна бонусная) box Job1(mi) Job2(mi) Job3(mi)1 1 3 22 2 =+1 6 =+3 4 =+23 6 =+4 9 =+3 6 =+24 7 =+1 12 =+3 8 =+25 11 =+4 15 =+3 13 =+56 12 =+1 18 =+3 15 =+27 16 =+4 21 =+3 17 =+28 17 =+1 24 =+3 19 =+29 21 =+4 27 =+3 24 =+510 22 =+1 30 =+3 26 =+2 1.тогда на вопрос сколько коробок распакуют за Х минут 3 человека mi1 2345678910111213141516171819202122box1345589101111121415151718202122222425 2. какое минимальное время потребуется троим рабочим, чтобы разобрать Х коробок box1 2345678910111213141516171819202122232425mi122346667891112121315151617171819212122 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2021, 20:06 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
dba123 минимальный шаг времени 1 минута dba123 сколько коробок распакуют за Х минут 3 человека dba123 какое минимальное время потребуется троим рабочим, чтобы разобрать Х коробок ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2021, 20:22 |
|
|
start [/forum/topic.php?fid=52&msg=40122204&tid=1879631]: |
0ms |
get settings: |
17ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
24ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
482ms |
get tp. blocked users: |
1ms |
others: | 280ms |
total: | 817ms |
0 / 0 |