Одним из общих методов указания шаблонов в программировании ограничений является регулярное ограничение (в Gecode , Choco , MiniZinc , среди прочих, неуверенный в статусе для or-tools), где шаблоны переменных указываются с использованием конечных автоматов (DFA и NFA) или регулярных выражений.
В вашем случае, если у вас есть последовательность переменных, представляющая, чтоопределенный водитель делает в каждый момент времени, довольно просто указать автомат, который принимает любую последовательность значений, которая не содержит морали, чем четыре часа подряд вождения.Эскиз такого автомата:
Состояния:
- Состояния вождения Dn, представляющие n единиц времени вождения (для некоторого разрешения единиц времени), до n = 4 часа.
- Состояния разрыва DnBm для разрыва длины m после n единиц времени вождения, до m = 30 минут.
- Начальное состояние D0.
Переходы:
- Вождение: При движении на 1 единицу времени переходите из состояния Dn в D (n + 1) и из перерыва короче 30 минут из DnBm в D (n + 1).
- Перерыв на 1 единицу времени, переход от DnBm к DnB (m + 1), если не было достигнуто 30-минутное время перерыва, для которого переход возвращается к D0.
- В основном выполняются другие действияв качестве самоконтроля, в зависимости от желаемой семантики.
Конечно, детали будут различаться для вашего конкретного варианта использования.