Laboratorium BO v3u/2002
Język AMPL
Język AMPL umożliwia wygodne definiowanie modelu w sposób podobny do zapisu stosowanego w literaturze.
Podstawowe słowa kluczowe: set, param, var, minimize, maximize, subject to.
set - definicje (deklaracje) zbiorów (indeksów)
param - definicje (deklaracje) stałych modelu
var - deklaracje zmienne modelu
minimize, maximize - określenie funkcji celu
subject to - ograniczenia
Ogólne zasady konstruowania modelu :
-
nazwy zmiennych - długość praktycznie dowolna, rozróżniane duże i małe litery.
-
każde wyrażenie zakończone jest średnikiem „ ; ”
-
komentarz zaczyna się od znaku „ # ” i jest do końca linii;
-
wyrażenie :
zapisuje się następująco:
{ i in N}: sum{j in M.} x[ i, j ] = y[ i ];
-
s
Indeksy wierszy i kolumn
posoby definiowania zmiennych tablicowych :
param A:=
   1 1
2 2
3 3 ;
p aram B :
1 2 3 4 :=
1 4 3 0 1
2 3 4 1 0
3 3 0 2 3;
param C default 0:=
[0,*] 1 4 2 7 3 6 4 10 5 13
[1,*] 3 3 4 7 5 10
[2,*] 3 1 4 5 5 8;
-
przykład definicji zbioru indeksów:
set N :=
(0,*) 1 2 3 4
(1,*) 3 4;
Przykład 1
Zadanie programowania liniowego
min x1+2x2+3x3
przy ograniczeniach:
-x1+x2+x3 = 5
12x1-9x2+9x3 >= 8
x1,x2,x3 >= 0
|
# zapis w języku AMPL plik *.mod
var x1 >=0;
var x2 >=0;
var x3 >=0;
minimize funkcja_celu:
x1+2*x2+3*x3;
# p.o.
subject to ograniczenie1:
-x1+x2+x3 = 5;
subject to ograniczenie2:
12*x1-9*x2+9*x3 >=8;
|
Ten sam przykład z zastosowaniem stałych modelu jako tablic jednowymiarowych.
# Plik *.mod
var x{1..3} >=0;
param A{1..3};
param B{1..3};
param C{1..3};
minimize funkcja_celu:
sum{i in 1..3} A[i]*x[i];
# p.o.
subject to ograniczenie1:
sum{i in 1..3} B[i]*x[i] = 5;
subject to ograniczenie2:
sum{i in 1..3} C[i]*x[i] >=8;
|
# Plik *.dat
param A:=
1 1
2 2
3 3 ;
param B:=
1 -1
2 1
3 1;
param C:=
1 12
2 -9
3 9;
|
Przykład 2
Opis zadania:
N studentów musi przed sesją przeczytać M. Książek. Każdy i-ty student potrzebuje na przeczytanie j-tej książki tij czasu. Książki mogą być czytane w dowolnej kolejności, przy czym w danej chwili tylko jedna osoba może czytać daną książkę i nie może czytać więcej niż jednej książki jednocześnie.
Przykładowe rozwiązanie:
# plik *.mod
set CZASY;
set KSIAZKI;
set STUDENCI;
param MAC_TIJ{i in STUDENCI, j in KSIAZKI}; # czasy czytania książek przez studentów
var v{b in CZASY, i in STUDENCI, j in KSIAZKI} >=0, <=1; # harmonogram czytania
var T_min;
minimize Czas_min:
T_min;
subject to Sesja{i in STUDENCI}:
sum{b in CZASY, j in KSIAZKI} v[b,i,j] <= T_min;
subject to JedenStudent{b in CZASY,j in KSIAZKI}:
sum{i in STUDENCI} v[b,i,j] <= 1;
subject to JednaKsiazka{b in CZASY, i in STUDENCI}:
sum{ j in KSIAZKI} v[b,i,j] <= 1;
subject to CalaKsiazka{ i in STUDENCI, j in KSIAZKI}:
sum{b in CZASY} v[b,i,j] = MAC_TIJ[i,j];
|
#plik *.dat
set CZASY:= 1 2 3 4 5 6 7 8 9 10 11 12;
set KSIAZKI:= 1 2 3 4;
set STUDENCI:= 1 2 3;
param MAC_TIJ :
1 2 3 4 :=
1 4 3 0 1
2 3 4 1 0
3 3 0 2 3;
|
|