# 1. Zbiory
set Samochody; 
set Ladowarki; 

# 2. Parametery 
# Najwczesniejszy mozliwy czas rozpoczecia ladowania samochodu s na ladowarce l
param E{s in Samochody, l in Ladowarki}; 
#  Czas ladowania samochodu s na ladowarce l
param D{s in Samochody, l in Ladowarki}; 
#  Czas odjazdu samochodu s
param O{s in Samochody}; 
#  Zysk z realizacji kursu przez samochód s
param Z{s in Samochody}; 
 
# Zmienna decyzyjna
# zmienna okreslajaca godzine rozpoczecia ladowania samochodu s na ladowarce l 
var u{s in Samochody, l in Ladowarki}, >= 0 and <= 24; 
# zmienna binarna okreslajaca czy kurs zostanie wykonany 
var y{s in Samochody}, binary; 
#  zmienna binarna okreslajaca czy samochód i jest ladowany po samochodzie j na ladowarce l
var v{i in Samochody, j in Samochody, l in Ladowarki}, binary; 
#  zmienna binarna okreslajaca czy samochód s jest ladowany jako pierwszy na ladowarce l
var p{s in Samochody, l in Ladowarki}, binary;  
#  zmienna binarna okreslajacy czy samochód s jest ladowany na ladowarce l
var k{s in Samochody, l in Ladowarki}, binary; 
 
# Funkcja celu
maximize Q: sum {s in Samochody} y[s]*Z[s]; 
 
# Ograniczenia
subject to 
  # Samochód nie moze rozpoczac swojego ladownia przed najwczesniejszym mozliwym czasie ladowania.
  Ogr_1{s in Samochody, l in Ladowarki}: 
    u[s,l] >= E[s, l]; 
  # Samochód moze byc ladowany maksymalnie na jednej ladowarce  
  Ogr_2{s in Samochody, l in Ladowarki}: 
    sum {l in Ladowarki} k[s, l] == y[s]
  Ogr_3{n in Budynki}: 
    sum {i in Budynki} f[n,i] <= sum {j in BudynkiNaStart} f[j,n]; 
 
solve; 
display {i in Budynki, j in Budynki: f[i,j] > 0}: f[i,j]; 
display: Q;