Up: Return to previous menu
Ensait - E2 - Aide à la décision
Date: Corrigé de l'évaluation du 2008-01-18
durée 2h, tous documents autorisés
- La première qualité que l'on attend d'un ingénieur est de savoir présenter
ses conclusions. Les listings, les calculs, les graphiques et autres
"sorties d'ordinateur" ne peuvent en aucun cas remplacer
un relevé de conclusions, rédigé de façon précise et scientifique.
- Il est donc nécessaire d'ordonner différents types de matériaux de
façon à produire un document organisé, produisant une liste de réponses
argumentées à la liste des questions de l'énoncé.
- La méthode RECOMMANDÉE était de rédiger les réponses
à la main et de faire des couper-coller avec des ciseaux et de la
colle pour insérer les "sorties d'ordinateur". L'expérience
confirme que cette méthode est à la fois la plus rapide et la plus
robuste. C'est aussi celle qui permet de se concentrer sur les compétences
évaluées et non sur les compétences/incompétences en dactylographie.
- Principe d'adéquation : lorsque la question change, il est assez fréquent
que la réponse adéquate change aussi. Quand on constate que le graphe
théorique du sujet de révision n'est pas en accord avec le graphe
expérimental de l'évaluation, ce n'est pas la faute à Walker. C'est
que les données ont changé.
- Un minimum de rigueur orthographique et grammaticale est attendu.
La "varaince", "on génère les nombre 1,
2, autre", "supperposer", "le
nombre d'unité de temps avant l'arrivé du", "algotrythme"
et le "test du Qui2" créent une certaine surprise
à un niveau master. Quant à "on résonne de la même manière"...
- Enfin, les copies sont évaluées en proportion de leur contenu et pas
en fonction de leur poids. Dans cet ordre d'idées, réimprimer vingt
pages de bibliothèques (dont la simulation de l'ensemble des files
d'attente d'une agence bancaire) n'est pas utile.
- Les notes s'étagent de 03 à 20, avec une moyenne de 11.5. Huit étudiants
ont 17 ou plus. Sept étudiants ont 07 ou moins.
- Les valeurs initiales ont changé par rapport à des exercices
précédents. Savoir où et comment modifier les programmes utilisés
fait partie des compétences évaluées.
- Les remarques faites à l'occasion du module "Plans
d'expérience" continuent d'être valables. Elles sont consultables
à l'adresse http://www.douillet.info/~douillet/cours/planx_ds07a/index.html.
- Par ailleurs, l'attention des étudiants est attirée
sur le fait que le trafic réseau de leur ordinateur est susceptible
d'être enregistré pendant la durée de l'évaluation.
- Les bibliothèques decis et waits
doivent être à jour, c'est à dire avoir été téléchargées récemment
sur le site web. Les numéros de version sont :
- Modifier la ligne
de chacun de ces deux programmes pour
qu'elle indique votre répertoire de travail.
- Avant chaque simulation, réinitialiser le générateur aléatoire
par la commande :
grand('setsd',2ddmmyy)
où votre date de naissance est dd/mm/19yy
On s'intéresse au générateur à quatre choix décrit dans decis.sce.
Initialiser le générateur aléatoire. Puis utiliser initpick
pour introduire les valeurs
,
,
et
(vérifier les valeurs introduites en examinant le
message affiché dans scilex).
- Exécuter pickc (le générateur de Walker).
Que valent alors les vecteurs gap et aux
?
- Ne pas oublier d'initialiser le générateur
grand('setsd',123456);
- initpick(); pr=[p1,p2,p3,p4]; pickc();
printf( 'gap= '); printf('%5.3f ',gap');
printf('\nalt= '); printf('%5d ',alt'); printf('\n\n');
- On obtient :
N=500, p1=0.15, p2=0.40, p3=0.25, p4=0.20, seed=123456
gap= 0.600 1.000 1.000 0.800
alt= 2 2 3 2 .
- Expliquer comment fonctionne le générateur gen,
et montrer qu'il engendre effectivement les nombres
avec les
comme fréquences théoriques.
On pourra utiliser sci2exp(gen) pour disposer
d'un affichage commode de la fonction gen.
- printf('%s\n', sci2exp(gen))
qui donne :
createfun(["y=%fun";
" z = rand(); y = ceil(z * 4)";
" if (y - 4 * z) > gap(y) then y = alt(y); end";
])
- Au niveau bac+4, expliquer comment fonctionne le générateur gen
ne consiste pas à traduire le code en "prendre rand, puis
multiplier par 4, puis prendre la partie entière, puis...".
Cela consiste à expliquer pourquoi faire tout cela va effectivement
conduire aux fréquences voulues. La base de ce fonctionnement est
que :
z est une variable aléatoire réelle, uniformément distribuée
sur
c
ceil(z*4) est une variable entière uniformément
distribuée sur
v
ceil(z-4)-4*z est une variable aléatoire réelle,
uniformément distribuée sur
- Dans le cours, c est le candidat, v est le verdict.
- On obtient
par la formule des probabilités totales :
Les
valent toutes
tandis que, par définition,
- chances=gap;
for j=1:4 do chances(alt(j))=chances(alt(j))+1-gap(j); end
printf('\nchances= '); printf('%5.3f ',chances');
printf('\n pr= '); printf('%5.3f ',pr'); printf('\n');
donne :
chances= 0.600 1.600 1.000 0.800
pr= 0.150 0.400 0.250 0.200
prouvant que les chances de sélection d'un candidat sont bien celles
qui conviennent.
- Le programme pickc trace automatiquement
l'histogramme des
valeurs engendrées. Ajouter le tracé de
l'histogramme des fréquences théoriques.
- Utiliser histplot(bor, [1,2,2,3,3,3,4,4,4,4]) pour tracer
l'histogramme théorique était légèrement inapproprié : cette "ruse"
était adaptée à l'exercice de préparation, où les probabilités étaient
:
.
- On pouvait, par contre, utiliser une liste à 20 valeurs :
histplot(bor, [1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,4,4,4,4])
- Et même (génération, puis test) :
li=[1*ones(1:3),2*ones(1:8),3*ones(1:5),4*ones(1:4)]
tmp=tabul(li,'i'); tmp=tmp(:,2)'; tmp/sum(tmp)
histplot(bor,li)
- Comme les deux histogrammes sont faits pour se ressembler, il n'était
pas inutile de passer l'histogramme expérimental en "gras".
curax=gca(); curax.children(2).children.thickness=2;
Figure 1:
Algorithme de Walker
|
|
- La variable lesx contient les valeurs
engendrées. Déterminer combien de fois les valeurs
ont été obtenues expérimentalement. Utiliser un test du
pour comparer avec les valeurs théoriques.
- On pouvait utiliser
tabul(lesx, 'i'), obs=ans(:,2),hyp=pr*N
- On pouvait utiliser aussi
[ind,obs]=dsearch(lesx,bor); hyp=pr*N;
printf('\nvaleur'); printf('%5d ',(1:4)')
printf('\n hyp'); printf('%5d ',round(hyp'))
printf('\n obs'); printf('%5d ',obs'); printf('\n');
- Par les deux méthodes, on obtient :
valeur 1 2 3 4
hyp 75 200 125 100
obs 63 212 117 108
- L'indicateur de Pearson est donné par
pearson=sum((hyp-obs).^2 ./ hyp);
Remarque : pour comprendre l'effet de l'opérateur "./",
il peut être utile d'écrire la commande précédente sous la forme :
(hyp-obs).^2 ./ hyp, pearson=sum(ans)
En tout cas diviser par hyp (en utilisant l'opérateur "/")
ne conduit pas au résultat: le logiciel ne veut pas croire que vous
avez été suffisamment inattentif pour vouloir utiliser l'inverse d'une
matrice de taille
et traduit cela en "pseudo-inverse"...
concept n'ayant rien avoir avec le calcul à entreprendre.
- On peut alors calculer la variable réduite associée et se référer
à la courbe donnée en cours. On peut aussi calculer la probabilité
cumulée associée à la valeur de l'indicateur de Pearson. Dans tout
les cas il est "inattendu" de traiter la valeur
de
comme une variable de Gauss : la loi du chi-square
n'est pas la loi normale.
- Les commandes :
pearson_red=(pearson-3)/sqrt(6); prob=cdfchi('PQ',pearson,3);
printf('\n pearson= %5.3f, pearson_red= %5.3f,
prob= %f\n',
pearson, pearson_red, prob);
conduisent à :
pearson= 3.792, pearson_red= 0.323, prob= 0.715182
- Bilan : la fonction gen est un générateur acceptable (remarque
: tel était le but poursuivi...).
Remarque préalable : le métier d'ingénieur ne consiste pas
à cliquer toujours et systématiquement sur le même mulot, et le test
de Student-Fisher ne consiste pas à cliquer hors de propos sur le
corrigé de l'exemple 3.3.6 http://www.douillet.info/~douillet/cours/decis/node4.html.
On considère à nouveau la variable aléatoire
avec
.
- Déterminer l'espérance et la variance de
.
- A nouveau, veut dire que l'on continue avec la même variable. Les
probabilités continuent d'être les mêmes
que précédemment.
- On a le choix entre
mu=mean(li); sigma=sqrt(mean(li.^2)- moy^2);
et
qui=[1,2,3,4];
mu=meanf(qui,pr); sigma=sqrt(meanf(qui .^2,pr)-moy^2);
- Dans les deux cas, la commande variance ne donne pas la variance
(cet état de fait est signalé dans le cours).
- printf('\nmu= %f, sigma^ 2=%f\n',
mu, sigma^ 2);
donne
mu= 2.500000, sigma^ 2=0.950000
- Déterminer l'intervalle de confiance (aux risques de
puis de
) de la moyenne correspondant à un échantillon de taille
puis
.
- La formule voulue est :
![$\displaystyle moy\in\left[\mu\pm k\left(\alpha\right)\,\sqrt{\frac{\sigma^{2}}{N}}\right]\qquad;\qquad k\, Gauss$](img30.png) |
(1) |
lorsque l'on encadre la moyenne de l'échantillon à partir des paramètres
de la population et
![$\displaystyle \mu\in\left[moy\pm t\left(\alpha\right)\,\sqrt{\frac{var_{est}}{N}}\right]\qquad;\qquad t\, Student$](img31.png) |
(2) |
lorsque l'on encadre la moyenne de la population à partir des paramètres
de l'échantillon.
- Pour un encadrement symétrique, un risque de
se répartit en
de chaque côté. La probabilité à utiliser dans les cdf est
donc
. Pour le risque
, on utilise la probabilité
cumulée
.
- Pour ne pas tout écrire en double, on utilise une boucle
for n=[500,11] do for p=[0.975, 0.995] do
k=cdfnor('X',0,1,p,1-p); delta=k*sigma/sqrt(N);
printf('au risque %d%%, k= %4.2f et moy(%3d) in [%6.4f,%6.4f]\n',
..
round(200*(1-p)), k, N, mu-delta, mu+delta)
end; end
- Les valeurs numériques correspondant à (1) sont :
au risque 5%, k= 1.96 et moy(500) in [2.4146,2.5854]
au risque 1%, k= 2.58 et moy(500) in [2.3877,2.6123]
au risque 5%, k= 1.96 et moy( 11) in [1.9240,3.0760]
au risque 1%, k= 2.58 et moy( 11) in [1.7430,3.2570]
- Comparer avec la moyenne de l'échantillon déjà obtenu (
).
Simuler en outre un échantillon de taille
et calculer sa moyenne.
- Pour l'encadrement expérience vers théorie, il faut utiliser
t=cdft('T',n-1,p,1-p); delta=t*sqrt(var/n);
et on obtient (pour
)
N=500 et risque 5%, t= 1.96 et mu in [2.4551,2.6249]
N=500 et risque 1%, t= 2.59 et mu in [2.4282,2.6518]
- Pour
, nous sélectionnons lesx(10:20). Les calculs
donnent :
N= 11 et risque 5%, t= 2.23 et mu in [1.6202,2.5616]
N= 11 et risque 1%, t= 3.17 et mu in [1.4214,2.7604]
- Le facteur de Student est (quasiment) égal au facteur normal lorsque
est grand. Par contre, pour
petit,
est plus grand que
de façon à tenir compte des risques de sous-estimation de l'écart-type
de la population.
On utilise désormais le programme de simulation de files d'attentes
décrit dans waits.sce.
- Modifier la fonction petitessai de la
façon suivante: (ligne 6 à 8)
grand('setsd',2ddmmyy)
deff('s=arv',sprintf('s=grand(1, ''uin'', %f, %f)',10, 19))
deff('s=srv',sprintf('s=grand(1, ''uin'', %f, %f)',16, 26))
- Lancer le programmer et en commenter le résultat.
Figure 2:
Un petit essai
|
- On obtient le Figure 2.
- On remarque que
.
Le système est donc congestif. Abandonné à lui même, la file d'attente
va tendre à croître indéfiniment.
- Le principal commentaire à faire est de dater chaque événement. Le
délai temporel entre deux événements correspond, à partir d'un événement
donné, au plus proche des deux événements à venir qui est soit une
arrivée, soit un départ :
- numcli est le numéro du client dernier arrivé. On obtient
le numéro d'arrivée des autres clients en partant de la fin. charge
est le temps de séjour résiduel du dernier client arrivé. Au point
de vue du serveur, c'est la charge de travail résiduelle autrement
dit le temps à passer avant d'avoir fini de servir tous les clients
actuellement présents. nbsej n'est pas le nombre de clients
en attente, mais le nombre total de clients présents.
- A la date
, le client
arrive pour un séjour
.
On en déduit que sa date de départ sera
(ce qui est bien
le cas). Ce séjour est la somme de l'attente et du service. Comme
l'attente est liée au séjour résiduel du client précédent, et que
celle-ci vaut
, on en déduit que le service est
. Ceci se
retrouve comme étant le délai séparant le départ des clients
et
soit
.
- On peut même remarquer le lien avec "Fig 5.4: Graphical proof
of the Little's theorem, from Sinclair, 2006", http://www.douillet.info/~douillet/cours/decis/node6.html
Utiliser le programme 'système M/Ga/1'
avec les réglages
et
. Le processus d'interarrivée
est alors
une loi exponentielle de paramètre
et le processus de service
est une loi Gamma de paramètres
et
tels que
et
.
Figure 3:
Les graphes engendrés par la simulation
|
|
- Déterminer le débit d'arrivée
à partir de
et donner la distribution (pdf) de probabilité associée. Quelle est
la variance du processus d'inter-arrivée ?
- Par définition
- Pour une loi exponentielle, le pdf (probability density function)
est :
- La variance est
.
- Rappeler quelle est la distribution de probabilité associée
à la loi Gamma de paramètres
et
. Déterminer la valeur de
en fonction de
et de
. Quelle est la variance des
services ?
- Une loi gamma réduite de paramètre
est
tandis qu'une loi gamma de paramètres
est
- On a
et donc
- La variance d'une loi Gamma est
- aaa=msrv^2/vsrv, bbb=msrv/aaa
- Rappeler ce qu'est le paramètre
et donner sa valeur.
- Ce paramètre est le rapport des débits
- Rappeler ce que signifient les graphes "1-Durée des
états" et "2-États lors de l'arrivée".
Pourquoi sont-ils si ressemblants dans l'exemple étudié ?
- Le graphe 1 donne le temps passé par le système dans les différents
états d'occupation (c'est le point de vue du serveur).
- Le graphe 2 donne la statistique du nombre de clients en cours de
séjour juste avant l'arrivée d'un nouveau client.
- Le fait que ces deux graphes se ressemblent n'est pas une règle générale,
mais un cas spécial causé par le fait que les arrivées sont exponentielles.
- Le programme affiche diverses moyennes, écart-types et auto-corrélations.
Pour ce qui est des services, donner l'intervalle de confiance à
concernant la moyenne. Même question pour la variance (on signale
que le
du cours vaut
pour
une loi Gamma).
- Les résultats de la simulation sont
elapsed time = 19.579000 - N= 50000
durées totale=1612343.704758, durées à vide=139841.687500
nom moyenne écart_type auto_corr.
durees 7.29979658 7.08189504
autres 7.28934213 7.06893418 0.98602434
sejours 470.7728069 422.9218919 0.98689272
services 58.9049995 38.3610466 0.00024394
residuels 42.0926403 36.0259904 0.30053120
- Ils peuvent être récupérés par mv=drawq(rep='1s-gam3');
- tmp=msscanf(mv(5,:),'%s %f %f%f')
z_moy_serv=(tmp(2)-msrv)/sqrt(vsrv/numcli)
donne
, valeur largement acceptable pour une variable normale.
- Le cours donne
.
On a donc :
var_s2=3*aaa*(aaa+2)*bbb^4 -vsrv^2
z_var_serv=(tmp(3)^2-vsrv)/sqrt(var_s2/numcli)
ce qui donne
, valeur également acceptable.
- Pour ce qui est des services résiduels, considérer le fait que
la loi en masse associée à la loi
est à son
tour une loi Gamma, de paramètres
et obtenir les intervalles
de confiance correspondants.
- Pour la répartition en masse des services, on obtient les valeurs
théoriques :
mmas=83.583333, vmas=2054.756944
- Pour le service résiduel on a mres=mmas/2 (formule du cours) et vres=vmas/3
+ mmas^ 2/12 (formule non demandée) :
mres=41.791667, vres=1267.100116, sres=35.596350
- On compare avec les valeurs expérimentales :
residuels 42.0926403 36.0259904 0.30053120
- Comme vres n'était pas donnée, il fallait partir des valeurs
expérimentales et calculer
(tmp(2)-mres)/(tmp(3)/sqrt(numcli))
. Ici encore,
il y a un bon accord théorie-expérience.
- Quelle serait la durée de séjour moyenne dans une file M/M/1
ayant les mêmes valeurs de
et
? Expliquer pourquoi
la valeur obtenue pour la file M/Ga/1 est inférieure.
- Pour une file M/M/1, le temps de séjour moyen serait
- La valeur nettement plus faible (
) obtenue avec une file
M/Ga/1 ayant les mêmes débits s'explique en premier lieu par le fait
que la variance des services est ici
tandis
qu'elle serait
-soit 2.4 fois plus- pour
des services exponentiels de même débit.
- Comparer le nombre de services résiduels constatés et le nombre
de clients entrés dans le système. Expliquer la proportion constatée
en la reliant à
et
.
- Il a été constaté
services résiduels alors que
.
Soit un ratio de
.
- La durée totale simulée est
, tandis que la durée
d'occupation du serveur est (total-idle)
. Soit un
ratio de
.
- Le fait que serveur et clients voient la même valeur pour le taux
d'activité est lié aux arrivées exponentielles. Le fait que le taux
temporel (celui vu par le serveur) soit approximativement égal à
est une propriété générale.
//Corrigé du DS 23a
if MSDOS then
cd("c:/MapleV6/Users/Douillet/decis") ;
libname1='decis.sce';
else
cd("~/docs/Ensait/decis/decis_ds23a") ;
libname1='~/docs/Ensait/decis/scilab/decis.sce';
libname2='~/docs/Ensait/waits/scilab/waits.sce';
end//if
BASErep=pwd();
exec(libname2, -1); exec(libname1, -1)
cd (BASErep)
myfig=BASErep+'/figures/';
global gap alt lesx
global durees serveur sejours attentes autres resids services
printf('---------------------------------------------------\n');
initpick()
pr=[p1,p2,p3,p4];xdel(winsid());
pickc()
printf( 'gap= '); printf('%5.3f ',gap');
printf('\nalt= '); printf('%5d ',alt'); printf('\n\n');
printf('%s\n', sci2exp(gen))
chances=gap;
for j=1:4 do chances(alt(j))=chances(alt(j))+1-gap(j); end
printf('\nchances= '); printf('%5.3f ',chances');
printf('\n pr= '); printf('%5.3f ',pr'); printf('\n');
li=[1*ones(1:3),2*ones(1:8),3*ones(1:5),4*ones(1:4)];
// tmp=tabul(li,'i'); tmp=tmp(:,2)'; tmp/sum(tmp)
histplot(bor,li)
curax=gca(); curax.children(2).children.thickness=2;
[ind,obs]=dsearch(lesx,bor);
hyp=pr*N;
printf('\nvaleur'); printf('%5d ',(1:4)')
printf('\n hyp'); printf('%5d ',round(hyp'))
printf('\n obs'); printf('%5d ',obs'); printf('\n');
pearson=sum((hyp-obs).^2 ./ hyp);
pearson_red=(pearson-3)/sqrt(6);
prob=cdfchi('PQ',pearson,3);
printf('pearson= %5.3f, pearson_red= %5.3f, prob= %f\n',..
pearson, pearson_red, prob);
mu=mean(li); sigma=sqrt(mean(li.^2)- mu^2); // variance(li)
qui=[1,2,3,4]; mu=meanf(qui,pr); sigma=sqrt(meanf(qui .^2,pr)-mu^2);
// variancef(qui,pr*size(li,'*'))
moy=mean(lesx); var=variance(lesx);
moy11=mean(lesx(10:20)); var11=variance(lesx(10:20));
printf('\n mu= %f, sigma^2=%f\n', mu, sigma^2);
printf(' moy= %f, var=%f\n', moy, var);
printf('moy11= %f, var11=%f\n\n', moy11, var11);
for n=[N,11] do for p=[0.975, 0.995] do
k=cdfnor('X',0,1,p,1-p); delta=k*sigma/sqrt(n);
printf('au risque %d%%, k= %4.2f et moy(%3d) in [%6.4f,%6.4f]\n',..
round(200*(1-p)), k, n, mu-delta, mu+delta)
end//for
end//for
printf('\n')
n=N; for p=[0.975, 0.995] do
k=cdft('T',n-1,p,1-p); delta=k*sqrt(var/n);
printf('N=%3d et risque %d%%, t= %4.2f et mu in [%6.4f,%6.4f]\n', ..
n, round(200*(1-p)), k, moy-delta, moy+delta)
end//for
n=11; for p=[0.975, 0.995] do
k=cdft('T',n-1,p,1-p); delta=k*sqrt(var11/n);
printf('N=%3d et risque %d%%, t= %4.2f et mu in [%6.4f,%6.4f]\n', ..
n, round(200*(1-p)), k, moy11-delta, moy11+delta)
end//for
printf('\n---------------------------------------------------\n\n');
tmp=fun2string(petitessai,'petitessai1');
tmp=strsubst(tmp, '12345','qzzq');
tmp=strsubst(tmp, '12','16');
tmp=strsubst(tmp, '18','26');
tmp=strsubst(tmp, '15','10');
tmp=strsubst(tmp, '25','19');
tmp=strsubst(tmp, 'petitessai1','petitessai1(qzzq)');
execstr(tmp);
tmp=fun2string(petitessai,'petitessai2');
tmp=strsubst(tmp, '12345','qzzq');
tmp=strsubst(tmp, '12','14');
tmp=strsubst(tmp, '15','9');
tmp=strsubst(tmp, '25','17');
tmp=strsubst(tmp, '18','25');
tmp=strsubst(tmp, 'petitessai2','petitessai2(qzzq)');
execstr(tmp);
petitessai1(); printf('\n');
N=50000; menu_MGa1();
cd(BASErep); repertoire='1s-gam3'; cd(repertoire);
mv=drawq(); drawgam();
cd(BASErep);
tmp=msscanf(mv(5,:),'%s %f %f%f'); printf('\n%s\n',mv(5,:));
aaa=msrv^2/vsrv, bbb=msrv/aaa
z_moy_serv=(tmp(2)-msrv)/sqrt(vsrv/numcli)
var_s2=3*aaa*(aaa+2)*bbb^4 -vsrv^2
z_var_serv=(tmp(3)^2-vsrv)/sqrt(var_s2/numcli)
tmp=msscanf(mv(6,:),'%s %f %f%f'); printf('\n%s\n',mv(6,:));
mmas=(aaa+1)*bbb; vmas=mmas*bbb;
printf('mmas=%f, vmas=%f\n', mmas,vmas);
vres=vmas/3+mmas^2/12;
printf('mres=%f, vres=%f, sres=%f\n', mmas/2, vres, sqrt(vres));
shortname=['durees','autres','sejour','service','resid','','walker',''];
for fig=[1:5,7] do
curfig=scf(fig); curax=gca();
curax.title.font_size=3; curax.sub_ticks=[0,0];
curax.margins=[0.08,0.03,0.12,0.1] ;
select fig
case 4 then curax.data_bounds(2)=4*msrv;
case 5 then curax.data_bounds(2)=3*msrv;
end//select
set_posfig_dim(curfig.figure_size(1),curfig.figure_size(2));
xs2eps(fig, myfig+shortname(fig));
end
Up: Return to previous menu
douillet@ensait.fr
2008-01-27