Algorytm genetyczny

0

Witam

Mam dwa proste pytania , które nasuneły mi się podczas pisania w/w algorytmu . ( nie proste dla mnie =) )

-chciałbym ustalić procentową część ruletki w zależności od dostosowania, jeżeli wartościami wynikowymi funkcji dostosowania byłoby 3,2,1 dla 3 osobników to dla pierwszego osobnika częścią ruletki byłoby : 3/6 * 100% ale mnie interesuje sytuacja odwrotna
Jak określić gdy im mniejsza wartość tym lepsze dostosowanie i większa część ruletki?

-gdy już otrzymam podzielone koło ruletki , to jaką najprostszą metodę proponujecie do zasymulowania losowania?

Pozdrawiam i dziękuje za pomoc

0

Ad. 1 i 2
Jak policzyć część ruletki proporcjonalną do dostosowania które im mniejsze tym lepsze.

a = dostosowanie
b = 1 / (1 + a)
b[i] = zbiór wartości dostosowania (b)
n = liczba osobników
s[k] = suma(i=1..k, b[i]) = suma dla osobnika k

  1. Losujemy liczbę p w zakresie od 0.. s[n]
  2. Szukamy w pętli dla i=1..n takiego s[i] że s[i] <= p
  3. Znalezione i to wylosowany element

Na pewno to gdzieś znajdziesz w sieci.

0

Coś tam znalazłem na dysku:

#include <iostream>
#include <vector>
#include <numeric>
#include <cstdlib>

using namespace std;

template<class T>
class Roulette
{
    public:
    typedef double probability_t;
    typedef T value_type;
    typedef pair<value_type, probability_t> item_type;
    typedef vector<item_type> items_type;

    Roulette() :
            sum(0)
    {
    }

    void clear()
    {
        sum = 0;
        items.clear();
    }

    void add(const value_type& value, probability_t probability = 1)
    {
        items.push_back(item_type(value, probability));
        sum += probability;
    }

    value_type& random()
    {
        const probability_t u = rand() * sum / RAND_MAX;
        probability_t r = 0;
        for(typename items_type::iterator it = items.begin(); it != items.end(); ++it)
        {
            r += it->second;
            if(r >= u) return it->first;
        }

        return items.back().first;
    }

    private:
    probability_t sum;
    items_type items;

};

int main()
{
    Roulette<size_t> roulette;

    const size_t size = 5;
    const double prob[size] = {0.5, 0.2, 0.1, 0, 0.2};
    double sum = 0;
    sum = accumulate(prob, prob + size, sum);
    unsigned tab[size] = {};

    for(size_t i = 0; i < size; ++i)
        roulette.add(i, prob[i]);

    unsigned N = 100000;
    for(unsigned i = 0; i < N; ++i)
        ++tab[roulette.random()];

    for(size_t i = 0; i < size; ++i)
        cout << prob[i] / sum * N << ": " << tab[i] << endl;

    return 0;
}

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