Skip to content

Instantly share code, notes, and snippets.

@simonwh
Created October 10, 2010 17:26
Show Gist options
  • Save simonwh/619392 to your computer and use it in GitHub Desktop.
Save simonwh/619392 to your computer and use it in GitHub Desktop.
% 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