J'essaie de modèle un modèle MIP dans CPLEX. J'ai une fonction qui inclut des variables de décision et j'ai besoin de prendre l'intégrale de cette fonction pour calculer sa valeur attendue. Est-il possible de prendre de l'intégrale d'une fonction en CPLEX? Merci!!!!
0
avec piecewise linear vous peut approximer toute fonction et de compter sur la Programmation Mathématique.
Voir Interpoler une fonction quelconque dans trucs et Astuces dans la BPO
// linearization of f(x)=1/x through a piecewise linear function
int sampleSize=10000;
float s=1;
float e=10;
float x[i in 0..sampleSize]=s+(e-s)*i/sampleSize;
int nbSegments=5;
float x2[i in 0..nbSegments]=(s)+(e-s)*i/nbSegments;
float y2[i in 0..nbSegments]=1/x2[i]; // y=f(x)
float firstSlope=0;
float lastSlope=0;
tuple breakpoint // y=f(x)
{
key float x;
float y;
}
sorted { breakpoint } breakpoints={<x2[i],y2[i]> | i in 0..nbSegments};
float slopesBeforeBreakpoint[b in breakpoints]=
(b.x==first(breakpoints).x)
?firstSlope
:(b.y-prev(breakpoints,b).y)/(b.x-prev(breakpoints,b).x);
pwlFunction f=piecewise(b in breakpoints)
{ slopesBeforeBreakpoint[b]->b.x; lastSlope } (first(breakpoints).x, first(breakpoints).y);
assert forall(b in breakpoints) abs(f(b.x)-b.y)<=0.001;
Avec la Programmation par contraintes à l'intérieur de CPLEX vous pouvez utiliser n'importe quelle fonction (même non linéaire) et même blackbox fonction.
Exemple de non linéaire de la fonction:
using CP;
// CPOptimizer allows all kind of non linearities
int nbKids=300;
float costBus40=500;
float costBus30=400;
dvar int+ nbBus40;
dvar int+ nbBus30;
// Non linear objective (exponential)
minimize
costBus40*exp(nbBus40) +exp(nbBus30)*costBus30;
subject to
{
40*nbBus40+nbBus30*30>=nbKids;
}