Created
October 10, 2010 17:26
-
-
Save simonwh/619392 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% Scriptet SUPER simulerer køsystemet i et supermarked. | |
% | |
% Tidsintervallet mellem to kundeankomster, | |
% tiden for et indkøb (dvs. kundens indsamling af varer) og | |
% tiden for en kundeekspedition antages alle at være | |
% gamma(alfa,beta)-fordelte, men med forskellige alfa- og beta-parametre. | |
clear all; | |
% Vi definerer først nogle konstanter | |
% | |
antalminut = 150; % Der simuleres fra kl. 10 til kl. 12.30 | |
maxkasser = 6; % Det maksimale antal åbne ekspeditionssteder | |
minkasser = 1; % Det minimale antal åbne ekspeditionssteder | |
% (= startantallet). Antallet skal være mindst 1 | |
mange = 5; % Når der er mange i kø (pr. kasse), og antal (åbne) | |
% kasser < maxkasser, åbnes et ekspeditionssted mere | |
faa = 2; % Når der er faa i kø (pr. kasse), og antal (åbne) | |
% kasser > minkasser, lukkes et af ekspeditionsstederne | |
ankalfa = 1; % alfa-parameteren for kundeankomst-tidsintervallet | |
ankbeta = 4.78; % beta-parameteren for kundeankomst-tidsintervallet | |
koebalfa = 3.04; % alfa-parameteren for indkøbstiden | |
koebbeta = 0.341; % beta-parameteren for indkøbstiden | |
ekspalfa = 2.94; % alfa-parameteren for ekspeditionstiden | |
ekspbeta = 3.60; % beta-parameteren for ekspeditionstiden | |
% | |
% Vi generer nu tidspunktet for den første kunde-ankomst | |
ank(1) = gammarand(ankalfa,ankbeta); | |
% | |
% Kun kunder, der kommer før sluttidspunktet, tælles med | |
antalfoer = 0; | |
while ank(antalfoer+1) < antalminut, | |
antalfoer = antalfoer+1; | |
ank(antalfoer+1) = ank(antalfoer) + gammarand(ankalfa,ankbeta); | |
end; | |
% | |
% Vi får ankomsttider til køen ved at addere købstiderne | |
for i = 1:antalfoer, | |
ank(i) = ank(i) + gammarand(koebalfa,koebbeta); | |
end; | |
% | |
% Ankomsttiderne til køen sorteres i voksende rækkefølge | |
% ved at kalde MATLAB-funktionen sort | |
ank = sort(ank,'ascend'); | |
% | |
% Kommer kunden efter sluttidspunktet for simuleringen, | |
% medregnes ekspeditionen af kunden ikke | |
antaleksp = antalfoer; | |
while ank(antaleksp) > antalminut, | |
antaleksp = antaleksp - 1; | |
end; | |
disp(['antal ankomster til supermarked: ',num2str(antalfoer),... | |
', antal ekspeditioner: ',num2str(antaleksp)]); | |
% | |
% Fælleskøen består af tre arrays og en tæller (antalevents), hvor | |
% koeevents.tid(antalevents) = tidspunktet, da køantallet | |
% blev det nuværende antal. | |
% koeevents.koelgd(antalevents) = nuværende antal kunder i fælleskøen. | |
% koeevents.kasser(antalevents) = nuværende antal åbne ekspeditionssteder. | |
% antalevents tælles op, hver gang køen ændres. Den starter med at være 1. | |
antalevents = 1; | |
koeevents = struct('tid', 0, 'koelgd', 0, 'kasser', minkasser); | |
kasser = minkasser; % kasser indeholder altid antallet af åbne kasser | |
% | |
tider=zeros(kasser,1); % ledighedstidspunkterne for hver ekspedient | |
% | |
for j=1:antaleksp %deffinerer intervallet for ankomster | |
[value,index] = min(tider(1:kasser)); | |
if value <= ank(j) | |
tider(index) = ank(j) + gammarand(ekspalfa,ekspbeta); | |
elseif kasser < maxkasser && koeevents.koelgd(antalevents) / kasser == mange | |
kasser = kasser + 1; | |
tider(end+1)=ank(j) + gammarand(ekspalfa,ekspbeta); | |
else | |
antalevents = antalevents + 1; | |
koeevents.tid(antalevents) = ank(j); | |
koeevents.koelgd(antalevents) = koeevents.koelgd(antalevents-1)+1; | |
koeevents.kasser(antalevents) = kasser; | |
end | |
while koeevents.koelgd(antalevents)>0 && value < ank(j+1); | |
[value,index] = min(tider(1:kasser)); | |
tider(index)=tider(index)+gammarand(ekspalfa,ekspbeta); | |
antalevents=antalevents+1; | |
koeevents.tid(antalevents)=value; | |
koeevents.koelgd(antalevents)=koeevents.koelgd(antalevents-1)-1; | |
koeevents.kasser(antalevents)=kasser; | |
end | |
if kasser > minkasser && koeevents.koelgd(antalevents) / kasser < faa; | |
tider(1:kasser) = sort(tider(1:kasser),'descend'); | |
tider(end) = []; | |
kasser = kasser - 1; | |
end | |
end | |
showresults(koeevents,antalevents,antalminut,'dansk '); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment