Contents
1 Le problème du vendeur de journaux (à une période de temps)
- Chaque matin, le vendeur doit décider d’un nombre de journaux à commander
u ∈ 𝕌 = {0, 1,…} au prix unitaire c > 0.
- La demande du jour est incertaine w ∈ 𝕎 = {0, 1,…}
- Si à la fin de la journée il lui reste des invendus: coût unitaire cS ∈ ℝ.
- Si à la fin de la journée il n’a pas pu faire face à la demande on associe un coût unitaire
cM. Le coût lié à la non satisfaction de la demande est
1.1 La demande aléatoire
On veut faire tourner le même code pour plusieurs lois distinctes qui seront des lois
discrètes. On utiliser un select en Scicoslab qui permettra de choisir la loi utilisée pour les
calculs.
test=1, select test
case 1 then
N=100000;
n=100; p=0.5; titre=sprintf("loi binomiale(%d,%5.2f)",n,p);
wi=0:n; pi=binomial(p,n);
mu=n*p; mu1=pi*wi';
if abs(mu-mu1) > 1.E-8 then pause ;end N=100000;
W=grand(1,N,"bin",n,p); case 2 then
wi=[30,50,80];
titre=sprintf("loi discrète sur %d valeurs",size(wi,'*'));
N=100000;
P=[],for i=1:length(pi) do P=[P;pi];end
Y=grand(N,'markov',P,1);
case 3 then
n=100;
p=0.5; mu=n*p; wi=0:n;
titre=sprintf("loi de Poisson de paramètre %f",mu); N=100000; end
Question 1 Pour chacune des lois proposées faites un graphique de la fonction de
répartitions de la loi et un graphique de la densité de la loi
On pourra utiliser le squelette de programme suivant.
if %t then
function graphique_loi(titre,valeurs,probas)
xset('window',1);
xbasc();
rect=[0,0,max(valeurs)+10,min(max(probas)+0.2,1)]
plot2d3(valeurs,probas,rect = rect,style = 2); xtitle(titre); xset('window',2);
xbasc();
rect=[0,0,max(valeurs)+10,1.1]
plot2d2([0,valeurs],[0,repart],rect = rect,style = 2)
plot2d(valeurs,repart,rect = rect,style = -3)
xtitle(sprintf('Fonction de repartition de la %s',titre)); endfunction
graphique_loi(titre,wi,pi); xclick(); end
1.2 On utilise tout d’abord la distribution binomiale
On se place dans le cas test=1.
Question 2 Écrire une fonction Scicoslab qui calcule j(u,w) puis une fonction qui calcule
J(u). Faire un graphique avec les valeurs proposées des constantes et calculer le nombre de
journaux qu’il faut commander
c=10,cm=20,cs=5;
function y=j(u,w)
endfunction
function y=J(u) endfunction
if %t then U=-10:100;
Ju=[];for u=U do
end xset('window',1);xbasc(); plot2d(U,Ju,style = 2);
xtitle("La fonction J");
printf("Nombre optimal de journaux a commander %f\n",uopt);
printf("Moyenne de la demande %f\n",mu); plot2d(uopt,m,style = -4);
plot2d3(uopt,m); xclick(); end
Question 3 Vérifier sur un graphique que le nombre de journaux optimal à commander s’obtient
par la formule :
| (1) |
if %t then xset('window',1); xbasc(); fstar=(cm-c)/(cm+cs);
plot2d([0,wi],fstar*ones([0,wi]),rect = [0,0,max(wi)+10,1.1],style = 1);
Fv=cumsum(pi)
plot2d2([0,wi],[0,Fv],rect = [0,0,max(wi)+10,1.1],style = 2);
kopt=plot2d(wi(kopt),Fv(kopt),rect = [0,0,max(wi)+10,1.1],style = -4); xclick() end
1.3 On utilise maintenant une loi discrète à 3 valeurs
Dans le cas précédent, on trouve que le nombre de journaux optimal à commander est très voisin
de la moyenne de la demande. On cherche ici à construire un exemple ou les deux nombres seront
franchement différents.
Question 4 Reprendre ce qui précède, en vous plaçant maintenant dans le cas test=2 et
chercher à caler des valeurs des probabilités qui permettent d’obtenir le résultat souhaité.
1.4 La loi du coût
Question 5 Dans les cas test=1 et test=2, faites un graphique de la loi du coût pour diverses
valeurs de la commande u. On procédera de deux façons différentes
- En calculant la loi du coût.
- En approchant la loi du coût au moyen de tirages de la demande (loi empirique des
coûts).
if %t then
function graphique_loi_cout(u,wi,pi) xbasc(); xset('window',1);
ji=unique(ji1);
pji=0*ji; for i=1:size(ji,'*') do
I=find(ji1==ji(i));
end moy=pji*ji'; vmax=min(max(pji+0.2),1);
xmax=2000; plot2d3(ji,pji,rect = [0,0,xmax,vmax],style = 2);
plot2d3(moy,vmax,rect = [0,0,xmax,vmax],style = 1);
xtitle(sprintf('Loi de la fonction cout pour u=%f',u)) endfunction
xset('window',1);
xbasc(); for u=[0:10:100] do graphique_loi_cout(u,wi,pi); xclick();
end end
if %t then function graphique_loi_cout_mc(u,Wmc)
xbasc(); xset('window',1);
ji=unique(Jv);
moy=mean(Jv); vmax=min(max(pji+0.2),1);
xmax=2000; plot2d3(ji,pji,rect = [0,0,xmax,vmax],style = 2);
plot2d3(moy,vmax,rect = [0,0,xmax,vmax],style = 1);
xtitle(sprintf('Loi de la fonction cout pour u=%f',u)) endfunction
for u=[0:10:100] do
graphique_loi_cout_mc(u,W); xclick(); end end
1.5 Un problème linéaire
Question 6 En utilisant la présentation faite en cours, construire un problème linéaire dont
la solution permet de calculer le nombre de journaux optimal à commander
function [A,B,C,lb,ub]=linprog_vendeur(wi,pi)
m=size(pi,'*');
lb=[0;zeros(m,1);zeros(m,1)]; ub=[100;%inf*ones(m,1);%inf*ones(m,1)];
endfunction if %t then [A,B,C,lb,ub]=linprog_vendeur();
[varopt,lagr,fopt]=linpro(C,A,B,lb,ub); usharp=varopt(1); end
1.6 Une stratégie [s,S]
On regarde maintenant un cas ou le vendeur à déjà des journaux et ou il paye un coup fixe si il
commande des journaux. On cherche à retrouver ici le fait que la stratégie optimale est de la forme
[s,S].
Question 7 On se placera dans le cas test=1. Calculer le nombre optimal de journaux à
commander suivant la valeur du stock initial. Vérifier que la stratégie est bien de la forme [s,S]: on
remonte le stock au niveau S si il est inférieur à s et on ne fait rien sinon. Calculer s par la
formule
cf=200; function y=Jtilde(u,x) y=cf*(u > 0)+J(u+x)-c*x endfunction
xuopt=[]; xv=0:1:2*max(wi); U=0:1:2*max(wi);
for x0=xv do
xuopt=[xuopt,uopt]; end
xset('window',1); xbasc();
plot2d2(xv,xuopt,style = 2);
for x=0:2*max(wi) do
end s=kopt;
1.7 Correction
test=2; select test
case 1 then
n=100; p=0.5;
titre=sprintf("loi binomiale(%d,%5.2f)",n,p); wi=0:n;
pi=binomial(p,n); mu=n*p;
mu1=pi*wi'; if abs(mu-mu1) > 1.E-8 then pause ;end
N=100000; W=grand(1,N,"bin",n,p);
case 2 then 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); case 3 then
n=100;
p=0.5; mu=n*p; wi=0:n; pi=(mu .^wi*exp(-mu)) ./gamma(wi+1);
titre=sprintf("loi de Poisson de paramètre %f",mu); N=100000; W=grand(1,N,'poi',mu);
end if %t 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); 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
if %t then xset('window',1);
xbasc(); fstar=(cm-c)/(cm+cs); Fv=cumsum(pi);
plot2d2([0,wi],[0,Fv],rect = [0,0,max(wi)+10,1.1],style = 2);
plot2d([0,wi],fstar*ones([0,wi]),rect = [0,0,max(wi)+10,1.1],style = 1);
for k=1:size(Fv,'*') do if Fv(k) >= fstar then kopt=k;break;end end
plot2d(wi(kopt),Fv(kopt),rect = [0,0,max(wi)+10,1.1],style = -4); xclick()
end if %t then
function graphique_loi_cout(u,wi,pi) xbasc(); xset('window',1);
ji1=c*u+cs*max((u-wi),0)+cm*max((wi-u),0);
ji=unique(ji1); pji=0*ji; for i=1:size(ji,'*') do I=find(ji1==ji(i));
pji(i)=sum(pi(I)); end moy=pji*ji'; vmax=min(max(pji+0.2),1);
xmax=2000; plot2d3(ji,pji,rect = [0,0,xmax,vmax],style = 2);
plot2d3(moy,vmax,rect = [0,0,xmax,vmax],style = 1);
xtitle(sprintf('Loi de la fonction cout pour u=%f',u)) endfunction
xset('window',1);
xbasc(); for u=[0:10:100] do graphique_loi_cout(u,wi,pi); xclick();
end end
if %t then function graphique_loi_cout_mc(u) xbasc(); xset('window',1);
Jv=c*u+cs*max((u-W),0)+cm*max((W-u),0);
ji=unique(Jv); pji=0*ji; for i=1:size(ji,'*') do I=find(Jv==ji(i));
pji(i)=size(I,'*')/size(Jv,'*'); end moy=mean(Jv); vmax=min(max(pji+0.2),1);
xmax=2000; plot2d3(ji,pji,rect = [0,0,xmax,vmax],style = 2);
plot2d3(moy,vmax,rect = [0,0,xmax,vmax],style = 1);
xtitle(sprintf('Loi de la fonction cout pour u=%f',u)) endfunction
for u=[0:10:100] do graphique_loi_cout_mc(u); xclick();
end end
function [A,B,C,lb,ub]=linprog_vendeur(wi,pi) m=size(pi,'*');
A=[ones(m,1),-eye(m,m),zeros(m,m);-ones(m,1),zeros(m,m),-eye(m,m)];
B=[wi(:);-wi(:)]; C=[c;cs*pi(:);cm*pi(:)];
lb=[0;zeros(m,1);zeros(m,1)]; ub=[100;%inf*ones(m,1);%inf*ones(m,1)]; endfunction
if %t then [A,B,C,lb,ub]=linprog_vendeur(); [varopt,lagr,fopt]=linpro(C,A,B,lb,ub);
usharp=varopt(1); 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