Размещение ресурсов (оптимальная стратегия) - PullRequest
7 голосов
/ 01 марта 2011

Я знаю, что это не совсем то место, где можно задать этот вопрос, но, возможно, мудрый парень сталкивается и находит решение.

Я пытаюсь написать компьютерную игру, и мне нужен алгоритм для решения этого вопроса:

В игру играют 2 игрока. У каждой стороны есть 1000 долларов. Есть три «коробки», и каждый игрок записывает сумму денег, которую он собирается поместить в эти коробки. Затем эти суммы сравниваются. Кто бы ни положил больше денег в коробку, получает 1 очко (если каждый получит по пол-очка). Тот, кто наберет больше очков, выигрывает у своих оппонентов 1.000 долларов. Пример игры:

Игрок A: [500, 500, 0] Игрок Б: [333, 333, 334]

Игрок A побеждает, потому что он выиграл Box A и Box B (но проиграл Box C).

Вопрос: Какова оптимальная стратегия размещения денег?

У меня есть еще вопросы (связанные с алгоритмом, а не по математике), но мне нужно сначала узнать ответ на этот вопрос.

Обновление (1): После еще одного исследования я узнал, что такого рода проблемы / игры называются Игры полковника Блотто . Я приложил все усилия и нашел несколько (очень технических) документов по этому вопросу. Короче говоря, проблема, которую я имею (как описано выше), называется простой Blotto Game (только три поля битвы с симметричными ресурсами). Трудные - это, скажем, более 10 полей сражений с несимметричными ресурсами. Все документы, которые я прочитал, говорят, что простую игру Blotto легко решить. Дело в том, что на самом деле никто из них не говорит, что это за «простое» решение.

Обновление (2): Я написал небольшой файл ActionScript, чтобы продемонстрировать стратегию в статье, упомянутой Томом Сиргедасом. Вы можете проверить это в megaswf . Инструкции: Нажмите на точку внутри треугольника. Красная область представляет выигрышные случаи. Синяя область представляет проигрышные случаи, крошечные беловатые линии представляют ничью.

Ответы [ 3 ]

4 голосов
/ 03 марта 2011

Я нашел оптимальную стратегию в этой статье: http://www.rand.org/pubs/research_memoranda/2006/RM408.pdf

Давайте назовем эту стратегию Блотто.

enter image description here

Посмотрите на диаграмму выше.Любое ваше движение может быть представлено точкой на треугольнике.Стратегия в документе гласит, что нужно выбрать произвольную точку в шестиугольнике.Выберите точки ближе к краю шестиугольника с большей вероятностью (0 вероятностей для центра шестиугольника и линейно масштабируйте до максимальной вероятности на контуре шестиугольника. Каждая точка на контуре шестиугольника имеет равную вероятность.)

Это решение для «непрерывного» блотто, но я предполагаю, что вас интересует дискретный случай (разделение N войск на 3 группы).Применение стратегии Блотто к дискретному случаю работает отлично, когда N кратно 3. Для других значений N я смог сделать небольшую корректировку на границе шестиугольника, которая работает очень хорошо, но не идеально.

Если есть стратегия, которая может победить эту, должен быть какой-то статический ход, который выигрывает у стратегии Блотто.Их нет, за исключением случаев, когда N не кратно 3, поэтому кажется, что ход на линии, где встречаются большой треугольник и шестиугольник (например, ход <0, .5, .5>), выиграет у стратегии Блотто немного больше, чем проиграть.Для N = 100 разница, по-видимому, составляет менее 1% и продолжает уменьшаться для больших N.

Код для реализации стратегии Блотто:

// generate a random number in the range [0,x) -- compensate for rand()%x being slightly un-uniform
int rnd( int x ) { int r; while ( 1 ) { r = rand(); if ( r < RAND_MAX/x*x ) return r % x; } }

// distance from center of triangle/hexagon to (x,y,z), multiplied by 3 (trilinear coordinates)
int hexagonalDist3( int x, int y, int z, int N ) { return max(max(abs(N-x*3),abs(N-y*3)),abs(N-z*3)); }

void generateRandomSimpleBlottoMove( int& x, int& y, int& z, int totalTroops )
{
   int N = totalTroops;
   while ( true )
   {
      x = rnd(N+1);
      y = rnd(N+1);
      z = N-x-y;

      // keep only moves in hexagon, with moves closer to the border having higher probability
      double relativeProbabilityOfKeepingThisMove = hexagonalDist3(x,y,z,N) > N ? 0 : hexagonalDist3(x,y,z,N);

      // minor adjustment for hexagon border when N is not a multiple of 3 -- not perfect, but "very close"
      if ( N % 3 != 0 && hexagonalDist3(x,y,z,N) == N ) 
         relativeProbabilityOfKeepingThisMove = N*(N%3)/3; 

      // possibly keep our move 
      if ( rnd(N) < relativeProbabilityOfKeepingThisMove )
         break;
   }
}
0 голосов
/ 01 марта 2011

Мне кажется, было бы довольно легко доказать, что в этой игре нет чистого равновесия Нэша.Чистая стратегия является фиксированной, например, [333, 333, 344].Мой набросок доказательства таков:

Для любой чистой стратегии, сыгранной игроком A, игрок B может найти другую чистую стратегию, которая получает B 2 очка.Например, если A воспроизводит [500,500,0], то B воспроизводит [501,0,499], или если A воспроизводит [333,333,334], то B воспроизводит [500,500,0] и так далее.Всегда есть способ получить 2 балла.Конечно, это означает, что игрок A получит 1 очко.

Аналогично, для любой стратегии, сыгранной игроком B, игрок A может найти другую чистую стратегию, которая получает его 2. Таким образом, чистого Нэша не существует.

Кроме того, я думаю, что можно доказать, что стратегия (для обоих) составляет

1/3 [500,500,0], 1/3 [500,0500], 1 /3 [0,500,500]

(игра [500,500,0] с вероятностью 1/3 и [500,0500] с вероятностью 1/3 и [0,500,500] с вероятностью 1/3) представляет собой смешанное равновесие Нэша для этогоигра.Согласно этой стратегии их ожидаемый выигрыш (#points) составляет 3/2.Доказательство кажется мне трудоемким.Может быть, у кого-то еще будет простое доказательство.

Смешанный Нэш настолько близок к «оптимальному», насколько мы можем получить.Возможно, есть и другие смешанные равновесия Нэша для этой игры.

0 голосов
/ 01 марта 2011

Таким образом, на самом деле это вопрос теории игр (экономика), а не дискретная математическая задача, перемаркировка вашего вопроса может привлечь внимание, которое вы хотите. В теории игр идея «решения» обычно равна равновесию по Нэшу . для игр с нулевой суммой оказывается, что алгоритм, который вы хотите решить, является задачей линейного программирования. Посмотрите эту википедию страницу , чтобы узнать, как ее настроить.

...