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

намиране на най-кратък път

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


    Здравейте. Имам да правя една задача за намиране на най-кратък път от една точка до друга като могат да се слагат препядствия, които трябва да се заобикалят. Намерих на 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


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


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

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

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

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

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

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

    Вход

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

    Вход


    ×

    Информация

    Този сайт използва бисквитки (cookies), за най-доброто потребителско изживяване. С използването му, вие приемате нашите Условия за ползване.