Presentation is loading. Please wait.

Presentation is loading. Please wait.

Algoritmai ir duomenų struktūros (ADS)

Similar presentations


Presentation on theme: "Algoritmai ir duomenų struktūros (ADS)"— Presentation transcript:

1 Algoritmai ir duomenų struktūros (ADS)
9 paskaita Saulius Ragaišis, VU MIF

2 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. 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).

3 Programos parametrų failas
500 modeliavimo laikas 5 kasu skaičius 50 kliento atėjimo tikimybė (%) 40 maksimalus kliento apsipirkimo laikas 10 maksimalus kliento aptarnavimo prie kasos laikas

4 Eilėje saugomų duomenų tipas
unit QueueData; interface type QueueDataType = ...; implementation end.

5 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

6 Programa program 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; ...

7 Programa (2) while not errors and (time < simulationTime) do { Main simulation loop } begin inc(time); { Get new client } if random(100) <= newClientProbability then { New client should be added to active clients } inc(noOfActiveClients); if noOfActiveClients > MAX_ACTIVE_CLIENTS then 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; { Check active clients who finished buying } ... { Check queues at cash desks } end; { Main simulation loop }

8 Programa (3) { Check active clients who finished buying } j := 0;
for i := 1 to noOfActiveClients do begin if activeClients[i] > time then inc(j); activeClients[j] := activeClients[i]; end else k := random(noOfCashDesks) + 1; cashingTime := random(maxCashingTime) + 1; enQueue(cashDesks[k], cashingTime, errors); if errors then writeln('The queue of cash desk becomes too long.'); break; end; if lengthOfQueue(cashDesks[k]) = 1 then cashingLeft[k] := cashingTime + 1; dec(noOfActiveClients);

9 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 deQueue(cashDesks[k], cashingTime, errors); if errors then writeln('Program error: trying to dequeue.'); break; end; firstInQueue(cashDesks[k], cashingTime, errors); cashingLeft[k] := cashingTime;

10 Programa (5) Pilnas programos tekstas bus pateiktas internete.
{ 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.

11 Programos vykdymas D:\MIF\A&DS\_Pvz>shop_a Max number of shopping carts is 244 Pagrindinės programos pradžioje pridėjus: Randomize; D:\MIF\A&DS\_Pvz>shop_r Max number of shopping carts is 257 Max number of shopping carts is 256 Max number of shopping carts is 267 Max number of shopping carts is Ar programos rezultatai teisingi?

12 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 praleistas inc(usedShoppingCarts);

13 Grafai Grafas – aibių pora (V, L). V – viršūnių (vertex) aibė, L – briaunų (edge) aibė Briauna – atkarpa, jungianti dvi grafo viršūnes. Pografis (subgraph) – poaibis grafo briaunų bei jų viršūnių.

14 Grafai (2) Dvi viršūnės yra gretimos arba kaimyninės (adjacent), jei jos sujungtos briauna. Viršūnės Vi ir Vj yra kaimyninės, jei egzistuoja Bk=(Vi, Vj). Pvz.: A kaimyninės viršūnės yra B ir D. Plokščias arba planarinis grafas – tai grafas, kuri galima nupiešti plokštumoje (bent vienu būdu) taip, kad nė viena pora briaunų nesikirstų.

15 Grafai (3) Kelias (path) tarp viršūnių – briaunų seka, prasidedanti vienoje viršūnėje ir besibaigianti kitoje viršūnėje. Paprastas kelias (simple path) – kelias, per kiekvieną jam priklausančią viršūnę einantis tik po vieną kartą. Pvz., kelias ADCBCE nėra paprastas kelias, nes per viršūnę C eina du kartus. Ciklas (cycle) – paprastas kelias, kuris prasideda ir baigiasi toje pačioje viršūnėje. Pvz., ABCDA.

16 Grafai (4) Jungus grafas (connected) – jei egzistuoja kelias tarp bet kurių viršūnių porų. Pilnas grafas (complete) – jei yra briauna tarp kiekvienos viršūnių poros. Aišku, kad pilnas grafas taip pat yra ir jungus, tačiau jungus grafas nebūtinai yra pilnas. Kiek briaunų gali būti tarp 2 viršūnių?

17 Grafai su svoriais Grafas su svoriais (weighted) – grafas, kurio briaunos turi skaitines reikšmes (svorius).

18 Lankas –briauna, turinti kryptį.
Orientuoti grafai Lankas –briauna, turinti kryptį. Orientuotas grafas (directed) – grafas su lankais (visos briaunos turi kryptį). Kiek lankų gali būti tarp 2 viršūnių?

19 Orientuoti grafai (2) Pvz.: Knygų skolinimasis: A iš B pasiskolino 100 knygų, o B iš A pasiskolino 50 knygų. Visi apibrėžimai, kurie buvo taikomi neorientuotiems grafams, taip pat tinka ir orientuotam grafui. Pvz.: Orientuotas kelias yra seka lankų tarp dviejų viršūnių. Būtina pastebėti, kad orientuotame grafe galima situacija: A yra kaimynas B, bet B – nėra A kaimynas.

20 ADT Grafas Pagrindinės operacijos su grafais kaip ADT:
Sukurti tuščią grafą. Įdėti/išmesti viršūnę. Įdėti/išmesti briauną tarp viršūnių V1 ir V2. Sužinoti (rasti), ar yra kelias tarp viršūnių V1 ir V2. Sužinoti (V1, V2) svorį. Pakeisti (V1, V2) svorį.

21 Yra du dažniausiai naudojami grafų realizavimo būdai:
Grafo realizavimas Yra du dažniausiai naudojami grafų realizavimo būdai: kaimynystės matrica kaimynystės sąrašai Abiem atvejais patogiausia įsivaizduoti, kad viršūnės numeruojamos 1, 2 ir taip toliau iki N.

22 (dažniausiai nesimetriška matrica)
Kaimynystės matrica Kaimynystės matrica grafui be svorių su N viršūnių yra N iš N loginis masyvas A toks, kad A[i, j] yra teisingas tada ir tik tada, kai egzistuoja briauna iš viršūnės ‘i’ į viršūnę ‘j’. Pagal susitarimą A[i, i] yra klaidingas. Įsidėmėtina, kad kaimynystės matrica neorientuotam grafui yra simetriška, tai yra A[i, j] = A[j, i]. Neorientuotas grafas Orientuotas grafas (simetriška matrica) (dažniausiai nesimetriška matrica)

23 Kaimynystės matrica (2)
Kai turim grafą su svoriais, yra patogu, kad A[i, j] būtų briaunos iš viršūnės ‘i’ į viršūnę ‘j’ svoris. Tada A[i, j] žymima ∞, kai nėra briaunos iš viršūnės ‘i’ į viršūnę ‘j’. Be to, įstrižainės A[i, i] reikšmės lygios 0.

24 Kaimynystės sąrašai Kaimynystės sąrašas grafo iš N viršūnių, kurios numeruojamos 1, 2, …, N, susideda iš N sujungtų sąrašų. Jei grafas yra su svoriais, tai jie saugomi kartu su viršūnę. Pvz.:

25 Grafo realizacijų palyginimas
Dvi dažniausiai naudojamos grafų operacijos yra: Duotos dvi viršūnės ‘i’ ir ‘j’; rasti, ar yra briauna iš ‘i’ į ‘j’. Rasti visas viršūnes, kurios yra kaimynės duotajai viršūnei Vi Jei grafas yra netoli pilno grafo, tai masyvas yra efektyvesnis už sąrašą. Jei briaunų mažai, tai lieka daug nepanaudotos vietos matricoje, kas yra minusas taupant, tuomet geriau sąrašas.

26 Klausimai ?


Download ppt "Algoritmai ir duomenų struktūros (ADS)"

Similar presentations


Ads by Google