watanizm Ответов: 2

Задача алгоритма Дейкстры


у меня есть программа, которая используется для алгоритма Дейкстры..она работает правильно, но есть проблема в этом приложении.
он может найти кратчайший путь.
ПРИМЕР
--------------------------
Количество Узлов : 6 (0,1,2,3,4,5)

моя программа может найти кратчайший путь между 0 и 5, но она не может найти между 4 и 5, 2,5 или 1,4...и т. д..
---------------------------
есть ли кто-нибудь, кто может помочь в этом?

for (i = 1; i < sayac; ++i)
         {
             EKM[i] = ebas;
             ead = 0; 
         }
         for (i = 0; i < sayac; ++i)
         {
             for (j = 0; j < sayac; ++j)
                 if (elealindi[j] == 0)
                     if (graph[ead, j] != -1) 
                         if (EKM[j] > graph[ead, j] + EKM[ead])
                         {
                             EKM[j] = graph[ead, j] + EKM[ead];
                             System.String.Concat(ROTA[j], ROTA[ead]);
                             ptr = ROTA[j];
                             while (ptr == null)
                                 ++ptr;

                             ptr = Convert.ToChar('A' + ead);
                             Label2.Text = Label2.Text + "  " + ROTA[j];
                             dij_saving();
                         }
             ek = ebas;
             for (j = 1; j < sayac; ++j)
                 if (elealindi[j] == 0)
                     if (EKM[j] < ek)
                     {
                         ek = EKM[j];
                         ead = j;

                     }
             elealindi[ead] = 1;
         }


Что я уже пробовал:

Нахождение кратчайшего пути от одного узла к другому..

2 Ответов

Рейтинг:
1

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но к более ранним стадиям вы придете позже): тестирование и отладка.

Начните с рассмотрения того, что он делает и чем это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его-он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он где-то здесь:
private int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поставить точку останова на строке:
for (i = 0; i < sayac; ++i)

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он совершенствуется только при использовании!

Да, я, наверное, мог бы сказать вам, в чем "проблема" - но сделать это самому несложно, и в то же время вы узнаете что-то действительно стоящее!


BillWoodruff

"Думаю, что в процессе развития как писать письмо"

Это запоминается:)... и оставил меня гадать, какой процент моего кода является спамом.

OriginalGriff

В твоем случае-ни одного!
У некоторых наших членов дело обстоит на 100% ...
- Я? Я примерно на 10% спам из-за того, что стучу по поводу AOMEI Backuper :смех:

Рейтинг:
0

Patrice T

Цитата:
он работает правильно, но в этом приложении есть проблема.
Проблема означает, что приложение работает неправильно.

Ваш код snipset нам не подходит, он использует вещи, которые мы не знаем, и я не вижу, как вы говорите начальную и конечную точки, которые хотите.

Мой единственный возможный совет-отладчик.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]