Algorytm mrówkowy - Stack overflow

0

Witam. Napisałem algorytm mrówkowy z problemem komiwojażera. Ściągam plik ze współrzędnymi miast o wielkości 101 punktów - wszystko pięknie działa, ale w przypadku większych plików (280 miast) wyskakuje błąd "Stack Overflow". W czym rzecz?

Plik ze współrzędnymi o nazwie a280.tsp.gz

1

Policz ile to w bajtach:

    int tab[MAX_MIASTA], sciezka[MAX_MIASTA];
    double odleglosc[MAX_MIASTA][MAX_MIASTA];
    double feromon[MAX_MIASTA][MAX_MIASTA];

i to na stosie.

1

A thread's assigned stack size can be as small as a few dozen kilobytes. Allocating more memory on the stack than is available can result in a crash due to stack overflow.

http://en.wikipedia.org/wiki/Stack-based_memory_allocation

In software, a stack overflow occurs when the stack pointer exceeds the stack bound. The call stack may consist of a limited amount of address space, often determined at the start of the program.

http://en.wikipedia.org/wiki/Stack_overflow

0

Tzn? Nie za bardzo rozumiem co masz na myśli _13th_Dragon. Mam stworzyć stos i umieszczać na nim te elementy? Nie da się tego jakoś prościej obejść?

0

Utwórz te tablice dynamicznie (np. użyj vectora)

0

Korzystałem z new/delete, ale też marny skutek. Vectorów nigdy nie używałem. Dużo zmian w kodzie musiałbym wprowadzić?

0
class algMrowka {
public:
    int obecneMiasto, nastepneMiasto, sciezkaIndex, najDrogaIndex;
    vector<double> tab, sciezka;
    double dlugoscDrogi, najDroga;
    vector<vector<double> > odleglosc; //[MAX_MIASTA][MAX_MIASTA];
    vector<vector<double> > feromon; // [MAX_MIASTA][MAX_MIASTA];
 
public:
    void inicjalizacja() {
        int skad, dokad;
        ifstream plik;
        plik.open(NAZWAPLIKU);
 
        odleglosc = vector<vector<double> >(MAX_MIASTA, vector<double>(MAX_MIASTA));
        feromon = vector<vector<double> >(MAX_MIASTA, vector<double>(MAX_MIASTA, INIT_FEROMON));
        
        //tworzenie miasta
        for(skad=0; skad<MAX_MIASTA; skad++) {
            plik >> miasta[skad].x;
            plik >> miasta[skad].y;
        }
       ...

Ogólnie nie jest źle, największy problem to to, że za dużo próbujesz umieścić w jednej metodzie i nadmiernie stosujesz zmienne globalne.

0

1>c:\users\niesuch\documents\visual studio 2010\projects\mrowka\mrowka\mrowkojad.cpp(162): warning C4244: 'argument' : conversion from 'double' to 'unsigned int', possible loss of data
1>c:\users\niesuch\documents\visual studio 2010\projects\mrowka\mrowka\mrowkojad.cpp(162): warning C4244: 'argument' : conversion from 'double' to 'unsigned int', possible loss of data
1>c:\users\niesuch\documents\visual studio 2010\projects\mrowka\mrowka\mrowkojad.cpp(218): warning C4244: '=' : conversion from 'double' to 'int', possible loss of data
1>c:\users\niesuch\documents\visual studio 2010\projects\mrowka\mrowka\mrowkojad.cpp(219): warning C4244: '=' : conversion from 'double' to 'int', possible loss of data
1>c:\users\niesuch\documents\visual studio 2010\projects\mrowka\mrowka\mrowkojad.cpp(222): warning C4244: '=' : conversion from 'double' to 'int', possible loss of data
1>c:\users\niesuch\documents\visual studio 2010\projects\mrowka\mrowka\mrowkojad.cpp(223): warning C4244: '=' : conversion from 'double' to 'int', possible loss of data
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

for(int mrowka=0; mrowka<MAX_MROWEK; mrowka++) {
            for(int i=0; i<MAX_MIASTA; i++) {        
                if(i<MAX_MIASTA-1) {
                    skad=mrowki[mrowka].sciezka[i];
                    dokad=mrowki[mrowka].sciezka[i+1];
                }
                else {
                    skad=mrowki[mrowka].sciezka[i];
                    dokad=mrowki[mrowka].sciezka[0];
                }

                feromon[skad][dokad]+=(100/mrowki[mrowka].dlugoscDrogi);
                feromon[dokad][skad]=feromon[skad][dokad];
            }
        } 
0

user image

         //inicjalizacja mrowek
        dokad=0;
        for(int mrowka=0; mrowka<MAX_MROWEK; mrowka++) {
            if(dokad==MAX_MIASTA)
                dokad=0;

            mrowki[mrowka].obecneMiasto=dokad++;

            for(skad=0; skad<MAX_MIASTA; skad++) {
                mrowki[mrowka].tab[skad]=0;
                mrowki[mrowka].sciezka[skad]=-1;
            }

            mrowki[mrowka].sciezkaIndex=1;
            mrowki[mrowka].sciezka[0]=mrowki[mrowka].obecneMiasto;
            mrowki[mrowka].nastepneMiasto=-1;
            mrowki[mrowka].dlugoscDrogi=0;
            mrowki[mrowka].tab[mrowki[mrowka].obecneMiasto]=1;
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1