problem z tablicami (kopiowanie?)

0

Witam,

Jestem w trakcie pisania programu opartego na algorytmie genetycznym. Chciał bym zaznaczyć, iż większość problemów rozwiązuje sam, ale nad tym problem spędziłem już tyle czasu, że nie mam do niego siły. Mam nadzieje, że będziecie potrafili i chcieli mi pomóc bo ja już straciłem nadzieję że to pójdzie.

 private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            double[] rates = new double[200];     //tablica ocen
            int[][] parents;                                 //chromosomy dla dzieci
            int[][] children;                                 //chromosomy rodzicow
            int i;
            int j;
            double[] tmpRates = new double[20];
            parents = new int[10][];
            for (i = 0; i < 10; i++)
            {
                parents[i] = new int[1000];
            }
            children = new int[20][];
            for (i = 0; i < 20; i++)
            {
                children[i] = new int[1000];
            }

            for (i = 0; i < 10; i++)
            {
                for (j = 0; j < 1000; j++)
                {
                    parents[i][j] = Convert.ToByte(rand.getr.NextDouble()); //losowe chromosomy poczatkowe
                }
            }

            int firstXOpoint;
            int secondXOpoint;
            for (int u = 0; u < 200; u++)   //glowna petla - w niej robiony jest cross over
            {
                for (i = 0; i < 5; i++)
                {
                    firstXOpoint = rand.getr.Next(500);
                    secondXOpoint = 500 + rand.getr.Next(500);
                    for (j = 0; j < firstXOpoint; j++)                      //4 dzieci z dwojki rodzicow
                    {
                        children[4 * i][j] = parents[2 * i][j];
                        children[4 * i + 1][j] = parents[2 * i + 1][j];
                        children[4 * i + 2][j] = parents[2 * i + 1][j];
                        children[4 * i + 3][j] = parents[2 * i][j];
                    }
                    for (j = firstXOpoint; j < secondXOpoint; j++)
                    {
                        children[4 * i][j] = parents[2 * i + 1][j];
                        children[4 * i + 1][j] = parents[2 * i][j];
                        children[4 * i + 2][j] = parents[2 * i + 1][j];
                        children[4 * i + 3][j] = parents[2 * i][j];
                    }
                    for (j = secondXOpoint; j < 1000; j++)
                    {
                        children[4 * i][j] = parents[2 * i][j];
                        children[4 * i + 1][j] = parents[2 * i + 1][j];
                        children[4 * i + 2][j] = parents[2 * i][j];
                        children[4 * i + 3][j] = parents[2 * i + 1][j];
                    }
                }
                for (j = 0; j < 20; j++)
                {
                    tmpRates[j] = chrom.rate(children[i]);    //obliczanie oceny dla nowych dzieci
                }
                int index;
                double value;
                for (i = 0; i < 10; i++)  //zwykle sortowanie, wczesniej bylo na List'ach i metoda Sort()
                {                                 //ale w akcie desperacji i ze strachu przed plytkim kopiowaniem
                    index = 0;                //zamienione na zwykle tablice
                    value = tmpRates[0];
                    for (j = 1; j < 20; j++)
                    {
                        if (tmpRates[j] < value)
                        {
                            value = tmpRates[j];
                            index = j;
                        }
                    }
                    for (j = 0; j < 1000; j++)
                    {
                        parents[i][j] = children[index][j];    //najlepsze dzieci staja sie rodzicami
                    }
                    tmpRates[index] = double.MaxValue;
                }
                rates[u] = chrom.rate(parents[0]);         //wpisanie oceny do tablicy zawierajacej oceny dla
                                                                           //kazdej iteracji algorytmu
            }
        }

Jak widzicie jest to / ma to byc algorytm genetyczny. Program sie kompiluje. Z jakiegos jednak powodu bardzo szybko sie wyrzaza (wszystkie chromosomy, czyli tablice children i parents sa takie same), niemalze natychmiast (2, 3 iteracje). Na poczatku populacja jest rozna a potem jakby nagle, w wyniku łączenia w pary i przypisywania stawała się jednolita.

Początkowo program ten miał zaimplementowany zaawansowany algorytm genetyczny, 7 klas z interfejsami ICloneable i takie tam, po kilku dniach szukania błędu sprowadził się do malutkiego programiku z kilkoma tablicami typu byte (int tez byl testowany :D) a problem nadal pozostał.
Jak tak dalej pójdzie to program przepisze w czystym C albo jeszcze lepiej asemblerze.

Please help!

0

użyj debugera - tyle Ci mogę napisać bez ślęczenia kilka godzin z debugerem samemu.

0

O ile dobrze pamiętam z lekcji biologii, to AA+aa zawsze daje Aa, więc to normalne, że zaczynają dominować gatunki jednego rodzaju.

1.A tak serio, to moja propozycja: zrób sobie małą populację, wypisz jak ona wygląda przed CO(crossing over), po CO i korzystając ze standardowego drzewa i kalkulatora zobacz, czy problem tkwi w programie, czy w algorytmie.
2.Co to jest "rand.getr". Być może zrobiłeś klasyczny błąd z nadmiernym stosowaniem konstruktora obiektu Random. Random powinien być jeden dla całego programu, bo inaczej zamiast random wychodzi ci constans
3.Sprawdź, czy gdzieś nie wychodzisz poza granice tablic.

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