lichtenstein,Struktury danych i złożoność obliczeniowa,Badanie efektywności algorytmów grafowych w zależności od rozmiaru instancji oraz sposobu reprezentacji grafu w pamięci komputera


Wrocław,

Struktury danych i złożoność obliczeniowa.

Projekt 2

Temat: Badanie efektywności algorytmów grafowych w zależności od rozmiaru instancji oraz sposobu reprezentacji grafu w pamięci komputera.

1. Cele.

Implementacja 4 algorytmów, Prima i Kruskala wyznaczające minimalne drzewo rozpinające oraz Dijkstry i Forda-Bellmana wyznaczające najkrótszą ścieżkę w grafie. Każdy algorytm implementowany w dwóch wersjach, działający na macierzy i na liście. Następnie zbadanie czasu działania algorytmów dla różnych rozmiarów grafów oraz różnych gęstości.

2. Szczegóły implementacyjne.

2. 1. Generowanie grafu.

Graf jest generowany zgodnie z rozkładem zbliżonym do równomiernego. Najpierw losujemy drzewo rozpinające, a następnie pozostałe krawędzie. Jednocześnie sprawdzając czy nie wystąpiły cykle. Sposób zapobiegania cyklom opisany poniżej (detekcja cykli). Generowany graf jest zapisywany w formie listy a następnie przepisywany do macierzy. Dzięki temu można sprawdzać szybkość działania algorytmu dla dokładnie tego samego grafu.

2. 2. Implementacja listy.

Aby uprościć działanie lista zawiera nie tylko następniki czy poprzedniki, ale wszystkie wierzchołki, z którymi jest połączony dany wierzchołek. Do reprezentacji węzła w grafie zastosowaliśmy strukturę, gdyż może ona przechowywać więcej informacji niż np. liczba całkowita (int). Struktura wygląda następująco:

struct Pole

{

int sas;

int obc;

int nast;

int num;

};

Gdzie poszczególne zmienne oznaczają:

sas - numer w danej liście,

obc - obciążenie,

nast - zawiera informację czy dany wierzchołek jest następnikiem, czy poprzednikiem,

num - numer wierzchołka w grafie.

Odczytywanie danych z listy polega na odnalezieniu odpowiedniego wierzchołka, o którym chcemy uzyskać informację za pomocą indeksu, a następnie przesuwając się przy użyciu iteratora po liście mamy dostęp do poszczególnych jej elementów.

[0] -> lista0

[1] -> lista1

.

.

[N] -> listaN

0 - N to numer wierzchołka, a lista0 do listaN to następniki oraz poprzedniki danego wierzchołka. Mówiąc językiem programistów jest to tablica wskaźników na listy zawierające struktury typu Pole.

2. 3. Implementacja macierzy.

Macierz jest zaimplementowana jako tablica wskaźników na tablice typu int, gdzie w wierszach znajdują się następniki, a w kolumnach poprzedniki.

2. 4. Metody detekcji cykli.

Tworzymy tabelke w którą wpisujemy na początku numery wszystkich wierzchołków każdy wierzchołek traktujemy jako oddzielny graf. Gdy wylosujemy pierwszy graf zmieniamy numery jego wierzcholkow na numer ostatniego grafu ze wszystkich losowanych a numer ostatniego na numer pierwszego z wylosowanych  po czym zmniejszamy zmienna s oznaczajaca iczbe grafow (ta operacja sluzy mozliwosci wylosowania dowolnego grafu z grafow poza wylosowanym jako pierwszy) nastepnie losujemy drugi graf i zmieniamy jego numer na numer pierwzego z wylosowanych numer  grafu o numerze rownym (na ten moment) s+1 rowniz zmieniamy na numer grafu pierwszego a numer grafu o numerzer grafu pierwszego z wylosowanych zmieniamy na numer drugiego z wylosowanych. Jest to potrzebne aby zapewnic prawidlowosc kolejnych losowan (w tabeli z numerami grafow nie moze byc dziur). Jezeli drugi z wylosowanych grafow ma \w chwili losowania numer grafu wylosowanego jako pierwszy to nie trzeba wykonywac ponownych zamian numerow. Wystarczy zamienic numer grafu o numerze s + 1 na numer pierwszego wylosowanego grafu (lub tez jesli ktos woli drugiego gdyz sa to te same numery). 

3. Informacje dotyczące języka oraz sprzętu na którym wykonywany jest eksperyment.

Program został napisany w języku C++ oraz skompilowany w kompilatorze DevC++. Doświadczenie wykonaliśmy na komputerze z procesorem Pentium Dual-Core T4300 2x2.10 GHz. Komputer posiada 3GHz pamięci RAM.

4. Algorytmy znajdujące minimalne drzewo rozpinające.

4. 1. Pod względem rozmiaru grafu.

0x01 graphic

Rysunek 1

0x01 graphic

Rysunek 2

0x01 graphic

Rysunek 3

0x01 graphic

Rysunek 4

Z powyższych wykresów wynika, że najmniej wydajnym algorytmem w zależności od ilości wierzchołków jest algorytm Kruskala działający na macierzach, a najwydajniejszym algorytm Prima działający również na macierzach. Zatem oba algorytmy lepiej spisują się na macierzach niż na listach. Zauważmy jednak, że w przypadku przeprowadzenia eksperymentu na grafach o tej samej gęstości, jednak różnych rozmiarach najwydajniejszym okazuje się algorytm Kruskala dla list, a najmniej wydajny jest alg. Prima macierzy. W tym przypadku oba algorytmy lepiej spisują się na listach. Gdy zmienia się tylko rozmiar grafu a nie jego gęstość należy zastosować algorytm Kruskala, a dane przechowywać w liście, w przeciwnym razie lepszym rozwiązaniem jest macierz i alg. Prima.

4. 2. Pod względem gęstości grafu.

0x01 graphic

Rysunek 5

0x01 graphic

Rysunek 6

0x01 graphic

Rysunek 7

0x01 graphic

Rysunek 8

0x01 graphic

Rysunek 9

W przypadku badania pod względem gęstości grafu można zaobserwować dwa wyniki. Na Rysunk 5 najwolniejszym jest algorytm Kruskala dla list, jednak na pozostałych wolniej działa na macierzach. Zatem w przypadku grafów o małej ilości wierzchołków lepiej przechowywać dane w macierzy, a dla większych przejść na listy. Jeszcze lepszym rozwiązaniem jest algorytm Prima, gdyż nie trzeba się troszczyć o rozmiar grafu, ponieważ działa on identycznie dla wszystkich rozmiarów, jest znacznie szybszy od Kruskala, a najszybszy, gdy dane są umieszczone w macierzy. Czas jego działania nie zmienia się wraz ze wzrostem gęstości, zatem można powiedzieć, że nie jest od niej zależny.

4. 3. Tabele z wynikami (podstawa do sporządzenia wykresów).

n

k

gęstość

K-L[ms]

K-M[ms]

P-L[ms]

P-M[ms]

100

200

2

4

6

4

7

100

200

2

4

6

5

7

100

200

2

3

5

7

7

100

200

2

5

5

4

7

100

200

2

4

6

9

7

średnia

4

5,6

5,8

7

100

1180

11,8

46

34

12

8

100

1180

11,8

45

33

10

8

100

1180

11,8

94

33

9

8

100

1180

11,8

56

31

9

8

100

1180

11,8

40

32

10

8

średnia

56,2

32,6

10

8

100

2160

21,6

69

69

14

8

100

2160

21,6

69

72

14

9

100

2160

21,6

160

58

13

8

100

2160

21,6

69

57

13

8

100

2160

21,6

69

62

13

9

średnia

87,2

63,6

13,4

8,4

100

3140

31,4

108

90

18

9

100

3140

31,4

99

87

17

8

100

3140

31,4

100

84

17

9

100

3140

31,4

99

84

31

9

100

3140

31,4

98

83

17

8

średnia

100,8

85,6

20

8,6

150

300

2

10

18

16

23

150

300

2

11

18

16

23

150

300

2

10

19

18

23

150

300

2

9

18

15

32

150

300

2

10

18

16

24

średnia

10

18,2

16,2

25

150

2520

16,8

94

173

30

24

150

2520

16,8

101

148

29

23

150

2520

16,8

97

149

27

24

150

2520

16,8

95

147

28

25

150

2520

16,8

94

147

29

24

średnia

96,2

152,8

28,6

24

150

4740

31,6

277

275

41

25

150

4740

31,6

276

275

42

25

150

4740

31,6

276

274

42

25

150

4740

31,6

289

291

53

27

150

4740

31,6

291

322

53

28

średnia

281,8

287,4

46,2

26

150

6960

46,4

400

465

80

27

150

6960

46,4

401

456

72

26

150

6960

46,4

393

417

56

24

150

6960

46,4

330

400

58

23

150

6960

46,4

332

401

65

24

średnia

371,2

427,8

66,2

24,8

200

400

2

17

41

33

53

200

400

2

16

43

34

54

200

400

2

17

45

35

59

200

400

2

17

42

33

53

200

400

2

17

41

32

54

średnia

16,8

42,4

33,4

54,6

200

4360

21,8

220

464

68

54

200

4360

21,8

219

451

68

54

200

4360

21,8

224

450

64

54

200

4360

21,8

226

452

64

54

200

4360

21,8

219

443

64

53

średnia

221,6

452

65,6

53,8

200

8320

41,6

528

848

105

55

200

8320

41,6

533

840

103

55

200

8320

41,6

533

842

104

55

200

8320

41,6

531

841

103

55

200

8320

41,6

534

839

106

55

średnia

531,8

842

104,2

55

200

12280

61,4

869

1231

140

53

200

12280

61,4

876

1232

141

55

200

12280

61,4

882

1245

142

53

200

12280

61,4

872

1238

141

53

200

12280

61,4

883

1234

142

53

średnia

876,4

1236

141,2

53,4

250

500

2

26

79

61

102

250

500

2

26

80

61

101

250

500

2

26

80

61

102

250

500

2

26

81

62

104

250

500

2

27

82

62

102

średnia

26,2

80,4

61,4

102,2

250

6700

26,8

609

1047

124

106

250

6700

26,8

610

1047

124

105

250

6700

26,8

611

1057

124

105

250

6700

26,8

610

1051

124

105

250

6700

26,8

611

1045

124

105

średnia

610,2

1049,4

124

105,2

250

12900

51,6

1346

2033

283

116

250

12900

51,6

1396

2015

221

106

250

12900

51,6

1359

2029

221

106

250

12900

51,6

1411

2018

222

106

250

12900

51,6

1379

2024

219

105

średnia

1378,2

2023,8

233,2

107,8

250

19100

76,4

1426

2979

379

98

250

19100

76,4

1440

2990

379

99

250

19100

76,4

1440

2990

372

98

250

19100

76,4

1444

2992

370

99

250

19100

76,4

1448

2996

374

99

średnia

1439,6

2989,4

374,8

98,6

300

600

2

37

137

102

174

300

600

2

36

139

102

174

300

600

2

36

139

101

175

300

600

2

36

141

102

174

300

600

2

36

138

101

174

średnia

36,2

138,8

101,6

174,2

300

9540

31,8

874

2155

224

178

300

9540

31,8

867

2156

223

179

300

9540

31,8

869

2161

226

179

300

9540

31,8

881

2150

223

178

300

9540

31,8

873

2152

226

180

średnia

872,8

2154,8

224,4

178,8

300

18480

61,6

2750

4293

461

184

300

18480

61,6

2859

4355

497

183

300

18480

61,6

2771

4218

460

177

300

18480

61,6

2753

4203

441

177

300

18480

61,6

2775

4201

443

177

średnia

2781,6

4254

460,4

179,6

300

27420

91,4

3219

6195

876

174

300

27420

91,4

3238

6247

844

174

300

27420

91,4

3225

6219

847

174

300

27420

91,4

3248

6349

837

174

300

27420

91,4

3321

6227

858

177

średnia

3250,2

6247,4

852,4

174,6

Tabela 1 Wyniki pomiarów oraz średnie.

n

k

gęstość

K-L[ms]

K-M[ms]

P-L[ms]

P-M[ms]

100

200

2

4

5,6

5,8

7

100

1180

11,8

56,2

32,6

10

8

100

2160

21,6

87,2

63,6

13,4

8,4

100

3140

31,4

100,8

85,6

20

8,6

150

300

2

10

18,2

16,2

25

150

2520

16,8

96,2

152,8

28,6

24

150

4740

31,6

281,8

287,4

46,2

26

150

6960

46,4

371,2

427,8

66,2

24,8

200

400

2

16,8

42,4

33,4

54,6

200

4360

21,8

221,6

452

65,6

53,8

200

8320

41,6

531,8

842

104,2

55

200

12280

61,4

876,4

1236

141,2

53,4

250

500

2

26,2

80,4

61,4

102,2

250

6700

26,8

610,2

1049,4

124

105,2

250

12900

51,6

1378,2

2023,8

233,2

107,8

250

19100

76,4

1439,6

2989,4

374,8

98,6

300

600

2

36,2

138,8

101,6

174,2

300

9540

31,8

872,8

2154,8

224,4

178,8

300

18480

61,6

2781,6

4254

460,4

179,6

300

27420

91,4

3250,2

6247,4

852,4

174,6

Tabela 2 Średnie zebrane w osobnej tabeli.

4. 4. Wnioski ogólne.

Algorytm Prima jest zależny od rozmiaru grafu, ale niezależny od jego gęstości. Dlatego lepiej stosować go w przypadku zmiennej gęstości grafu przy stałym rozmiarze, a dane przechowywać w macierzy. Gdyby zaszła konieczność użycia tego algorytmu przy zmiennym rozmiarze, informacje należy przerzucić do listy.

Odwrotnie jest z algorytmem Kruskala. Działa on wydajniej, gdy zmienia się, a gęstość pozostaje stała. Dlatego najlepiej stosować go dla stałych gęstości z danymi zapisanymi w liście. Gdy zajdzie konieczność wykorzystania go dla zmiennej gęstości, przed wyborem sposobu reprezentacji grafu należy zastanowić się jaki będzie jego rozmiar, ponieważ macierz jest szybsza dla małych grafów, a lista dla dużych.

5. Algorytmy znajdujące nakruszą ścieżkę w grafie.

5. 1. Pod względem liczby wierzchołków.

0x01 graphic

Rysunek 10

0x01 graphic

Rysunek 11

0x01 graphic

Rysunek 12

0x01 graphic

Rysunek 13

Z powyższych wykresów wynika, że wydajniejszy jest algorytm Dijkstry, a najwydajniejszy, gdy działa na listach. Z kolei algorytm Forda-Bellmana jest o wiele wolniejszy od poprzedniego, ale działa wydajniej, gdy ma do dyspozycji reprezentację macierzową. Wzrost czasu działania algorytmu Forda-Bellmana jest bardzo duży wraz ze wzrostem liczby wierzchołków. Niestety pierwszy wykres (Rysunek 10) daje nam dość dziwne wyniki. Powodem tego może być zastosowanie złych (zbyt małych) rozmiarów, a nagły skok czasu dla Forda-Bellmena, chwilowym obciążeniem procesora innym procesem. Zatem aby znaleźć najkrótszą ścieżkę w grafach o różnych gęstościach i różnej liczbie wierzchołków najlepiej zastosować algorytm Dijkstry, a dane przechowywać w liście. Należy jednak pamiętać, że sprawdza on się tylko w przypadku nieujemnych obciążeń, więc gdy wystąpi ujemne obciążenie należy zastosować algorytm Forda-Bellmena, a dane przepisać do macierzy, gdyż wtedy działa szybciej.

5. 2. Pod względem gęstości.

0x01 graphic

Rysunek 14

0x01 graphic

Rysunek 15

0x01 graphic

Rysunek 16

0x01 graphic

Rysunek 17

0x01 graphic

Rysunek 18

Tak samo jak w przypadku zmiennego rozmiaru algorytm Dijkstry sprawdza się lepiej. Algorytm Forda-Bellmana zachowuje się podobnie. Zmienia się jedynie tempo wzrostu czasów działania z wykładniczego na liniowe.

5. 3. Tabele z wynikami (podstawa do sporządzenia wykresów).

n

k

D-L

D-M

FB-L

FB-M

1000

2000

1

0

8

14

1000

2000

0

0

8

13

1000

2000

0

1

9

14

1000

2000

0

0

8

14

1000

2000

0

0

9

13

średnia

0,2

0,2

8,4

13,6

1000

101800

36

87

204

170

1000

101800

37

87

203

175

1000

101800

36

87

202

175

1000

101800

35

88

205

173

1000

101800

35

87

203

172

średnia

36

87,2

203,4

173

1000

201600

42

181

404

336

1000

201600

41

183

408

340

1000

201600

43

183

406

339

1000

201600

41

182

406

339

1000

201600

42

181

401

339

średnia

42

182

405

338,6

1000

301400

49

180

593

505

1000

301400

50

184

586

502

1000

301400

49

180

593

505

1000

301400

50

179

586

503

1000

301400

49

178

587

502

średnia

49

180

589

503,4

1500

3000

0

0

19

0

1500

3000

0

0

18

0

1500

3000

0

0

19

0

1500

3000

0

0

18

0

1500

3000

0

0

19

0

średnia

0

0

18,6

0

1500

227700

82

317

689

573

1500

227700

82

314

687

573

1500

227700

82

314

686

580

1500

227700

83

320

702

600

1500

227700

81

320

693

588

średnia

82

317

691,4

582,8

1500

452400

96

425

1429

1137

1500

452400

90

403

1365

1170

1500

452400

92

414

1364

1181

1500

452400

92

414

1354

1178

1500

452400

93

422

1402

1212

średnia

93

416

1383

1176

1500

677100

114

564

2136

1801

1500

677100

110

563

2136

1778

1500

677100

110

580

2092

1733

1500

677100

104

548

2090

1743

1500

677100

108

563

2076

1699

średnia

109

564

2106

1751

2000

4000

0

0

36

57

2000

4000

0

0

38

58

2000

4000

0

0

35

56

2000

4000

0

0

35

59

2000

4000

0

0

35

56

średnia

0

0

35,8

57,2

2000

403600

132

699

1658

1382

2000

403600

128

683

1653

1387

2000

403600

135

705

1656

1385

2000

403600

134

705

1662

1402

2000

403600

132

700

1665

1414

średnia

132

698

1659

1394

2000

803200

175

1121

3322

2744

2000

803200

165

1071

3317

2804

2000

803200

160

1073

3355

2859

2000

803200

176

1081

3339

2912

2000

803200

169

1109

3341

2886

średnia

169

1091

3335

2841

2000

1202800

193

1361

4823

4046

2000

1202800

192

1350

4776

4030

2000

1202800

193

1334

4863

4062

2000

1202800

190

1398

4847

3993

2000

1202800

194

1373

4920

4014

średnia

192

1363

4846

4029

2500

5000

0

1

53

84

2500

5000

0

2

54

88

2500

5000

1

1

51

85

2500

5000

0

2

53

85

2500

5000

0

2

52

85

średnia

0,2

1,6

52,6

85,4

2500

629500

206

1412

3163

2673

2500

629500

199

1398

3165

2746

2500

629500

192

1379

3161

2756

2500

629500

200

1371

3145

2732

2500

629500

200

1403

3110

2755

średnia

199

1393

3149

2732

2500

1254000

241

2214

6453

5340

2500

1254000

246

2242

6279

5384

2500

1254000

240

2209

6282

5342

2500

1254000

246

2237

6235

5322

2500

1254000

249

2220

6256

5353

średnia

244

2224

6301

5348

2500

1878500

276

2720

9273

8203

2500

1878500

299

2695

9225

8124

2500

1878500

283

2761

9264

8145

2500

1878500

285

2725

9235

8230

2500

1878500

287

2747

9242

8092

średnia

286

2730

9248

8159

3000

6000

0

0

74

0

3000

6000

0

0

77

0

3000

6000

0

0

74

0

3000

6000

0

0

75

0

3000

6000

0

0

75

0

średnia

0

0

75

0

3000

905400

292

1969

5388

4639

3000

905400

291

1992

5414

4594

3000

905400

289

2013

5387

4695

3000

905400

288

1999

5377

4712

3000

905400

283

2039

5407

4698

średnia

289

2002

5395

4668

3000

1804800

345

2609

10732

9300

3000

1804800

370

2608

10744

9269

3000

1804800

350

2610

10786

9266

3000

1804800

343

2625

10833

9302

3000

1804800

359

2578

10958

9236

średnia

353

2606

10811

9275

3000

2704200

412

4333

16216

14367

3000

2704200

417

4338

16274

14338

3000

2704200

423

4355

16125

14294

3000

2704200

414

4271

16100

14353

3000

2704200

411

4301

16164

14342

średnia

415

4320

16176

14339

Tabela 3 Wyniki pomiarów oraz średnie.

n

k

gęstość

D-L[ms]

D-M[ms]

FB-L[ms]

FB-M[ms]

1000

2000

2

0,2

0,2

8,4

13,6

1000

101800

101,8

36

87,2

203,4

173

1000

201600

201,6

42

182

405

338,6

1000

301400

301,4

49

180

589

503,4

1500

3000

2

0

0

18,6

0

1500

227700

151,8

82

317

691,4

582,8

1500

452400

301,6

93

416

1383

1176

1500

677100

451,4

109,2

563,6

2106

1750,8

2000

4000

2

0

0

35,8

57,2

2000

403600

201,8

132,2

698,4

1658,8

1394

2000

803200

401,6

169

1091

3334,8

2841

2000

1202800

601,4

192,4

1363,2

4845,8

4029

2500

5000

2

0,2

1,6

52,6

85,4

2500

629500

251,8

199,4

1392,6

3148,8

2732,4

2500

1254000

501,6

244,4

2224,4

6301

5348,2

2500

1878500

751,4

286

2729,6

9247,8

8158,8

3000

6000

2

0

0

75

0

3000

905400

301,8

288,6

2002,4

5394,6

4667,6

3000

1804800

601,6

353,4

2606

10810,6

9274,6

3000

2704200

901,4

415,4

4319,6

16175,8

14338,8

Tabela 4 Średnie zebrane w jednej tabeli.

5. 4. Wnioski ogólne.

Algorytm Dijkstry jest zdecydowanie szybszy od algorytmu Forda-Bellmana, dlatego należy go stosować zawsze, gdy nie ma potrzeby pracy na ujemnych obciążeniach. Gdy stosujemy algorytm Dijkstry dane należy wrzucać do listy, a gdy zajdzie konieczność zastosowania Forda-Bellmana najlepiej przepisać je do macierzy.

- 1 -



Wyszukiwarka

Podobne podstrony:
SDiZO5b, Struktury danych i złożoność obliczeniowa
SDiZO5a, Struktury danych i złożoność obliczeniowa
SDiZO3, Struktury danych i złożoność obliczeniowa
SDiZO2, Struktury danych i złożoność obliczeniowa
lichtenstein, struktury?nych i złożoność obliczeniowa,Badanie?ektywności algorytmów pseudowielomiano
Badanie rezystywności materiałów przewodzących w zależności od temperatury radek
ćw 1 - Badanie rezystywności materiałów przewodzących w zależności od temperatury, Politechnika Pozn
Badanie rezystywności materiałów przewodzących w zależności od temperatury aga, Politechnika Poznań
badanie rezystywności materiałów przewodzących w zależności od temperatury mazurek
Algorytmy i struktury danych 02 Rekurencja i złożoność obliczeniowa
Algorytmy i struktury danych Wykład 1 Reprezentacja informacji w komputerze
Algorytmy i struktury danych Wykład 3 i 4 Tablice, rekordy i zbiory
Algorytmy i struktury danych, AiSD C Lista04
Instrukcja IEF Algorytmy i struktury danych lab2
Algorytmy, struktury danych i techniki programowania wydanie 3
Algorytmy i struktury danych 1

więcej podobnych podstron