Премини към съдържанието

Препоръчан отговор


Здравейте. Имам да правя една задача за намиране на най-кратък път от една точка до друга като могат да се слагат препядствия, които трябва да се заобикалят. Намерих на C++ един алгоритъм на Дейкстра и се опитах да го напиша на Visual Basic, но дава някаква грешка, която не мога да разбера.
Това е на C++ алгоритъма на Дейкстра (функцията):

void Dijkstra(int node)
{
    int min_dist, i;
        for(i = 1; i <= V; i++)
        {
            if(ARRR == i)
            {
            dist = MAX_VALUE;
            visited = 0;
            }
        }
    dist[node] = 0;
    for(;;)
    {
        min_dist = MAX_VALUE;
        for(i = 1; i <= V; i++)
            if(ARRR == i)
        {
            if(dist < min_dist && !visited)
            {
                node = i;
                min_dist = dist;
            }
        }
        if(min_dist == MAX_VALUE)
            return;
        visited[node] = true;
        for(i = 1; i <= V; i++)
        if(ARRR == i)
            if(a[node] && (dist > dist[node] + a[node]))
            {
                dist = dist[node] + a[node];
                parent = node;
            }
    }
}

А това е функцията за извеждане на пътя:
 

void printWay(int node)
{
    if(parent[node] != from)
    {
        printWay(parent[node]);

        cout << parent[node] << " ";
        Put[h] = parent[node];
        h++;
    }
}

Аз с моите познания написах това на Visual Basic:
 

' algoritym na dijkstra
    Public Function dijkstra(ByVal node As Integer) As Integer

        Dim i As Integer

        For i = 1 To V = 100 Step 1
            If ARRR(i) = i Then
                dist(i) = MAX_VALUE
                visited(i) = 0
            End If
        Next

        dist(node) = 0

        Do
            min_dist = MAX_VALUE

            For i = 1 To V = 100 Step 1
                If ARRR(i) = i Then

                    If dist(i) < min_dist And Not visited(i) Then
                        node = i
                        min_dist = dist(i)
                    End If
                End If
            Next


            If min_dist = MAX_VALUE Then
                Return

            End If

                visited(node) = True

                For i = 1 To V = 100 Step 1
                    If ARRR(i) = i Then
                        If rebra(node, i) And dist(i) > dist(node) + rebra(node, i) Then
                            dist(i) = dist(node) + rebra(node, i)
                            parent(i) = node
                        End If
                    End If
                Next
        Loop While True

    End Function


    ' funkciq s koqto she izvejdam pytq
    Public Function printWay(ByVal node As Integer)
        If parent(node) <> fromm Then

            printWay(parent(node))
            ButtonsAll(node).BackColor = Color.Black
            Put(broqch) = parent(node)
            broqch = broqch + 1
        End If
    End Function 

Направих карта от бутони, които при натискате излиза един Inputbox, от който избирам какво да въведа ( препядствие, път или стока). Целта е да примерно да тръгна от 1 до 35 като заобикалям зелените и червените квадратчета. Въвел съм и стойностите на ребрата. Само тези 2 функции ми правят проблеми. Гледам да го напиша кода възможно най-просто понеже нямам големи познания затова не ползвам много функции. Ще се радвам ако някой помогне.  Благодаря предварително. :) 
 

1.jpg

2.jpg

kod na programata .txt

Редактирано от capnemo (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ми то си пише! Във VB функциите задължително трябва да връщат стойност! В твоя случай функцията не връща нищичко, даже няма return стейтмънт. Замени функцията с процедура и грешката ще изчезне, а функционалността ще остане :)

 

Успех!

  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Златен си бате. Изчезнаха грешките освен една. Поне така го казва, че извършва безкраен цикъл (рекурсия). Защо така не мога да разбера понеже във C++ работи. И има някакъв конфликт с единия масив parent(). Ако и това кажеш как да го оправя направи си върха. :)

3.jpg

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Глей ся! Ракурсия имаш! Условие за излизане също имаш! Номера е, че условието не се изпълнява никога! Защо, не знам. Нито знам каква е стойността на fromm с която инициализираш от текст бокса, нито каква карта си задал - нито какъв път е проанализирал алгоритъма, за да мога знам къде се дъни условието. Тук ще трябва да си копаеш сам. Пускаш дебъгера и почваш да лазиш ред по ред, да сравняваш стойностите на променливите и да анализираш. По-добър начин няма. Това, което мога да ти подхвърля на прима виста, е warning-а в Error List-а долу! Идентификатора parent е вече използван в базовия клас. А в пустото условие за изход от ракурсията използваш точно parent. На твое място това би било първото нещо, което ще проверя. Преименувай в твоя код внимателно и навсякъде parent, (примерно) на parent1 и се пробвай да запуснеш програмката наново. Ако не стане пускай дебъгера.

 

Успех!

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Направих си сам тази част, която намира най-краткия път от точка до точка. Сега обаче стигнах до друг проблем. Гледам на клипчетата в интернет след като провлачат таблицата с готовите полета им излизат готови бутони а на мен не ми излизат. Ако някой се е сблъсквал с този проблем да пише как да го е решил. В интернет намирам само как се правят един по един. Струва ми се безмислено да се правят един по един  при положение, че може да се с едно приплъзване да се създадат всички. Благодаря предварително.
 

butoni.jpg

butoni2.jpg


Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход


×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.