Алгоритм, необходимый для решения проблемы строительных блоков - PullRequest
2 голосов
/ 16 февраля 2010

Рассмотрим следующий сценарий:

  1. У нас есть несколько последовательных строительных блоков (например, 12 строительных блоков , упорядоченных от 1 до 12), распределенных случайным образом (но не обязательно одинаково) по ряду строителей (например, 3 строителя). ).
  2. Строители обязаны работать по порядку и начинать возведение стены из блока № 4 в обе стороны; до блока № 1 или до блока 12.
  3. Каждый строитель не знает, какие номера блоков могут иметь другие строители, хотя он знает, сколько.
  4. Строители должны сначала попытаться закончить, не давая другим сделать ходы. Они не должны проходить и должны размещать блок, если могут. Любой строитель, который заканчивает все свои блоки сначала, получит самую высокую награду, затем второй и так далее ...

Можем ли мы предсказать, кто финиширует первым, вторым и последним? Есть ли какой-то алгоритм, которому строители должны следовать, чтобы сначала выполнить свою работу?

Ниже приведен практический пример проблемы:
Давайте скажем:

builder 1 has: b2 b5 b8 b9
builder 2 has: b1 b11
builder 3 has: b3 b4 b6 b7 b10 b12

строитель 1, и строитель 2 должен будет ждать строителя 3, чтобы поместить b4.
строитель 3 поместит b4 и вернет свое место строителю 1.

wall: b4

строитель 1 должен будет поставить b5, так как других вариантов для него нет.

wall: b4 b5

строитель 2 будет следовать, но он не может разместить свои блоки, ему придется ждать b2 или b10.
у строителя 3 теперь есть два варианта: b3 или b6, он должен выбрать тот, который поможет ему финишировать первым.

wall: b4 b5 b6

Строителю 1 нечего делать, он передаст свою очередь Строителю 2.
строитель 2 все еще ждет установки b2 или b10.
Строителю 3 придется разместить б7.

wall: b4 b5 b6 b7

строитель 1 теперь разместит b8.

wall: b4 b5 b6 b7 b8

строитель 2 все еще терпеливо ждет ...
строитель 3 вынужден отложить b3, так как других вариантов нет, он надеялся, что строитель 2 может поставить b9 ... но его надежда угасла!

wall: b3 b4 b5 b6 b7 b8

строитель 1 теперь полностью отвечает, и я чувствую себя очень счастливым! но он в замешательстве! подумав, он решил, что b2 может позволить ему продолжать предотвращать большее количество блоков, что, в свою очередь, увеличивает его шанс.

wall: b2 b3 b4 b5 b6 b7 b8

строитель 2 говорит: наконец-то! какое-то действие! и места b1.

wall: b1 b2 b3 b4 b5 b6 b7 b8

строитель 3 потерял надежду, став первым!
Строитель 1 теперь установит свой последний блок и отправится домой с самой большой наградой!

wall: b1 b2 b3 b4 b5 b6 b7 b8 b9

строитель 2 будет ждать ...
строитель 3 печально местами б10
Строитель 2 места b11 и идет домой со второй наградой ...

Какой-нибудь известный алгоритм решения таких задач?

Ответы [ 4 ]

3 голосов
/ 16 февраля 2010

На первый взгляд сила игрока является функцией диапазона, охватываемого его самыми высокими и самыми низкими блоками. В вашем примере игры мы видим, что Builder 1 полностью доминирует над Builder 2.

Builder 1:            2 ----------- 9   
Builder 2:          1 ----------------- 11
Builder 3:              3 --------------- 12

Start position:           ^^

Так как игра начинается на b4, самые важные фигуры находятся на верхнем уровне. Например, у Builder 3 есть b3, что предотвращает 2 других хода (b2 и b1); однако, это не очень решающее. Блок b3 по своей способности предотвращать b2 и b1 обладает такой же мощью, как b5, что предотвращает b6 и b7.

Реальная сила лежит на правой стороне диаграммы выше . Это означает, что игры с начальными начальными диапазонами, изображенными выше, обычно заканчиваются так: Строитель 1, Строитель 2, а затем Строитель 3.

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

Например, предположим, что стена находится на b3-b4-b5, а вы держите b2, b6 и b9. Вы можете играть либо на b2, либо на b6. Как вы оцениваете свои произведения?

b2 score = 1 (prevents b1)
b9 score = 3 (prevents b10, b11, b12)
b6 score = 2 (prevents b7, b8)

Обратите внимание, что b6 не получает кредит за предотвращение b10 и выше, потому что b9 выполняет эту работу (Matthieu M. также делает это замечание). В этом сценарии вы предпочитаете сначала играть на b2, потому что это подвергает вас наименьшему риску финиша другого игрока.

Другие ответы породили интересные идеи о нежелании помешать вашему собственному прогрессу, предлагая сначала сыграть в b6. Но я не думаю, что можно что-то получить, если ускорить движение к b9. Вы хотите отложить b9 как можно дольше, потому что именно эта часть дает вам наибольшую страховку (с вероятностной точки зрения) от предотвращения финиша других игроков.

Обновление:

Я написал симуляцию Perl для проверки нескольких простых стратегий игроков. Я начинаю задумываться, не имеет ли стратегия игрока никакого значения. Я попробовал следующее: (а) выбрать самый высокий блок; (б) выбрать самый нижний блок; и (c) моя рекомендуемая стратегия выбора наиболее безопасного блока (который предотвращает большинство ходов других). Я оценил стратегии, присуждая 3 балла за 1-е место, 2 за 2-е и 1 за 3-е. Ни одна из этих стратегий не работала неизменно лучше (или хуже), чем случайный отбор.

Конечно, можно придумать сценарии, в которых выбор игрока влияет на результат. Например, если блоки распределены таким образом, игрок 3 получит 1-е или 2-е место.

b1  b2  b3  b4  b5  b6  b7  b8  b9  b10  b11  b12
2   1   3   1   3   2   2   2   2   2    2    2

Однако, с вероятностной точки зрения, это изменение в результате может быть упрощено до следующего: игрок 3 выиграет, если не выберет блок рядом с игроком, у которого остался только один блок. Другими словами, точный результат - бросок монеты.

Итак, вот вопрос: Может ли кто-нибудь представить сценарий с исходом, который не предопределен и не подброшен? Я пытался около 15 минут, а потом мне стало скучно.

2 голосов
/ 16 февраля 2010

Это одномастный вариант карточной игры Семерки - он также носит другие названия; Я слышал это широко называется Fan Tan.

Возможно, вы захотите найти в Интернете алгоритмы для этого.

p.s. Это пахнет как домашнее задание. В таких обстоятельствах считается вежливым использование тега «домашнее задание».

1 голос
/ 16 февраля 2010

Так как у меня еще не было точности, давайте начнем с (разумного) предположения, что если вы можете играть, то вы должны. Приятно, чтобы игра не зависала.

Из-за правил у вас есть 0, 1 или 2 хода. Вы можете выбрать, только когда вы находитесь в 2 решении ходов.

1. Дерево решений

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

Например, предположим, что мы находимся в состоянии:

wall = [3, ..., 8]
b1 = [2,9]
b2 = [1,11]
b3 = [10,12]

И вот b1 превращается в игру.

b1[2] -> b2[1] -> b3[] -> b1[9] (1st) -> b3[10] -> b2[11] (2nd) -> b3[12]
 or
b1[9] -> b2[] -> b3[10] -> b1[2] (1st) -> b2[1] -> b3[] -> b2[11] (2nd) -> b3[12]
                                           or
                                          b2[11] -> b3[12] (2nd) -> b2[1]

Итак, в основном у нас есть 2 варианта в части дерева.

  1. b1 может выбирать между 2 и 9
  2. b2 может выбирать между 1 и 11

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

Итак, давайте представим сокращенную версию дерева (где мы показываем только варианты):

b1[2] -> [1,2,3]
b1[9] -> b2[1] -> [1,2,3]
b1[9] -> b2[11] -> [1,3,2]

Теперь мы можем применить уменьшенное представление, основанное на данном игроке.

Для b1 дерево выглядит так:

[2,9] -> [1,1] (both are equivalent)

Для b2 это выглядит так:

[1,11] -> [2,3]

Для b3 выбора не бывает ...

2. Возможные результаты

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

Обратите внимание, например, что в этом поддереве у нас есть 2 варианта, второй из которых зависит от первого. Если у нас Pi(x in {x,y}) выражается вероятность того, что игрок i выберет x при выборе между x и y, то мы можем выразить вероятности каждого исхода.

P([1,2,3]) = P1(2 in {2,9}) + P1(9 in {2,9}) * P2(1 in {1,11})
P([1,3,2]) =                  P1(9 in {2,9}) * P2(11 in {1,11})

3. Стратегия игроков

Из того, что мы видим здесь, видно, что лучшая стратегия состоит в том, чтобы попытаться заблокировать как можно больше фигур: т.е. при выборе между 1 и 11 вам лучше сыграть 1, потому что это не блокировать никого, пока 11 блокирует 1 шт. Однако это работает только тогда, когда у вас до 2 штук.

Нам нужно что-то более общее для случая, когда у вас есть список частей.

Например, если вы держите {3, 9, 11}, а стена - [4, ..., 8], что вы должны поставить? Очевидно, 3 блокирует меньше фигур, чем 9, но 9 блокирует одну из ваших частей!

Лично я бы пошел на 9 в этом случае, потому что мне все равно нужно будет поместить 11 и 11 блокировать меньше кусков, чем 33 у меня есть шанс закончить первым , с 11 это менее вероятно ...).

Я думаю, что могу дать оценку каждой фигуре в моей руке, в зависимости от количества фигур, которые они блокируют:

3 -> 2
9 -> 1
11 -> 1

В то время как 9 приписывается только 1? Потому что он блокирует только 10, так как я держу 11:)

Тогда я сначала сыграю фигуру с наименьшим количеством очков (если у меня есть выбор).

1 голос
/ 16 февраля 2010

@ FM прав - чем больше кусков вы блокируете своих врагов, тем лучше ход. Однако есть и другая часть стратегии, которая там не рассматривается.

Подумайте, есть ли у вас B3, B7 и B11. Предположим, что B3 и B7 в настоящее время являются законными ходами. (Вы находитесь в достаточно хорошем положении. Поскольку у вас нет ни B12, ни B1, вы не можете занять третье место.)

Выбор B3 означает, что вы открываете только B1 и B2, поэтому это лучший ход по стратегии FM.

Однако, не ставя B7, вы откладываете возможную игру B10, которая необходима для победы. B7, вероятно, лучший ход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...