·ê·¿ÈÙ ¼±ÅÃ

´Ù¸¥ Å©±âÀÇ ±¸°£¸¶´Ù ·£´ýÇÏ°Ô ¼±Åà ÇÒ ¼ö ÀÖ´Â ¾Ë°í¸®ÁòÀ» »ý°¢Çغ¸ÀÚ.
±¸°£ Å©±â°¡ Ŭ¼ö·Ï ¼±ÅÃµÉ È®·üÀÌ ³ô´Ù.
À¯Àü ¾Ë°í¸®ÁòÀÇ ·ê·¿ÈÙ ¼±Åà ¾Ë°í¸®ÁòÀÌ À§ÀÇ Á¶°ÇÀ» ¸¸Á·ÇÑ´Ù.

±âº» ¾Ë°í¸®ÁòÀº ·ê·¿¿¡¼­ ƯÁ¤ ¿µ¿ªÀ» ¼±ÅÃÇϴ°Ͱú °°´Ù.

point = random( 0, sumOfFitnesses);

sum = 0;

 

for i = 0 to n-1

{

    sum = sum + fi;

    if(point < sum)

        return i;

}

fi : ¿°»öü iÀÇ ÀûÇÕµµ
sumOfFitnesses : ¸ðµç ¿°»öüµéÀÇ ÀûÇÕµµ
¹Ýȯ°ª : i´Â ¿°»öü·Î ¾î´À ¿µ¿ªÀÎÁö ¾Ë¼ö ÀÖ´Ù.

 

stl::mapÀ¸·Î Ç¥ÇöÇÏ¸é ´ÙÀ½°ú °°´Ù. Wheel::Add½Ã ù ¹ø° ¸Å°³º¯¼ö´Â ·ê·¿ ¹üÀ§ÀÇ Å©±âÀÌ´Ù. Wheel::SpinÀº ·ê·¿ÀÌ ¸ØÃß¾úÀ» ¶§ Áö½ÃÇÏ´Â ¿µ¿ªÀÇ °ªÀ» ¸®ÅÏÇÑ´Ù.
SpinÀº ¿µ¿ªÀ» ¹þ¾î³­ °ªÀ̸é -1À» ¸®ÅÏÇÑ´Ù.

#include <map>

 

struct WheelComp

{

    bool operator()(const std::pair<int, int>& a, const std::pair<int, int>& b)

    {

        if(b.first == -1)

        {

            if(b.second >= a.first && b.second < a.second)

                return false;

            return (b.second >= a.second);

        }

 

        if(a.first == -1)

        {

            if(a.second >= b.first && a.second < b.second)

                return false;

            return (a.second < b.second);

        }

        return a.first < b.first;

    }

};

 

//pair<start, end> ¹üÀ§¸¦ °¡Áø´Ù. ¹üÀ§ endÀÇ °ªÀº Æ÷ÇÔµÇÁö ¾Ê´Â´Ù.

class Wheel

{

protected:

    int m_sum;

    int m_index;

    std::map<std::pair<int, int>, int, WheelComp> m_ranges;

 

public:

    Wheel(): m_sum(0)

    {

    }

 

    void Add(int fitness, int value)

    {

        m_ranges[std::pair<int, int>(m_sum, fitness + m_sum)] = value;

        m_sum += fitness;

    }

 

    //-1À» ¸®ÅÏÇÏ¸é ¹üÀ§¸¦ ¹þ¾î³­ °ªÀÌ´Ù.

    int Spin(int random)

    {

        if(random >= m_sum) 

            return -1;

 

        return m_ranges.find(std::pair<int, int>(-1, random))->second;

    }

};

 

 

void main()

{

    Wheel wheel;

    wheel.Add(10, 10); //0~10 ¹üÀ§

    wheel.Add(90, 100); //10~100 ¹üÀ§

    wheel.Add(900, 1000); //100~1000 ¹üÀ§

    wheel.Add(9000, 10000); //1000~10000 ¹üÀ§

 

    int n9 = wheel.Spin(10);

    int n90 = wheel.Spin(90);

    int n900 = wheel.Spin(900);

    int n9000 = wheel.Spin(9000);

    int nx = wheel.Spin(10000);

}

 

ÂüÁ¶)
½±°Ô ¹è¿ì´Â À¯Àü ¾Ë°í¸®Áò 03-01 ¼±Åà ¿¬»ê
http://guido.vonrudorff.de/c-roulette-wheel-selection-using-map-or-boost/