Mustaqil ish Mavzu


Deykstra algoritmini dasturiy ta'minotini amalga oshirish


Download 337.1 Kb.
bet2/2
Sana03.06.2020
Hajmi337.1 Kb.
#113752
1   2
Bog'liq
algoritm mustaqil ish

Deykstra algoritmini dasturiy ta'minotini amalga oshirish.

Algoritmni dasturiy ta'minotini amalga oshirish uchun ikkita massiv kerak bo'ladi: mantiqiy toifadagi visited - tashrif buyurilgan tugunlar haqidagi ma'lumotlarni saqlash uchun va topilgan eng qisqa yo'llar kiritiladigan butun toifadagi - distance. G={V,E} graf berilgan bo’lsin. V to’plamga tegishli barcha tugunlar dastlab tashrif buyurilmagan deb belgilanadi, ya’ni visited massivining elementlariga false qiymat berib chiqiladi. Eng afzal yo’lni topish masalasi qaralyapti. Distance massivining har bir elementiga shunday qiymat beriladiki, ixtiyoriy potensial yo’ldan katta bo’lsin (odatda, bu qiymatni cheksiz katta qiymat deb qaraladi, ammo dasturda berilgan toifaning qiymatlar diapazonidagi eng katta qiymat sifatida olinadi). Boshlang'ich nuqta sifatida s tugun tanlanadi va unga nol yo'l belgilanadi: distance [s] = 0, chunki s-dan s-gacha hech qanday qirra yo'q (bu usulda ilmoqlar qaralmaydi).

Shundan keyin, barcha qo'shni tugunlar topiladi (s dan chiquvchi qirralar orqali) [ularni t va u deb belgilaylik] va ular birma-bir tekshirib ko'riladi, ya'ni s tugundan har bir tugungacha birma-bir marshrut bahosi hisoblanadi:

- distance[t]=distance[s]+ s va t orasidagi qirraning vazni;

- Distance[u]=distance[s]+ s va u orasidagi qirraning vazni.

Ehtimoldan xoli emaski, u yoki bu tugunga s dan bir qancha yo’llar bo’lishi mumkin. Shu sababli, distance massivida bu tugunga bo’lgan yo’lning vaznini qayta ko’rib chiqish kerak bo’ladi. Shunda kattaroq (nooptimal) qiymat yo’qotiladi va tugunga mos yo’lning vazniga kichikroq qiymat beriladi. s tugun bilan qo’shni bo’lgan va qarab chiqilgan tugunlar tashrif buyurilgan sifatida belgilab chiqiladi, yani visited[s]=true va natijada, s dan chiquvchi, minimal vaznga ega bo’lgan yo’l eltuvchi tugun faol element sifatida belgilab olinadi. Faraz qilamiz, s dan u gacha masofa t ga qaraganda qisqa bo’lsin. Kelib chiqadiki, u tugun faollashadi va yuqoridagi kabi uning qo’shnilari ( s dan tashqari) o’rganilib chiqiladi. u tugun tashrif buyurilgan deb belgilanadi: visited[u]=true, endi t tugun faollashadi va yuqoridagi prosedura uning uchun takrorlanadi. Deykstra algoritmi s tugundan borish mumkin bo’lgan barcha tugunlar tadqiq qilinmaguncha davom ettiriladi.



Deykstra algoritmining tadbiqi

Grafning og’irligini saqlash uchun kvadrat matritsadan foydalaniladi. Satrlar va ustunlar sarlavhalarida grafning uchlari joylashadi. Graf yoylarining og’irligi jadvalning ichki yacheykalariga joylashtiriladi. Graf petlyaga ega emas, shu sababdan ham matritsaning asosiy diagonalida nol qiymatlar joylashgan.

C++ ga tadbiqi

#define _CRT_SECURE_NO_WARNINGS


#include 
#include 
#define SIZE 6
int main() {
  int a[SIZE][SIZE]; 
  int d[SIZE];
  int v[SIZE]; 
  int temp, minindex, min;
  int begin_index = 0;
  system("chcp 1251");
  system("cls");
  for (int i = 0; i   {
    a[i][i] = 0;
    for (int j = i + 1; j
      printf(" deykstra %d - %d: ", i + 1, j + 1);
      scanf("%d", &temp);
      a[i][j] = temp;
      a[j][i] = temp;     }   }
  for (int i = 0; i   {
    for (int j = 0; j
      printf("%5d ", a[i][j]);
    printf("\n");   }
  for (int i = 0; i   {
    d[i] = 10000;
    v[i] = 1;   }
  d[begin_index] = 0;
  do {
    minindex = 10000;
    min = 10000;
    for (int i = 0; i
    { 
      if ((v[i] == 1) && (d[i]
      { 
        min = d[i];
        minindex = i;    }     }
    if (minindex != 10000)     {
      for (int i = 0; i       {
        if (a[minindex][i] > 0)         {
          temp = min + a[minindex][i];
          if (temp < d[i])           {
            d[i] = temp;     }         }       }
      v[minindex] = 0;     }
  } while (minindex < 10000);
  printf("\n doimiy \n");
  for (int i = 0; i
    printf("%5d ", d[i]);
  int ver[SIZE]; 
  int end = 4; // nВывод кратчайшего пути = 5 - 1
  ver[0] = end + 1; 
  int k = 1; 
  int weight = d[end]; 
  while (end != begin_index)    {
    for (int i = 0; i
      if (a[i][end] != 0)          {
        int temp = weight - a[i][end]; 
        if (temp == d[i]) 
        {               
          weight = temp; 
          end = i;       
          ver[k] = i + 1; 
          k++;
        }
      }
  }
  printf("\nВывод кратчайшего пути\n");
  for (int i = k - 1; i >= 0; i--)
    printf("%3d ", ver[i]);
  getchar(); getchar();
  return 0; }

Dastur bajarilgandan keyin olingan natija
Download 337.1 Kb.

Do'stlaringiz bilan baham:
1   2




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling