WUT_Computer_Science/NotProgramming/MOM/implementacja_temp.mod

95 lines
2.7 KiB
Modula-2

# 1. Zbiory
set Samochody;
set Ladowarki;
# 2. Parametery
# Najwczesniejszy mozliwy czas rozpoczecia ladowania samochodu s na ladowarce l [x]
param E{s in Samochody};
# Czas ladowania samochodu s na ladowarce l [x]
param D{s in Samochody, l in Ladowarki};
# Czas odjazdu samochodu s [x]
param O{s in Samochody};
# Zysk z realizacji kursu przez samochd s [x]
param Z{s in Samochody};
# Zmienna decyzyjna
# zmienna okreslajaca godzine rozpoczecia ladowania samochodu s na ladowarce l [x]
var u{s in Samochody}, >= 0, <= 24;
# zmienna binarna okreslajaca czy kurs zostanie wykonany [x]
var y{s in Samochody}, binary;
# zmienna binarna okreslajaca czy samochd i jest ladowany po samochodzie j na ladowarce l
var v{i in Samochody, j in Samochody}, binary;
# zmienna binarna okreslajacy czy samochd s jest ladowany na ladowarce l [x]
var k{s in Samochody, l in Ladowarki}, binary;
# a = (u[s, l] + D[s, l]) * k[s, l]
# Funkcja celu [x]
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. [x]
Ogr_1{s in Samochody, l in Ladowarki}:
u[s] >= E[s] * y[s];
# Samochód moze byc ladowany maksymalnie na jednej ladowarce [x]
Ogr_2{s in Samochody}:
sum {l in Ladowarki} k[s, l] = y[s];
# Ladowanie danego samochodu na danej ladowarce moze rozpoczac sie tylko po zakonczeniu poprzedniego ladowania. [x]
Ogr_3{i in Samochody, j in Samochody, l in Ladowarki: i != j}:
u[i] + 2400 * (1 - v[i, j]) >= (u[j] + D[j, l] * v[i, j]) - 4800 * (1 - k[j, l]);
Ogr_4{i in Samochody, j in Samochody, l in Ladowarki: i != j}:
v[i, j] + v[j, i] >= k[i, l] + k[j, l] - 1;
# Samochód realizujacy dostawe musi ukonczyc ladowanie przed godzina odjazdu [x]
Ogr_5{s in Samochody}:
u[s] + sum {l in Ladowarki} (D[s, l] * k[s, l]) <= O[s] * y[s];
solve;
display Q;
display {s in Samochody, l in Ladowarki: k[s, l] > 0}: u[s];
#display {s in Samochody}: y[s];
display {i in Samochody, j in Samochody: v[i, j] > 0}: v[i, j];
display {s in Samochody, l in Ladowarki: k[s, l] > 0}: k[s, l];
data;
set Samochody := s1, s2, s3, s4, s5, s6, s7;
set Ladowarki := l1, l2, l3, l4;
param E :=
s1 6
s2 6
s3 6
s5 6
s4 6
s6 6
s7 6;
param D :=
s1 l1 4 s1 l2 2 s1 l3 2 s1 l4 1
s2 l1 6 s2 l2 3 s2 l3 3 s2 l4 1.5
s3 l1 1 s3 l2 0.5 s3 l3 0.5 s3 l4 0.25
s4 l1 8 s4 l2 4 s4 l3 4 s4 l4 2
s5 l1 10 s5 l2 5 s5 l3 5 s5 l4 2.5
s6 l1 18 s6 l2 9 s6 l3 9 s6 l4 4.5
s7 l1 12 s7 l2 6 s7 l3 6 s7 l4 3;
param O :=
s1 10
s2 10
s3 12
s4 14
s5 12
s6 12
s7 10;
param Z :=
s1 25
s2 25
s3 50
s4 100
s5 25
s6 50
s7 100;
end;