Koło ruletki SI - inny wynik niż przedstawiony

0

Nie ogarniam koła ruletki. Dajmy na to mam tablicę struktur, (index, prawdopodobienstwo).

Nr osobnika

w populacji Prawdopodobieństwa
3 0.05
1 0.15
4 0.3
5 0.5
2 1
i teraz mam zrobić coś takiego:

wylosować liczbę double z przedzuału [0,1] i pobrać indeks osobnika w populacji, który jako ostatni (w tablicy) ma prawdopodobieństwo mniejsze niż wylosowan. Wynik powinien być taki:

    3          1            4            5          2
0    0.05         0.15        0.3         0.5        1

gdzie najlepiej przystosowany jest osobnik z indeksem 2, najmniej z 3.

Zrobiłem coś takiego:

<code class="cpp">srand((unsigned)time(NULL));
double r = ((double) rand() / (double)(RAND_MAX));

vector<int> indeksy;
for(int i=0; i<size; i++)
{
    if(pi[i].prawdopodobienstwo < r)
    indeksy.push_back(i);
}
ale wynik jest inny, niż ten przedstawiony -.-


<span style="color: gray"><i>`wstawienie danych do tabeli oraz dodanie znacznika <code> - fp`</i></span>
0
srand(time(0));
vector<int> indeksy;
...
while(...)
  {
   double r=rand()/(double)RAND_MAX;
   int i=0;
   while((i<size)&&(pi[i].prawdopodobienstwo<r)) ++i;
   indeksy.push_back(i);
  }
0

nie mogę zrozumieć 1-go while. Do kiedy mam to wykonywać?

0

Hmm, dostaję powtarzalne indeksy, a wydaje mi się, że nie powinny się powtarzać ... przynajmniej dla tego przykładu tak jest. Ja napisałem takie coś:

bool isin(vector<int> indeksy, int i)
{
    for(int j=0; j<indeksy.size(); j++)
        if(indeksy[i] == i)
            return true;
    return false;
}

srand(time(0));
    vector<int> indeksy;
    int j = 0;
    while(j<size)
    {
        double r=rand()/(double)RAND_MAX;
        int i=0;

        while(!isin(indeksy, i))
        {
            while((i<size)&&(pi[i].prawdopodobienstwo<r)) ++i;
            indeksy.push_back(i);
            j++;
        }
    }

ale programm myśli dość długo i nic z tego nie wynika :-/

0

srand(time(0)); masz odpalić raz na początku programu.

To co podałeś nie może działać.
Powiedz co chcesz uzyskać?
Przy ruletce wybierasz parę rodziców i z nich tworzysz obiekt potomny.
Więc te pary losujesz niezależnie.
Jeden osobnik może uczestniczyć w każdej parze i to z niczym nie koliduje.
Ba nie ma problemu że jeden osobnik będzie tworzył parę sam ze sobą.

0

Ja rozumiem krzyżowanie, mutację, selekcję, wszystko to już napisałem sobie. Mam problem tylko ze zrozumieniem tej ruletki. Do tej ostatniej tabeli (wraz z nią) wszystko zrobiłem, ale nie rozumiem od momentu "wylosuj liczbe [0,1] typu double" : http://www.pdfonlinereader.com/WebPdf2/editor.html

0

double r=rand()/(double)RAND_MAX; - wylosuj liczbe [0,1] typu double
Pod linkiem jakiś szajs.

0

Tzn. ja wiem, jak wylosować liczbę double, zrobiłem to już ;) bardziej chodzi mi o dalszą część zadania. Tu treść: http://speedy.sh/6YaWn/kolo-ruletki.pdf.

0
   double r=rand()/(double)RAND_MAX; // wylosuj liczbe [0,1] typu double
   int i=0;
   while((i<size)&&(pi[i].prawdopodobienstwo<r)) ++i; // wyliczmy numer osobnika w
populacji, który jako ostatni (w tablicy) ma skumulowane prawdopodobieństwo mniejsze
niż wylosowane
  return i; // zwracamy ... j.w. ...

Z tym że ten algorytm jest kompletnie bezsensowny, jak masz tablice przed pierwotną:
1 -> 20
2 -> 100
3 -> 10
4 -> 30
5 -> 40
Czyli trzeba teraz znaleźć sumę drugiej kolumny (200) po czym każdy element podzielić na tą sumę i wyjdzie ci ta tablica pierwotną (z PDF);
To od razu możemy losować:

int main()
  {
   srand(time(0));
   double tb[]={20,100,10,30,40};
   vector<double> Tb(tb,tb+sizeof(tb)/sizeof(*tb)); // przed-pierwotna w postaci wektora
   double Sum=0;
   for(vector<double>::iterator i=Tb.begin();i!=Tb.end();++i) Sum+=*i; // Suma elementów
   while(true) // do <ctrl-C>
     {
      double r=Sum*rand()/RAND_MAX; // losujemy 0 <= r < Sum
      vector<double>::iterator i=Tb.begin();
      while((i+1!=Tb.end())&&((r-=*i)>0)) ++i; // na każdym kroku zmniejszamy `r` o Tb[i], koniec jeżeli `r` mniejsz lub równa 0
      cout<<(i-Tb.begin())<<' '<<*i<<endl; // wynik kolejnego losowania
     }
   return 0;
  }

pisane z palca

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