Я прохожу курс на coursera, который использует minizinc. В одном из заданий я вечно крутил колеса, потому что моя модель не работала достаточно хорошо на скрытом тестовом примере. Я наконец решил это, изменив следующие типы доступа в моей модели
из
constraint sum(neg1,neg2 in party where neg1 < neg2)(joint[neg1,neg2]) >= m;
to
constraint sum(i,j in 1..u where i < j)(joint[party[i],party[j]]) >= m;
Я не знаю, что мне не хватает, но почему эти двое работают иначе, чем друг друга? Кажется, что они должны работать аналогично, причем первый, возможно, немного быстрее, но разница в производительности была огромной. Я предполагаю, что есть какая-то оптимизация, которую упускает первый? Или мне действительно чего-то не хватает, и действительно ли эти строки приводят к другому поведению? Я намерен суммировать силу каждого элемента в рейде.
Разное. Подробности:
- party - это массив переменных enum
- набор индексов стороны 1..real_u
- каждый элемент в party должен быть уникальным, за исключением фиктивной переменной.
- решатель был Gecode
- проверка моей модели проводилась на сервере coursera, поэтому я не знаю, какой уровень оптимизации использовал их компилятор.
edit: Поскольку minizinc (mz) является декларативным языком, я понимаю, что «доступ к массиву» в mz не обязательно имеет прямое следствие в императивном языке. Однако для меня эти две строки семантически означают одно и то же. Итак, я предполагаю, что мой вопрос больше: "Почему указанные выше строки семантически различаются в mz?"
edit2: Мне пришлось изменить рассматриваемый пример, я был на грани нарушения кодекса чести Coursera.