W ILP możesz zrobić tak:
Dla każdego elementu od 1 do 9 (mamy 9 elementów):
tworzysz 27 zmiennych binarnych (bo cała kostka ma 27 elementów). x to numer wiersza, y to numer kolumny, z to numer warstwy (numerujesz w jakiej kolejności Ci wygodnie)
suma wszystkich zmiennych jest równa 3. To nam gwarantuje że nasz element będzie miał dokładnie 3 części.
(tam gdzie indeksy mają sens) mnożymy przez siebie dwa sąsiednie elementy w każdym kierunku. Iloczyn będzie równy 1 tylko wtedy, gdy dwie części klocka są obok siebie, a ponieważ mamy 3 części klocka, to tym zagwarantujemy, że klocek nie zostanie "rozerwany".
suma zmiennych każdej "pionowej" prostej jest równa co najwyżej 2. Dla wierszy i kolumn analogicznie. To nam gwarantuje, że nasz klocek nie będzie miał trzech elementów na jednej prostej (czyli go nie wyprostujemy).
w każdym miejscu kostki jest część dokładnie jednego elementu.
Nie weryfikowałem, ale wydaje się sensowne.
Edycja:
Wprawne oko dostrzeże, że mnożenie zmiennych jest w ILP zabronione (bo wtedy nie byłby to program liniowy, tylko kwadratowy). Ale tutaj mnożymy zmienne binarne, co jest tożsame obliczaniu koniunkcji zmiennych, a to możemy zrobić tak:
Mając zmienne binarne i chcąc, aby , dodajemy ograniczenie .
Edycja 2:
Zaimplementowałem ten program i daje dobre wyniki.