-
Notifications
You must be signed in to change notification settings - Fork 0
/
progetto_CP.mod
96 lines (77 loc) · 2.35 KB
/
progetto_CP.mod
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*********************************************
* OPL 12.10.0.0 Model
* Author: Jacopo
* Creation Date: 23 lug 2022 at 18:09:28
*********************************************/
// Input dati del problema
int nUnita = ...;
int nPeriodi = ...;
range I = 1..nUnita;
range T = 1..nPeriodi;
int D[T] = ...;
tuple dati_unita
{
float k1;
float k2;
float k3;
int Pmin;
int Pmax;
int initial_status;
int min_switch_up;
int min_switch_down;
int startup_cost;
}
dati_unita unita[I] = ...;
// Variabili
dvar boolean u[I][T];
dvar int p[I][T];
// CP parameters
using CP;
execute {
cp.param.timeLimit=1800;
}
// F.O.
minimize
(
sum (i in I, t in T) u[i][t]*(unita[i].k1 + unita[i].k2*p[i][t] + unita[i].k3*p[i][t]^2)
+
sum (i in I) (
u[i][1]*(unita[i].initial_status<=-1)*unita[i].startup_cost
+
sum(t in T: t>1) (
(u[i][t]==1 && u[i][t-1]==0) * unita[i].startup_cost
)
)
);
// VINCOLI
subject to
{
// V.1
forall (t in T) vincolo_domanda_soddisfatta: sum(i in I) p[i][t] == D[t];
// V.5
forall (i in I, t in T) vincolo_inf_potenza_prodotta_vincolata: (u[i][t]*unita[i].Pmin) <= p[i][t];
// V.6
forall (i in I, t in T) vincolo_sup_potenza_prodotta_vincolata: p[i][t] <= (u[i][t]*unita[i].Pmax);
// V.9 (considerando V.11)
vincolo_switch_up_minimo:
forall (i in I, t in T)
forall (r in t-unita[i].min_switch_up+1..t-1) {
if (r<1)(u[i][t]>=
// (x <=|S|)*[(S>0)-(S<0)]+(S<0) with X=(-r+1) ... mi permette di ottenere la variabile decisionale u[i][r] con r non positivo
(((-r+1)<=abs(unita[i].initial_status))*((unita[i].initial_status>= 1)-(unita[i].initial_status<=-1))+(unita[i].initial_status<=-1))
);
if(r==1) (u[i][t] >= u[i][r]-(unita[i].initial_status>=1));
if(r>1) (u[i][t] >= (u[i][r]-u[i][r-1]));
}
// V.10 (considerando V.11)
vincolo_switch_down_minimo:
forall (i in I, t in T)
forall (r in t-unita[i].min_switch_down+1..t-1) {
if(r<1) u[i][t] <= (1
- (((-r+2)<=abs(unita[i].initial_status))*((unita[i].initial_status>= 1)-(unita[i].initial_status<=-1))+(unita[i].initial_status<=-1))
+ (((-r+1)<=abs(unita[i].initial_status))*((unita[i].initial_status>= 1)-(unita[i].initial_status<=-1))+(unita[i].initial_status<=-1))
);
if(r==1)u[i][t] <= (1 - (unita[i].initial_status>=1) + u[i][r]);
if(r>1) u[i][t] <= (1 - u[i][r-1] + u[i][r]);
}
}