Я ищу подходящий алгоритм для решения задачи планирования времени. Сначала я расскажу о самой проблеме, затем во второй части я дам направление, в котором я думал о решении. Я пытаюсь решить эту проблему, потому что у меня есть интерес к этим проблемам, а также потому, что одна и та же проблема может быть решена позже с большим количеством переменных и большой настройкой.
Проблема
Я бы хотел сделать несколько тестов на батареях, чтобы увидеть, как они реагируют при подключении к нагрузке. И выполните эти тесты в кратчайшие сроки, чтобы завершить все тесты. Здесь важны две важные переменные:
- State-of-Charge (SoC) количество энергии, оставшегося в батарее от 100% до 0%. Мы проверим 99%, 75%, 50% и 25% (4 варианта). (объяснил позже, почему 99%, а не 100%). Мы предположим, что SoC потеряно, когда расслабление 0.
- Релаксация в зависимости от того, насколько аккумулятор расслаблен в часах. Мы знаем, что теоретически 24 часа должно быть достаточно, так что это максимум. Мы будем тестировать разное время, например: 5мин, 15мин, 30мин, 1 час, 2 часа, 6 часов, 24 часа (7 вариантов).
Общие комбинации: 4 x 7 = 28 для одной батареи
Порядок выполнения теста следующий: Заряжайте до 100%, разрядите до желаемого SoC, расслабьтесь, выпустите на новый SoC, измеряя
Пример: мы хотим видеть, как аккумулятор реагирует при разгрузке с 75% до 50%, расслабляясь в течение 2 часов
- Батарея имеет неизвестный SoC (методы измерения недостаточно точны)
- Перезарядка до 100%
- Разряд до 75%
- Расслабьтесь 2 часа
- Разряд при измерении, остановка при 50%
Теперь аккумулятор может снова расслабиться и начать с 50% до 25%. Его не нужно перезаряжать на 100% снова.
ситуации/состояния
Теперь я расскажу о некоторых ситуациях, которые могут возникнуть и что нужно сделать в этом случае.
инициализация
Проблема может быть инициализирована уже выполненными тестами (это важно, потому что мы можем перепланировать на полпути). Если батареи имеют известное состояние (SoC/relax), мы можем использовать это. Если SoC неизвестен, аккумулятор необходимо перезарядить. Если релаксация неизвестна, но SoC известен, то аккумулятор должен быть ослаблен в течение как минимум 24 часов.
перезарядка
Ввод аккумулятора в зарядное устройство необходимо выполнить вручную. Оставляя батарею в зарядном устройстве, это не проблема. Зарядка занимает около 2,5 часов. У каждой батареи есть собственное зарядное устройство, но в будущем у нас может быть больше батарей, чем зарядных устройств, поэтому алгоритм должен иметь возможность заряжать зарядное устройство переменного тока.
релаксация (расслабление)
Релаксацию можно просто сделать, не подключая батарею к чему-либо, поэтому ей не требуется специальное оборудование. Перед тем, как время релаксации может начаться, аккумулятор должен быть под напряжением (= подключен к разряднику). Мы не знаем наверняка, сколько времени займет период стресса, но мы предполагаем, что период, необходимый для разряда батареи 1%, будет достаточным. 99% - это первый SoC, где мы можем точно определить время релаксации.
разрядка
В настоящий момент имеется только один разрядник, но алгоритм должен иметь возможность принимать переменное количество разрядников. Ввод батареи в разрядник должен выполняться вручную (также вынимая его). ОСТОРОЖНО, что батарея в разряднике не обязательно разряжает батарею сразу. Время может быть установлено для запуска в определенное время. И разрядник может автоматически остановиться, когда вышло достаточно энергии. Оценку времени разряда можно оценить из таблицы поиска. Это не линейно, поэтому от 75% до 50% не требуется столько же времени, сколько от 25% до 0%. Поиск довольно точный (разница в 5 минут на 2,5 часа).
ждет
Батарея может ждать, если все разрядники будут приняты, но ожидание разрядника увеличивает время релаксации. Поэтому, если время релаксации становится больше времени релаксации, необходимого для измерений, которые необходимо выполнить, то он либо должен разряжаться до более низкого уровня заряда, либо снова расслабляться, или его нужно снова заряжать. Батарея может дождаться, если все зарядные устройства будут приняты безопасно, здесь нет штрафа/недостатка, кроме того, теряется время ожидания.
ограничения
То, что нужно сделать вручную, может быть сделано только в рабочее время (понедельник-пятница 8: 30-17: 00). Так, например, класть аккумулятор в разрядник нужно делать вручную. Затем в заданное время ночью (после того, как аккумулятор достаточно расслаблен) разрядник можно запустить по таймеру, а на следующее утро, когда вы прибудете в офис, батарею можно положить в зарядное устройство.
мысли для решения
Я не уверен, что я думаю в правильном направлении здесь, потому что у меня еще нет рабочего решения. Так что что-нибудь в этой части может быть неправильным.
Последовательность задач имеет значение, потому что другая последовательность может ввести более или менее время ожидания, а затем другую последовательность. Так что для одной батареи с 28 тестами, которая будет перестановкой 28! который довольно большой. Поэтому исчерпывающий поиск проблемного пространства невозможен. Единственный тип алгоритма, который я знаю, который может дать довольно хороший результат по этим типам проблем, - это генетический алгоритм. Хотя со всеми ограничениями и возможностями я не могу просто использовать классический генетический алгоритм. Я прочитал некоторые (исследовательские) работы, и в конечном итоге описание Пермутационной расходомерной задачи (PFSP) наиболее резонировало (различные источники). Хотя упомянутая выше проблема планирования заданий на работу (EJSSP) здесь была также интересной.
Самая большая проблема, которую я вижу, - это ограничение рабочего времени. Если бы это было не так, планирование могло бы быть похоже на то, чтобы просто установить блоки во временные интервалы (хотя слоты имели бы динамический размер). Я не уверен, что лучший способ справиться с этим ограничением. Либо я мог бы моделировать машины (разрядник) как две отдельные машины, каждая из которых активна в разные моменты времени, или я мог бы вводить поддельные задания, чтобы машины не могли быть приняты обычными заданиями.
Это просто предположение на этот момент из-за моего отсутствия опыта. Я скорее прагматичный программист, чем академик, и мне очень трудно понять, какие из возможных алгоритмов подходят и каковы предостережения. Я рад выполнить эту реализацию, но прямо сейчас я все еще застрял:
- Какие алгоритмы подходят для такого типа проблем?
- Как установить специальные условия для алгоритмов?
- Как я могу сделать функцию кроссовера/выбора/мутации?
- Мне нужно разбить эту проблему в подзадачах и включить ее в более крупный алгоритм? Какие подзадачи оптимальны для решения в первую очередь?
- Как будет выглядеть псевдокод?