У меня есть ситуация, когда я моделирую массив S
, который содержит набор значений (расписание) из предопределенного домена 1..t
, плюс 0
, который является специальным значением для "не существует / не используется".
Теперь я хочу опубликовать ограничение для суммирования функции стоимости, представленной как 2D-массив C
, для списка S'
, содержащего каждый ненулевой элемент S
в том же порядке, например:
constraint x = sum([C[S'[d], S'[d + 1]] | d in 1..max - 1])
Однако сделать это нелегко. Вещи, которые я пробовал:
- Using the function form of
roots
to get the set of indices toS
whose data is non-zero. The problem with that solution is:- the result is a set, and so cannot be zipped into pairs or easily cast to a list, even though I know their number from provided instance data.
- roots, похоже, требует, чтобы все значения участвовали в массиве, тогда как я хотел бы иметь только полный домен, кроме 0.
- Использование понимания списка (например,
[S[i] | i in 1..max where S[i] != 0]
) для выбора только элементов, значения которых не равны нулю: это также не работает, поскольку предложениеwhere
в понимании списка приводит к тому, что список имеет типopt
, а также имеет неправильный номер элементов (где я предполагаю, что некоторые из них будут<>
), по сути сводя проблему фильтрации нулей к той же проблеме снова с<>
: s. - Обработка функции стоимости как DFA и значений 0 как петель: это не позволяет (во всяком случае, я могу определить) подсчет; только проверка переходов, которые меня не волнуют.
Мне бы очень хотелось здесь либо filter
, либо zip
, которые могли бы легко решить мою проблему, но я предполагаю, что есть какое-то стандартное решение, которое мне не хватает. В противном случае мне пришлось бы переделывать модель.