Upload
teagan-moss
View
31
Download
5
Embed Size (px)
DESCRIPTION
Algoritmai ir duomenų struktūros ( AD S). 6 paskaita Saulius Ragaišis , VU MIF [email protected] 20 12 - 03 - 12. Modeliavimo programos pavyzdys. Sąlyga : savitarnos parduotuvė dirba T laiko vienetų; - PowerPoint PPT Presentation
Citation preview
Modeliavimo programos pavyzdys
Sąlyga:savitarnos parduotuvė dirba T laiko vienetų;joje yra N kasų;kiekvienu laiko momentu su tikimybe M (%) ateina klientas;jo apsipirkimo laikas yra atsitiktinis, bet ne didesnis nei A;baigęs pirkti, jis stoja į eilę prie atsitiktinės kasos;jo aptarnavimo prie kasos laikas yra atsitiktinis, bet ne didesnis nei B.
Modeliavimo programos pavyzdys
Rasti:kiek reikia turėti parduotuvės vežimėlių, kad jų nepritrūktų (daroma prielaida, kad aptarnavus klientą prie kasos, jo vežimėliu iš karto gali naudotis naujas klientas).
Programos parametrų failas
500 modeliavimo laikas5 kasu skaičius50 kliento atėjimo tikimybė (%)40 maksimalus kliento apsipirkimo laikas10 maksimalus kliento aptarnavimo prie kasos laikas
Eilėje saugomų duomenų tipas
unit QueueData;
interface
type QueueDataType = ...;
implementation
end.
ADT Eilė
unit Queue;
interface
uses QueueData;type QueueType = ...;
procedure createQueue (var queue : QueueType);function isEmptyQueue (const queue : QueueType) : boolean;function isFullQueue (const queue : QueueType) : boolean;procedure enQueue (var queue : QueueType; data : QueueDataType;
var err : boolean);procedure deQueue (var queue : QueueType; var data : QueueDataType;
var err : boolean);procedure firstInQueue (const queue : QueueType; var data : QueueDataType;
var err : boolean);function lengthOfQueue(const queue : QueueType) : integer;procedure destroyQueue (var queue : QueueType);
implementation
Programaprogram Shop;
uses QueueData, Queue;
const PARAMS_FILE_NAME = 'params.txt'; MAX_CASH_DESKS = 10; MAX_ACTIVE_CLIENTS = 20;
{ Global variables }var errors : boolean; simulationTime, noOfCashDesks, newClientProbability, maxBuyingTime, maxCashingTime : integer;
procedure loadParams; ...
{ Program variables }var time, maxNoOfShoppingCarts, usedShoppingCarts, noOfActiveClients, i, j, k : integer; cashingTime : QueueDataType; activeClients : array[1..MAX_ACTIVE_CLIENTS] of integer; cashDesks : array[1..MAX_CASH_DESKS] of QueueType; cashingLeft : array[1..MAX_CASH_DESKS] of integer;begin loadParams; if errors then exit; ...
Programa (2)
while not errors and (time < simulationTime) do { Main simulation loop }begin inc(time); { Get new client } if random(100) <= newClientProbability then begin { New client should be added to active clients } inc(noOfActiveClients); if noOfActiveClients > MAX_ACTIVE_CLIENTS then begin writeln('Number of active clients become too big ( >',
MAX_ACTIVE_CLIENTS, ' ).'); errors := true; break; end; activeClients[noOfActiveClients] := time + random(maxBuyingTime) + 1; { New client gets a shopping cart } inc(usedShoppingCarts); if usedShoppingCarts > maxNoOfShoppingCarts then maxNoOfShoppingCarts := usedShoppingCarts; end; { Check active clients who finished buying } ... { Check queues at cash desks } ...end; { Main simulation loop }
Programa (3)
{ Check active clients who finished buying }j := 0;for i := 1 to noOfActiveClients dobegin if activeClients[i] > time then begin inc(j); activeClients[j] := activeClients[i]; end else begin k := random(noOfCashDesks) + 1; cashingTime := random(maxCashingTime) + 1; enQueue(cashDesks[k], cashingTime, errors); if errors then begin writeln('The queue of cash desk becomes too long.'); break; end; if lengthOfQueue(cashDesks[k]) = 1 then cashingLeft[k] := cashingTime + 1; dec(noOfActiveClients); endend;
Programa (4)
{ Check queues at cash desks }for k := 1 to noOfCashDesks do if lengthOfQueue(cashDesks[k]) > 0 then begin dec(cashingLeft[k]); if cashingLeft[k] = 0 then begin deQueue(cashDesks[k], cashingTime, errors); if errors then begin writeln('Program error: trying to dequeue.'); break; end; if lengthOfQueue(cashDesks[k]) > 0 then begin firstInQueue(cashDesks[k], cashingTime, errors); cashingLeft[k] := cashingTime; end; end; end;
Programa (5)
{ Output simulation results } writeln('Max number of shopping carts is ', maxNoOfShoppingCarts);
{ Clearing data structues } for i := 1 to MAX_CASH_DESKS do destroyQueue(cashDesks[i]);end.
Pilnas programos tekstas bus pateiktas internete.
Programos vykdymas
Pagrindinės programos pradžioje pridėjus: Randomize;
D:\MIF\A&DS\_Pvz>shop_rMax number of shopping carts is 257
D:\MIF\A&DS\_Pvz>shop_rMax number of shopping carts is 256
D:\MIF\A&DS\_Pvz>shop_rMax number of shopping carts is 267
D:\MIF\A&DS\_Pvz>shop_rMax number of shopping carts is 251 Ar programos rezultatai teisingi?
D:\MIF\A&DS\_Pvz>shop_aMax number of shopping carts is 244
D:\MIF\A&DS\_Pvz>shop_aMax number of shopping carts is 244
D:\MIF\A&DS\_Pvz>shop_aMax number of shopping carts is 244
Apibendrinimas
Visada vertėtų pavertinti, ar programos rezultatai prasmingi.Modeliavome 500 laiko vienetų, o kliento atėjimo tikimybė yra 50%. Taigi per visą laiką turėtų ateiti apie 250 klientų. O programa sako, kad tiek vežimėlių ir reikia.Kyla įtarimas, kad vežimėliai neatlaisvinami...Patikrinus, pasirodo, kad programoje praleistasdec(usedShoppingCarts);
Klausimai
?