Uniwersytet Zielonogórski

Instytut Sterowania i Systemów Informatycznych

Wstęp do programowania całkowitoliczbowego oraz pakietu Python MIP (Mixed-Integer Linear Programming Tools)

Celem ćwiczenia

Celem ćwiczenia jest zapoznanie się z zagadnieniem programowania całkowitoliczbowego oraz pakietu Python MIP (Mixed-Integer Linear Programming Tools) do rozwiązywania problemów optymalizacji całkowitoliczbowej. Zadania należy rozwiązać w Google Colab

Programowanie całkowitoliczbowe

Ogólnie programowanie całkowitoliczbowe możemy zapisać następująco: \begin{align} \max \, &c^Tx,\\ &Ax=b,\quad x \in {0,1} \end{align}

lub \begin{align} \max \, &\sum_{j=1}^mc_jx_j, \\ &\sum_{j=1}^ma_{i,j}x_{j}=b_j, \quad i\in 1,2,\ldots, n,\\ &x \in {0,1}, \quad j\in 1,2,\ldots, m \end{align} Wszystkie elementy w $c$, $A$, $b$ z założenia są liczbami całkowitymi. To założenie gwarantuje, ze wszystkie elementy są liczbami wymiernymi, ponieważ przemnożenie funkcji celu przez dowolna całkowita liczbę dodatnia oraz pomnożenie jakiegokolwiek ograniczenia przez liczbę różna od zera nie zmieni charakteru rozpatrywanego zadania. Zadanie programowania całkowitoliczbowego liniowego może być przedstawiane w wielu postaciach. Najczęściej jest przedstawiane w postaci jak wyżej. Wymienione zapisy wykorzystywane są przez oprogramowanie (solver) do rozwiązywania problemu programowanie całkowitoliczbowego.
Na potrzeby laboratorium należy pamiętać dwie główne kwestie:

  1. Wszystkie elementy problemu programowania całkowitoliczbowego są liczbami całkowitymi
  2. Funkcja celu $c^Tx$ może być minimalizowana lub maksymalizowana. W celu maksymalizacji funkcji celu należy zmienić znak $-c^Tx$.

Przykład

Na wydziale obróbki mamy dwie maszyny (M1, M2) oraz dwóch obsługujących je robotników (R1, R2). Znamy wydajność każdego robotnika na poszczególnych stanowiskach według poniższej tabeli

\begin{array}{p{5cm}|p{5cm}|p{4.5cm}} W_{i,j} & R1 & R2 \\\hline M1 & 6 & 7\\\hline M2 & 12 & 6 \end{array}

Wydajność tą określa liczba detali, które dany robotnik może wykonać na danej maszynie w ciągu jednej godziny. Należy ustalić taki przydział robotników do poszczególnych stanowisk, aby łączna wydajność całego zespołu była maksymalna przy czym:

  • Ograniczenie 1: Na danej maszynie może pracować jeden i tylko jeden pracownik
  • Ograniczenie 2: Każdy pracownik może pracować na jednej i tylko jednej maszynie

Wyżej wymieniony problem, jest problemem optymalnego przydziału który możemy rozwiązać za pomocą następującego problemu optymalizacji:

  1. Funkcja celu: Maksymalizacja łącznej wydajności całego zespołu: \begin{equation} \max \sum_{i=1}^{n}\sum_{j=1}^{m} W_{i,j}x_{i,j} \end{equation}

  2. Ograniczenie 1: Na danej maszynie może pracować jeden i tylko jeden pracownik: \begin{equation} \sum_{j=1}^{m} x_{i,j} = 1 \quad i\in 1,2,\ldots, n \end{equation}

  3. Ograniczenie 2: Każdy pracownik może pracować na jednej i tylko jednej maszynie:
    \begin{equation} \sum_{i=1}^{n} x_{i,j} = 1 \quad j\in 1,2,\ldots, m \end{equation}

  4. Ograniczenie 3: Ograniczenia co do wartości zmiennych decyzyjnych: \begin{equation} x_{i,j} \in \{0,1\} \quad i\in 1,2,\ldots n \quad j\in 1,2 \ldots, m, \end{equation} co oznacza iż \begin{equation} x_{i,j} = \begin{cases} 1, \quad \text{jeżeli $j$-ty pracownik został przydzielony do $i$-tego stanowiska }\\ 0, \quad \text{w przeciwnym razie}\\ \end{cases} \end{equation}

UWAGA: Zmienna $x$ jest zmienną decyzyjną której wartość (wartości) zostaną ustalone po rozwiązaniu problemu optymalizacji przez solver. Wartości jakie może przyjmować zmienna $x$ to zero lub jeden i to solver decyduje jaka to będzie wartość przy uwzględnieniu ograniczeń oraz charakteru funkcji celu.

Przedstawiony problem optymalizacji może być niejasny na pierwszy rzut oka. W celu wyjaśnienia poszczególnych elementów pomnimy funkcję celu (wrócimy do niej w dalszej części opisu) i przejdźmy do ograniczeń. Według tabeli wydajności, ilość zmiennych decyzyjnych wynosi cztery, odpowiednio: \begin{equation} x_{i,j} = [x_{1,1},\, x_{1,2},\, x_{2,1},\, x_{2,2}] \quad i\in 1,2 \quad j\in 1,2. \end{equation}

W zapisie tabelarycznym:

\begin{array}{c|c|c} W_{i,j} & R1 & R2 \\\hline M1 & 6 & 7\\\hline M2 & 12 & 6 \end{array}

$\longrightarrow$ \begin{array}{c|c|c} x_{i,j} & j=1 & j=2 \\\hline i=1 & x_{1,1} & x_{1,2}\\\hline i=2 & x_{2,1} & x_{2,2} \end{array}

Pierwsze ograniczenie wprowadza warunek iż na danej maszynie $i\in 1,2,\ldots, n$ może pracować jedn i tylko jeden pracownik. Tak więc mamy (suma po kolumnach):

  • dla $i=1$ $x_{1,1} + x_{1,2} = 1$
  • dla $i=2$ $x_{2,1} + x_{2,2} = 1$

Drugie ograniczenie wprowadza warunek iż każdy pracownik $j\in 1,2,\ldots, m$ może pracować na jednej i tylko jednej maszynie. Tak więc mamy (suma po wierszach):

  • dla $j=1$ $x_{1,1} + x_{2,1} = 1$
  • dla $j=2$ $x_{1,2} + x_{2,2} = 1$

Powyższy opis ograniczeń można zapisać tabelarycznie: \begin{array}{c|c|c|c} x_{i,j} & j=1 & j=2 & \\\hline i=1 & x_{1,1} & x_{1,2} & \sum_{j=1}^m x_{1,j}\\\hline i=2 & x_{2,1} & x_{2,2} & \sum_{j=1}^m x_{2,j}\\\hline & \sum_{i=1}^n x_{i,1} & \sum_{i=1}^n x_{i,2} \end{array}

Ograniczenie trzecie zostało już opisane. Ostatnim elementem jest funkcja celu która jest sumą iloczynów poszczególnych wydajności oraz zmiennych decyzyjnych która powinna być jak największa (maksymalizujemy wydajność): \begin{align} \max \sum_{i=1}^{n}\sum_{j=1}^{m} W_{i,j}x_{i,j} \longrightarrow \max 6x_{1,1} + 7x_{1,2} + 12x_{2,1} + 6x_{2,2} \end{align} Podsumowując, przedstawiony wcześniej problem optymalizacji można zapisać następująco:

  1. Funkcja celu: Maksymalizacja łącznej wydajności całego zespołu: \begin{align} \max 6x_{1,1} + 7x_{1,2} + 12x_{2,1} + 6x_{2,2} \end{align}
  2. Ograniczenie 1: Na danej maszynie może pracować jeden i tylko jeden pracownik: \begin{align} x_{1,1} + x_{1,2} = 1\\ x_{2,1} + x_{2,2} = 1 \end{align}
  3. Ograniczenie 2: Każdy pracownik może pracować na jednej i tylko jednej maszynie:
    \begin{align} x_{1,1} + x_{2,1} = 1\\ x_{1,2} + x_{2,2} = 1 \end{align}
  4. Ograniczenie 3: Ograniczenia co do wartości zmiennych decyzyjnych:
    \begin{align} x_{i,j} \in \{0,1\} \quad i\in 1,2,\ldots n \quad j\in 1,2 \ldots, m, \end{align}

W wyniku rozwiązania problemu optymalizacji otrzymujemy następujące wyniki: \begin{array}{c|c|c} W_{i,j} & R1 & R2 \\\hline M1 & 6 & 7\\\hline M2 & 12 & 6 \end{array} $\longrightarrow$ \begin{array}{c|c|c} x_{i,j} & j=1 & j=2 \\\hline i=1 & 0 & 1\\\hline i=2 & 1 & 0 \end{array} $\longrightarrow$ Funkcja celu = 19. Uzyskane rozwiązanie spełnia ograniczenia postawione na etapie formułowania problemu optymalizacji. Dodatkowo widać iż w tym przykładzie wyniki jest oczywisty. Została wybrana taka konfiguracja która odpowiada największej wydajności danego robotnika na danej maszynie.

Zadania do wykonania w ramach ćwiczenia

  1. Wykonaj modyfikację kodu z podanego powyżej zadania aby sumowanie odbywało się z zastosowaniem funkcji xsum oraz zastosuj polecenie for do obsługi list.
  2. Na trzech maszynach M1, M2, M3 mogą być produkowane trzy różne produkty P1, P2, P3. Czasy obróbki w godzinach podano w poniższej tabeli. \begin{array}{c|c|c|c} \hline W_{i,j} & M1 & M2 & M3 \\\hline P1 & 6 & 7 & 3\\\hline P2 & 12 & 6 & 2\\\hline P3 & 2 & 7 & 4 \end{array} Chcemy, aby każdy produkt był produkowany przez dokładnie jedną maszynę i aby każda maszyna produkował dokładnie jeden produkt, przy czym czas obróbki ma być jak najmniejszy.
  3. Należy przewieź jak największą ilość przedmiotów o jak największej wartości w trzech skrzyniach. Łączna waga skrzyń nie może być większa jak 100[kg]. W poniższej tabeli podano wagę poszczególnego przedmiotu oraz wartość w zł. \begin{array}{p{3cm}|c|c|c|c|c|c|c|c|c} \hline \text{waga} & 15 & 18 & 12 & 10 & 14 & 19 & 15 & 12 & 14\\\hline \text{wartość} & 300 & 10 & 50 & 60 & 70 & 150 & 500 & 80 & 5\\\hline \end{array}