[C#] Sieć neuronowa

0

Witajcie mam problem wydaje mi się, że tkwi w GC czyli smieciarce, moja funkcja to:

private void dodajDane()
        {
            neurony = new List<Neurony>();
            for (int i = 0; i < Convert.ToInt32(ileNeuronow.Value); i++)
            {
                neurony.Add(new Neurony(Convert.ToInt32(temp[i,0]), temp[i,1], temp[i,2], temp[i,3]));
            }
            wygrany();
            //MessageBox.Show(We1.Text + " " + We2.Text);
            wektory.Add(new Wektory(Convert.ToInt32(wektor.Text), Convert.ToDouble(We1.Text), Convert.ToDouble(We2.Text), neurony, zwyciezca[1], "Neuron" + zwyciezca[0].ToString()));
        }

Mianowicie, gdy wstawiam MessageBox.Show(We1.Text + " " + We2.Text); to program dodaje mi nowe wylosowane wejscia x1 i x2 lecz gdy tego nie ma tylko 1 je dodaje a pozniej sa jednakowe plz help... co mam nie tak, co mogę zrobić.

0

Aj ja się <ort>niezgodze </ort>że problem leży w mechanizmie GC. Ten MessageBox tez bogu ducha winny.

I albo dopadł mnie <ort>wturny </ort>analfabetyzm, albo za żywiołowo opisałeś swój problem i nic a nic z tego zakumać nie można, ten fragmencik kodu tez z kosmosu, jak używasz tablic i własnych metod dobrze by było jakbyś ich treść także przytoczył. No i jakoś bardziej po ludzku to opisz, bo jak dla mnie to jest kompletnie niezrozumiałe.

0

Daj jakiś prostszy kod, w którym występuje ten sam błąd, bo to raczej ciężko będzie rozkminić bez komentarzy i/lub większej ilośc kodu.

0

ok zaczne od tego losowanie jest cykliczne i wyglada tak

private void losujZmienne()
        {
            Random losuj = new Random();
            double we1 = losuj.Next(int.Parse(x1Min.Value.ToString()), int.Parse(x1Max.Value.ToString()));
            double we2 = losuj.Next(int.Parse(x2Min.Value.ToString()), int.Parse(x2Max.Value.ToString()));
            We1.Text = we1.ToString();
            We2.Text = we2.ToString();
            if (_pozycja == 0 && wektor.Text == "0")
            {
                for (int i = 0; i < Convert.ToInt32(ileNeuronow.Value); i++)
                {
                    temp[i, 0] = i + 1;
                    temp[i, 1] = losuj.Next(int.Parse(w1Min.Value.ToString()), int.Parse(w1Max.Value.ToString()));
                    temp[i, 2] = losuj.Next(int.Parse(w2Min.Value.ToString()), int.Parse(w2Max.Value.ToString()));
                    temp[i, 3] = odleglosc(we1, we2, temp[i, 1], temp[i, 2]);
                }
            }

private double odleglosc(double x1,double x2,double w1, double w2)
        {
            double wynik = Math.Sqrt(Math.Pow((x1-w1),2)+ Math.Pow((x2-w2),2));
            return wynik;
        }


gdy neuron sie uczy odpalana jest funkcja rekurencyjna

do
            {
                losujZmienne();
                //MessageBox.Show(We1.Text + " " + We2.Text);
                for (int i = 0; i < Convert.ToInt32(ileNeuronow.Value); i++)
                {
                    we1 = double.Parse(We1.Text);
                    we2 = double.Parse(We2.Text);
                    temp[i, 0] = i + 1;
                    if (i + 1 != int.Parse(wektory[_pozycja - 1].Zwyciesca.Replace("Neuron", "")))
                    {
                        temp[i, 1] = wektory[_pozycja - 1].Neurony[i].W1;
                        temp[i, 2] = wektory[_pozycja - 1].Neurony[i].W2;
                    }
                    else
                    {
                        temp[i, 1] = wyliczWezly(true, i);
                        temp[i, 2] = wyliczWezly(false, i);
                    }
                    temp[i, 3] = odleglosc(we1, we2, temp[i, 1], temp[i, 2]);
                }
                zmienStatus();
                dodajDane();
                _cykl++;
                
            } while (_cykl < Convert.ToInt32(NUD.Value));

<ort>otóż </ort>problem jest w momencie gdy odznaczam // w jednym z tych dwóch miejsc przed MessageBox.Show... wyobraz sobie ze mam rowniez tabele przebiegow wszystko dziala pięknie i szybko, ale z malym wyjątkiem podczas pierwszego cyklu losuje wszystkie zmienne ok jest dobrze, drugi cykl juz nie polega na losowaniu o opiera sie na wczesniejszych obliczeniach ok wszystko pieknie, ale w drugim cyklu powinny mi sie zmienic wejscia x1 i x2 ktore losuje w funkcji losuj i to tez dziala, ale w tabeli pokazuja mi sie wkolo te same x1 i x2 z drugiego cyklu. Gdy wstawie MessageBox wtedy co cykl musze klikac ok i jestem pewien ze sie zmieniaja, zagladam do tablicy przebiegu i wszystko sie pozmienialo. Tzn wszystko dziala tak jak powinno łącznie z wejsciami. A gdy MessageBox nie ma wejscia sa stale. Czyli nasuwa mi się jeden pomysł mianowicie, że to co jest w tych textboxach jest umieszczane w jakiejs pamieci podrecznej gdy wchodze do tej funkcji i robie to w pętli i uzywa tylko tych z pamieci.

Ehh... teraz jaśniej ?? Plz help, pierwszy raz spotykam sie z czyms takim i nie wiem jak to ugryzc

0

Witam!

Próbowałeś wywołać funkcję w osobnym wątku? (BackgroundWorker)

0

Jeszcze tego nie próbowałem. Która z tych funkcji twoim zdaniem powinienem wstawić w wątki ?? Możesz wesprzeć mnie kawałkiem kodu ??

0

Rozpocznij od stworzenia delegacji dla funkcji: losujZmienne, zmienStatus, dodajDane.
Następnie umieść pętle "do while" w zdarzeniu "DoWork" kontrolki BackgroundWorker.
...powodzenia :)

0

Obawiam się, że <ort>nie które</ort> wątki będą <ort>zachaczały </ort>o wspolne dane :/ ale mniej pośpie i może się uda :D

Jak ktoś ma inne pomysły, np jak zabrać z pamięci te zmienne i wstawić nowe, żeby w kolejnych powtórzeniach wejścia były zmienne piszcie, będę wdzięczny. Respect

0

si3ma napisał:

wątki będą zachaczały o wspolne dane

Rozwiązanie jest proste: synchronizacja. Polecam te dwa artykuły: artykuł1, artykuł2. W pierwszym artykule jest dość ogólnie o samych wątkach i o podstawach synchronizacji, a w drugim jest sama synchronizacja(dokładniej).</url>

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