Я пытаюсь решить проблему оптимизации шахматной доски, и одно из моих ограничений проверяет, заняты ли соседние ячейки:
subject to attack_each_cell {i in 1..n,j in 1..n}:
P[i,j]+P[i-1,j+2]+P[i-1,j-2]+P[i+1,j+2]+P[i+1,j-2]+P[i-2,j+1]+P[i-2,j-1]+P[i+2,j+1]+P[i+2,j-1]>=1
Проблема с приведенным выше ограничением заключается в том, что для граничных ячеек я получаю ошибку за пределами границ, поэтому мой второй подход был оператором if-else для (i,j) индексов:
P[i,j]
+ if i>1 and j<n-2 then P[i-1,j+2]
+ if i>1 and j>2 then P[i-1,j-2]
+ if i<n-1 and j<n-2 then P[i+1,j+2]
+ if i<n-1 and j>2 then P[i+1,j-2]
+ if i>2 and j<n-1 then P[i-2,j+1]
+ if i>2 and j>1 then P[i-2,j-1]
+ if i<n-2 and j<n-1 then P[i+2,j+1]
+ if i<n-2 and j>1 then P[i+2,j-1]
>=1
Это не работает, потому что кажется, что операторы вложены друг в друга, а не выполняются последовательно. Любое предложение о том, как исправить код?