Страницы: 1
RSS
Разделить массив дат по потокам (установкам)
 
Добрый день! Помогите пожалуйста решить следующую проблему:
Есть 2 столбца - дата начала работ и дата окончания работ (файл в приложении). Работы выполняются на специальных установках. Надо сделать так чтобы в свободном столбце добавлялся порядковый номер установки исходя из следующих условий:
1. На каждом этапе работает только одна установка.
2. Когда установка заканчивает работу в одном этапе, её надо поставить на следующий ближайший свободный этап.
3. У установок с наименьшим порядковый номером должна быть максимальная загрузка по времени.
4. Максимально возможное количество установок не больше указанных в столбце B (они со временем могут меняться так же как и количество этапов и сроки проведения работ).

Формулами, надстройкой "поиск решений" и макросами самостоятельно решить проблему не смог. А проблема будет возникать часто... заранее спасибо за любую помощь в решении проблемы.  
 
Semen, дОБРЫЙ ДЕНЬ, заполните ручками 10-15 строк что бы увидеть результат
Не бойтесь совершенства. Вам его не достичь.
 
Заполнил
 
Доброе время суток.
Вариант на Power Query. Не понятно зачем 15 установок, могут и 12 справиться. Распределение несколько другое, чем в примере результата, с другой стороны получившееся удовлетворяет условиям. Несколько тормознутое решение - Power Query в общем не для этого класса задач.
Updated
Если даже провести оптимизацию "жадным" алгоритмом, то тоже получается 12. КПД использования однако не высок.
Изменено: Андрей VG - 20.10.2020 19:01:41
 
Андрей спасибо большое за помощь. Но в представленной Вами версии не выполняется условие 3. Т.е. когда первая установка освобождается она должна в приоритете загружаться работой. Дальше приоритет по загрузке по возрастанию номера установки.
Изменено: Semen - 20.10.2020 19:15:39
 
Цитата
Semen написал:
Т.е. когда первая установка освобождается она должна в приоритете загружаться работой.
Ну, потом перенумеруйте от 1 по убыванию количества дней использования и получите свои минимальные номера установок :)  
Если рассматривать задачу качественно, то основной приоритет должен быть отдан КПД использования, а всё остальное вторично. Естественно, такую задачу лучше решать в VBA, используя ADODB.Recordset. Всё же класс задач на оптимизацию не конёк Power Query.
 
Цитата
Андрей VG написал:
Ну, потом перенумеруйте от 1 по убыванию количества дней использования и получите свои минимальные номера установок  
Не вариант т.к. в Вашем файле загрузка у установок более или менее  равномерная. Я пробовал проставлять весь список руками и получалась больше загрузка для первых  установок и меньше для последних (при условии что я нигде не ошибался  :) ).
Цитата
Андрей VG написал:
Если рассматривать задачу качественно, то основной приоритет должен быть отдан КПД использования, а всё остальное вторично.
В моём случае надо максимально загружать первые установки и по возможности исключать работу последних (при этом количество установок в наличии варьируется и они переодически уходят в ремонт)... Количество работ и их продолжительность это тоже величина переменная (185 строк это только небольшая выборка)
Цитата
Андрей VG написал:
Естественно, такую задачу лучше решать в VBA, используя ADODB.Recordset. Всё же класс задач на оптимизацию не конёк Power Query.
Вот кто бы мне помог с кодом... Я сам пробовал различные циклы писать... Но ничего толкового не вышло... :(  
 
Цитата
Semen написал:
Вот кто бы мне помог с кодом.
Я вас правильно понимаю, что у вас уже есть алгоритм решения, а проблемы только с написанием кода? Не поделитесь тогда хотя бы алгоритмом, а то только пока требования не очень чёткие.
Цитата
Semen написал:
надо максимально загружать первые установки
Очень плохо согласуется с
Цитата
Semen написал:
2. Когда установка заканчивает работу в одном этапе, её надо поставить на следующий ближайший свободный этап.
Изменено: Андрей VG - 20.10.2020 22:26:59
 
OFF
Semen, крайне советую сменить никнейм (например на "Semyon") и вообще не использовать подобную транслитерацию (особенно на англоязычных форумах)
Изменено: Jack Famous - 20.10.2020 23:20:34
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Андрей VG, алгоритм я вижу следующий:
1) цикл берет минимальное значение из столбца B и подставляет в текущую строку столбца G.
2) далее запускается  проверка на условие: полученный номер установки ищется в строках выше
2.1) в случае если номер не находится, то цикл переходит к следующей строке.
2.2) в случае если номер нашёлся(а найдётся он в нескольких строчках), то запускается проверка следующего условия - дата начала в текущей строке сравнивается с датой окончания в найденных строках (либо с самой поздней из найденных дат окончания)
2.2.1) если дата начала в текущей строке больше самой поздней даты окончания в найденных строках, то цикл переходит к следующей строке
2.2.2) если дата начала в текущей строке меньше или равна самой поздней дате окончания в найденных строках, то цикл берет следующее минимальное значение из столбца B и заново выполняется проверка по пункту 2.

если номера в столбце B закончились и условия не выполнены вылазит Msgbox "не хватает установок".
Изменено: Semen - 21.10.2020 07:53:04
 
Цитата
Semen написал:
алгоритм я вижу следующий:
Реализация на Power Query. Но! Представленный алгоритм не удовлетворяет условию
Цитата
Semen написал:
надо максимально загружать первые установки
Рассмотрите маленький ряд по дням 1-6, 2-4, 5-8, 9-11. Нужны две установки. Если первая по вашему алгоритму начинает с 1-6, то затем может использовать 9-11. Итого 6 - 1 + 1 + 11 - 9 + 1 = 9 дней. Но, если бы начала с 2-4, то могла бы 4 - 2 + 1 + 8 - 5 + 1 + 11 - 9 + 1 =10 дней :)  Жадный алгоритм, увы, не оптимален.
 
массивная
=MATCH(0;COUNTIFS(F$1:F1;">="&E2;E$1:E1;"<="&F2;G$1:G1;ROW($1:$15));)
Если установок больше, то меняем ROW($1:$15)
но можно и автоматизировать и немного облегчить
=MATCH(0;COUNTIFS(F$1:F1;">="&E2;E$1:E1;"<="&F2;G$1:G1;ROW(G$1:INDEX(G:G;COUNTIFS(F$1:F1;">="&E2;E$1:E1;"<="&F2)+1)));)
или тоже, но с ограничением
=MATCH(0;COUNTIFS(F$1:F1;">="&E2;E$1:E1;"<="&F2;G$1:G1;ROW(G$1:INDEX(G:G;MIN(MAX(B:B);COUNTIFS(F$1:F1;">="&E2;E$1:E1;"<="&F2)+1))));)
Изменено: БМВ - 21.10.2020 08:31:20
По вопросам из тем форума, личку не читаю.
 
Андрей VG, вот Ваш 3 вариант для меня является самым оптимальным, спасибо.
БМВ, спасибо за помощь. Остановлюсь на применении Вашей формулы т.к. с Power Query возможности работать нет (да и не умею).
 
Цитата
Semen написал:
является самым оптимальным, спасибо.
То есть ответа на
Цитата
Андрей VG написал:
Рассмотрите маленький ряд по дням
я не дождусь?
 
Андрей VG, в предполагаемом Вами варианте рассмотрена загрузка только одной установки (если бы был дефицит установок и других больше небыло, то тогда Ваш вариант распределения был бы оптимален).
У меня задача стоит обеспечить максимальную загрузку для 2-6 установок (в зависимости от времени года), а остальные работают на подхвате, то у нас, то в другой организации.
Более того к каждому периоду рассчитан предполагаемый объем работ, который часто не пропорционален времени на работу (т.к. в период заложено время на перемещение, монтаж, демонтаж и при разных исходных данных различная производительность каждой установки).
 
Цитата
Semen написал:
загрузка только одной установки
Нет, я описал, что нужно ДВЕ установки. Первая требует максимальной загрузки. Но, по вашему алгоритму - вы не обеспечиваете её
Цитата
Semen написал:
максимальную загрузку
 
Андрей VG, извиняюсь, не обратил внимание что две установки))
Тогда я не знаю какой алгоритм написать чтобы посчитать максимальную загрузку...  :sceptic:
Но из тех вариантов что  преведены выше пока что наилучший это Ваш 3й через PQ и точно такие же результаты через формулы БМВ.
 
Цитата
Semen написал:
точно такие же результаты через формулы
так не удивительно, старые кони борозды не портят, да Андрей?  :-)

На самом деле у вас в алгоритм заложена микробомба, а именно, первые установки будут реально загружены, что приводят к их износу не равномернуму по отношению к остальным. В идеале надо рамазывать среди оставшихся из имеющихся рандомно и только в  случае нехватки брать их экстра пула. но возможно работа на износ в вашем случае более выгодна. Порой проще и дешевле заменить сломанную лопату через X ямочек, чем перед каждой брать новую.
Изменено: БМВ - 21.10.2020 15:01:25
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
На самом деле у вас в алгоритм заложена микробомба, а именно, первые установки будут реально загружены, что приводят к их износу не равномернуму по отношению к остальным
неее.. эти установки работают не только у нас, но и на других удалённых географически организациях. Поэтому надо у себя загрузить по максимуму минимальное количество установок. Так же сделают соседи. А вот резервные (недозагруженные) будут ездить туда-сюда (при условии что это будет экономически целесообразно), либо заменять основные на время ТО/ремонта.
Изменено: Semen - 21.10.2020 16:04:08
 
Цитата
БМВ написал:
так не удивительно, старые кони борозды не портят, да Андрей?  :-)
Привет, Михаил.
А давай испортим, какие наши годы :) Следующий более разумный уровень "жадности" ;)
Изменено: Андрей VG - 21.10.2020 21:29:35
 
Цитата
Андрей VG написал:
А давай испортим,
ну да,  чаще - не означает что дольше. но как я понял задача даже не в нагрузке на единицу, а получается есть три группы:
1я  - для себя. 2я  - можно делить с другими , 3я - "арендованная". Задача. как можно меньше "брать" в аренду и как можно  больше "сдавать" в аренду,  то есть обходится своими ресурсами, да еще и выделять их другим. Не в наработке дело.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Не в наработке дело.
Я не знаю. Может быть и так. Для этого надо знать бизнес-процесс, чтобы строить гипотезы о лучшем способе его оптимизации.
 
Андрей VG,  нет придела совершенству)
БМВ, да все верно.
 
Цитата
БМВ написал:
а именно, первые установки будут реально загружены, что приводят к их износу не равномернуму по отношению к остальным.
На мое удивление часто выгоднее избегать равномерной загрузки по всем установкам - чтобы избежать их одновременно вывода в ремонт...
простите за off-top
Страницы: 1
Наверх