Есть практическая задача, описанная ниже. Пока решаю задачу полным перебором с некоторыми улучшающими "костылями". Возможно получится использовать в каком-то виде метод ветвей и границ. При просмотре учебных материалов ничего другого пока не нашел. Существуют ли какие-то методы решения подобных задач кроме как по наитию? Где можно об этом почитать?
Собственно задача:
В электрической схеме (города) нужно выполнить

указанных действий с выключателями (включить или отключить). Действий может быть быть 5, 10, изредка больше, например 15.
Для каждого действия можно вычислить признак допустимости или штрафную функцию (для допустимых), которые зависят от действия и текущего состояния схемы, которое, в свою очередь, определятся совокупностью предыдущих выполненных действий (полученное текущее состояние не завит от того, в какой последовательности выполнялись действия).
Задача - выбрать последовательность, включающую все

действий, которая была бы допустима и имела минимальную суммарную штрафную функцию.
Дополнительные пояснения:
Штрафная функция и ограничения - почти черный ящик. Определяются сложными техническими причинами. Например, не всякий выключатель может отключить большой ток, некоторые элементы схем нельзя долго держать без питания, некоторые элементы нельзя запитывать в обратном направлении, действия могут требовать переезда персонала по городу и др.
За время решения задачи можно просчитать не более нескольких тысяч действий.
Нужно учитывать, что в процессе перебора вариантов можно использовать только одно описание состояния схемы, к которому последовательно применяются/отменяются действия. Например, если проверять все возможные последовательности в случайном порядке, то это потребует почти в

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

, т.к. в одно и то же состояние схемы можно прийти разными путями, но дальше достаточно найти оптимальный вариант выполнения оставшихся для этого состояния действий только один раз. Может так получится

вместо

.
Кроме того, можно ввести некий элемент случайности в последовательность перебора вариантов (пока не представляю как).
Можно применить метод ветвей и границ, отсекая варианты, штраф для которых хуже, чем уже один из найденных окончательных вариантов.
Можно использовать генетический алгоритм, но это сложно и он может не уложиться в несколько тысяч расчетов штрафной функции.
Спасибо.