Wprowadzenie
Napisz solver do programowania liniowego liczb całkowitych .
Wyzwanie
Twoim zadaniem jest napisanie solvera do programowania liniowego liczb całkowitych (ILP). W ILP podano nierówności liniowe zbioru niewiadomych (z których wszystkie są liczbami całkowitymi), a celem jest znalezienie minimum lub maksimum funkcji liniowej.
Na przykład w przypadku nierówności (przykład wzięty z mieszanego programowania liniowego liczb całkowitych )
4x+2y-15≤0
x+2y- 8≤0
x+ y- 5≤0
- x ≤0
- y ≤0
a funkcja celu 3x+2y
, maksimum funkcji celu powinno wynosić 12
( x=2,y=3
), a minimum powinno być 0
( x=y=0
).
Dane wejściowe podano w postaci tablicy 2d (lub dowolnego odpowiednika zgodnego ze standardowymi specyfikacjami), każdy wiersz odpowiada jednej nierówności, z wyjątkiem ostatniego wiersza. Liczby w tablicy są współczynnikami, a ≤0
część jest zawsze pomijana. Jeśli n
w każdym rzędzie są elementy, oznacza to, że są n-1
nieznane.
Ostatni wiersz tablicy odpowiada funkcji liniowej. Współczynniki są wymienione.
Na przykład tablica wejściowa dla powyższego problemu to
[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,0]].
Wydajność powinna być minimalna i maksymalna, podawana w dowolnej rozsądnej formie.
W przypadku następującego problemu (dwa ograniczenia zostały usunięte z powyższego problemu):
[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]].
Maksimum jest nadal 12
, ale minimum nie istnieje, a funkcja celu może mieć dowolnie duże (w sensie wartości bezwzględnej) wartości ujemne. W takim przypadku program powinien wypisać dane12
wygenerować , zgodnie z wartością falsy, którą decyduje osoba odpowiadająca. Innym przypadkiem jest to, że w ogóle nie ma rozwiązania, na przykład
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]].
W takim przypadku należy również wygenerować wartości fałszowania. Byłoby dobrze rozróżnić przypadek, w którym „wartością optymalną” dla funkcji celu jest nieskończoność i przypadek, w którym nie ma żadnych rozwiązań, ale nie jest to konieczne.
Dane wejściowe zawierają tylko współczynniki całkowite zarówno dla nierówności, jak i dla funkcji celu. Wszystko niewiadome są również liczbami całkowitymi. Gwarantowana macierz współczynników nierówności ma pełną rangę.
Przypadki testowe
Kredyt na @KirillL. za znalezienie błędu w oryginalnym pakiecie testowym i pogłębienie mojego zrozumienia problemów z ILP.
Input
Output
[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,1]]
[1,13]
[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]]
[-inf, 12]
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]]
[NaN, NaN]
[[-1,-1,-1,-1,-1,8],[1,1,1,1,0,0],[5,5,5,5,6,7]]
[55, inf]
[[-1,-1,-1,-1,-1,8],[1,1,1,1,0,0],[0,0,0,0,0,4]]
[4, 4]
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[0,0,4]]
[NaN, NaN]
Okular
Nie musisz martwić się obsługą wyjątków.
To jest golf golfowy , najniższa liczba bajtów wygrywa.
Maksymalna liczba niewiadomych:
9
. Maksymalna liczba nierówności:12
.Możesz pobierać dane wejściowe i dostarczać dane wyjściowe za pomocą dowolnego standardowego formularza i możesz wybrać format.
Jak zwykle obowiązują tutaj domyślne luki .
źródło
Odpowiedzi:
Python 3 , 534 bajty
Wypróbuj online!
Przegląd
Jest to algorytm iteracyjny, poczynając od oryginału. Zbiera pozycje sąsiadów i przypisuje potencjalną funkcję:
x:(a,b)
gdziex
jest pozycja,a
jest sumą odległości pozycji od półprzestrzeni każdej nierówności liniowej,b
jest wartością celu w tej pozycji.x:(a,b) < y:(c,d)
iffa<c
luba=c and b<d
Iteracja kończy się, gdy:
źródło
Matlab, 226 bajtów
ZASTRZEŻENIE : Nie jest to „oryginalna” implementacja, tylko dla zabawy.
Proste rozwiązanie wykorzystujące
intlinprog
funkcję:Zwraca wartości optymalne lub inf (-inf), jeśli problem jest nieograniczony, lub nan, jeśli jest to niemożliwe.
źródło