Contents
1 Le problème du vendeur de journaux à un pas de temps
On reprend ici le code du T.P précédent et on va utiliser la loi de demande discrète sur trois
points que l’on avait considéré sur le problème à un pas de temps.
wi=[30,50,80]; pi=[1/2,1/4,1/4];
titre=sprintf("loi discrète sur %d valeurs",size(wi,'*')); mu=pi*wi';
N=100000; P=ones(size(wi,'*'),1)*pi;
Y=grand(N,'markov',P,1); W=wi(Y); if %f then function graphique_loi(titre,valeurs,probas)
xset('window',1); xbasc();
plot2d3(wi,pi,rect = [0,0,max(valeurs)+10,min(max(probas)+0.2,1)],style = 2);
xtitle(titre); xset('window',2);
xbasc(); plot2d2([0,wi],[0,cumsum(pi)],rect = [0,0,max(valeurs)+10,1.1],style = 2)
plot2d([0,wi],[0,cumsum(pi)],rect = [0,0,max(valeurs)+10,1.1],style = -3)
xtitle(sprintf('Fonction de repartition de la %s',titre)); endfunction
graphique_loi(titre,wi,pi); xclick(); end
c=10,cm=20,cs=5;cf=200; function y=j(u,w)
y=c*u+cs*max(u-w,0)+cm*max(w-u,0) endfunction
function y=J(u) y=c*u+cs*pi*max((u-wi'),0)+cm*pi*max((wi'-u),0); endfunction
if %t then U=-10:100; Ju=[];
for u=U do Ju=[Ju,J(u)];end xset('window',1); xbasc(); plot2d(U,Ju,style = 2);
xtitle("La fonction J"); [m,kmin]=min(Ju);
uopt=U(kmin); S=uopt; printf("Nombre optimal de journaux a commander %f\n",U(kmin));
printf("Moyenne de la demande %f\n",mu); plot2d(U(kmin),m,style = -4); plot2d3(U(kmin),m);
xclick(); end
function y=Jtilde(u,x) y=cf*(u > 0)+J(u+x)-c*x
endfunction
xuopt=[]; xv=0:1:2*max(wi);
for x0=xv do U=0:2*max(wi); Ju=[];for u=U do Ju=[Ju,Jtilde(u,x0)];end g=[];
[m,kmin]=min(Ju); xuopt=[xuopt,U(kmin)]; end I=find(xuopt==0); s=xv(I(1)-1);
xset('window',1); xbasc();
plot2d2(xv,xuopt,style = 2); plot2d2(xv(1:s),xv(1:s)+xuopt(1:s),style = 1);
xtitle(sprintf("Valeur de s=%d et de S=%d",xv(s),xv(s-1)+xuopt(s-1)));
x=0:2*max(wi); Jv=[];
for i=1:size(xv,'*') do Jv=[Jv,J(x(i))];end costs=Jv-(cf+J(uopt)); I=find(costs <= 0);
if isempty(I) then s=0; else s=x(I(1)-1) end printf("On trouve s=%d et S=%d\n",s,S);
Question 1 Faites éxecuter le code précédent dans scicoslab et vérifiez que la stratégie
optimale est bien de la forme [s,S].
1.1 On cherche maintenant à résoudre le problème du vendeur de journaux sur un horizon
T
On propose ici un squelette de programme qui implémente l’équation de Programmation
dynamique. Il faut compléter ce programme et résoudre le problème sur un horizon T. À
l’instant t = 1 le vendeur de journaux fait sa première commande et à l’instant T il
ne commande plus. Le cas T = 2 correspond donc au problème du vendeur sur une
journée.
exec('vendeur-T-un.sci');
alpha=1.0; function y=ct(u,x)
y=cf*(u > 0)+c*u+alpha*cs*max(x,0)+alpha*cm*max(-x,0) endfunction
function y=c0(u) y=cf*(u > 0)+c*u endfunction
function y=K(x) y=cs*max(x,0)+cm*max(-x,0) endfunction
xmin=-100;xmax=100; function y=f(x,u,w) y=min(max(x+u-w,xmin),xmax) endfunction
T=2; etats=xmin:xmax;
allu=0:xmax;
VT=alpha^T*K(etats);
L=list(VT);
U=list(0);
for t=T-1:-1:1 do printf("t=%d\n",t); Vt=zeros(1,size(etats,'*'));
Ut=%nan*ones(1,size(etats,'*')); Vtp1=L($);
for i=1:size(etats,'*') do x=etats(i);
mcost=%inf; for k=1:size(allu,'*') do
u=allu(k);
cost=0;
for xxx=zzz do
ix=find(xtp1==etats);
end
end
Vt(i)=mcost; Ut(i)=allu(kumin);
end L($+1)=Vt; U($+1)=Ut; end
xset('window',1); xbasc(); plot2d2(etats,L($))
xset('window',1); xbasc(); plot2d2(etats,U($))
Question 2
- Compléter le code pour résoudre l’équation de Bellman.
- Faire tourner le code pour T = 2 et retrouver les résultats du problème à un pas de
temps.
- Faire tourner le code pour T = 8 et vérifier que l’on obtient aussi une stratégie [s,S].
- Simuler des trajectoires de la chaîne de Markov controlée avec la commande optimale
et tracer des trajectoires
- Caluler à partir de simulations pour un point inital fixé x un coût moyen et le comparer
à la valeur de Bellman calculée.