Найти алгоритм для баланса этой игры
Я попытался извлечь только часть проблемы, в которой у меня возникают проблемы, это часть более крупного проекта, который я делаю (а не домашнее задание). Я думаю, что это проще всего описать как игру (так как мне нужно, чтобы закончить игру, над которой я работаю). Это однопользовательская игра, как я ее описываю.
СТАРТ. Вы начинаете с одной из двух позиций:
- вес
(2,0,-1)
и один red
play
- вес
(3,1,-1)
и два red
играют
END Игра заканчивается, когда у вас больше нет пьес. Цель состоит в том, чтобы закончить игру весом (0,0,0)
.
Существует два типа воспроизведения red
и blue
. Учитывая игру, вы выбираете одну из четырех частей: A,B,C,D
, которая дает вам дополнительный вес и, возможно, дополнительные пьесы. Вот правила:
-
В режиме red
:
- Добавляет вес
(0,-2,-1)
- B добавляет вес
(1,-1,-1)
и добавляет один red
play
- C добавляет вес
(2,0,-1)
и два red
воспроизводят
- D добавляет вес
(0,2,1)
и два blue
играет
Правила для игр blue
аналогичны, но первые два столбца для весов меняются местами, а последний столбец обратный, а типы воспроизведения меняются на противоположные, поэтому вы получаете это вместо:
-
В режиме blue
:
- Добавляет вес
(-2,0,1)
- B добавляет вес
(-1,1,1)
и добавляет один blue
play
- C добавляет вес
(0,2,1)
и два blue
воспроизводят
- D добавляет вес
(2,0,-1)
и два red
играет
ВОПРОС Можно выиграть эту игру?
Я пытаюсь написать программу, которая выигрывает игру, выбирая пьесы, чтобы окончательный баланс (0,0,0)
, когда у вас больше нет пьес. Только я не могу это сделать. Так что теперь я думаю, что, возможно, нет алгоритма, чтобы выиграть игру. Мне бы очень хотелось узнать, почему это так. Если у кого-нибудь есть идеи, как я могу это доказать, тогда, пожалуйста, дайте мне знать! Или, если вы попробуете его и найдете способ выиграть, то, пожалуйста, скажите мне это тоже. Спасибо!!
Ответы
Ответ 1
Наверное, мне что-то не хватает, но, просто осмотрев, похоже, эта последовательность шагов должна работать?
- начните с "weight
(2,0,-1)
и один red
play"
- возьмите
red
play, шт C
, который добавляет вес (2,0,-1)
и два red
играет ", оставив вас с весом (4,0,-2)
и двумя играми red
.
- возьмите
red
play, шт A
, который добавляет вес (0,-2,-1)
", оставив вас с весом (4,-2,-3)
и одним red
.
- возьмите
red
play, шт D
, который добавляет вес (0,2,1)
и два blue
играет ", оставив вас с весом (4,0,-2)
и двумя играми blue
.
- возьмите
blue
play, шт A
, который добавляет вес (-2,0,1)
", оставив вас с весом (2,0,-1)
и одним blue
воспроизведением.
- возьмите
blue
play, шт A
, который добавляет вес (-2,0,1)
", оставив вас с весом (0,0,0)
и без воспроизведения.
Немного более схематично:
move weight plays
------ --------- -------
(2,0,-1) red
red C (4,0,-2) red x2
red A (4,-2,-3) red
red D (4,0,-2) blue x2
blue A (2,0,-1) blue
blue A (0,0,0) -
., нет?
Отредактировано для добавления:
Как я нашел это:
Поскольку этот вопрос вызвал большой интерес, возможно, мне следует объяснить, как я нашел вышеупомянутое решение. Это была в основном удача; Я столкнулся с двумя ключевыми наблюдениями:
-
red A
и red D
отменяют друг друга по весу (первый добавляет (0,-2,-1)
, последний добавляет (0,2,1)
) и добавляет в общей сложности две игры blue
(как из red D
), и нет red
; поэтому, если вы играете один за другим, вы "конвертируете" две игры red
в две игры blue
.
-
blue A
отменяет начальный вес (он добавляет (2,0,-1)
) и не добавляет ни одной пьесы, поэтому вся проблема может быть решена путем "преобразования" одного red
воспроизведения в одно воспроизведение blue
.
Это дало мне хорошее начало. Я начал с red C
, чтобы получить две игры red
, которые я мог бы "преобразовать" в две игры blue
, и я сразу увидел, что red C
также был "противоположным" blue A
по весу, поэтому также можно было бы отменить с помощью blue A
. В моей голове все это, казалось, полностью прекратилось; затем я записал его, чтобы убедиться.
Доказательство минимальности:
Кроме того, хотя в то время я не потрудился рассуждать, я также могу доказать, что это "минимальная" победная последовательность для этой начальной позиции — под которым я подразумеваю, что если последовательность начинается с "веса (2,0,-1)
и одного red
воспроизведения" и заканчивается весом (0,0,0)
и не играет, то последовательность должна содержать не менее пяти ходов. Для этого предположим, что у нас есть последовательность, которая соответствует этому условию и имеет менее пяти ходов. Тогда:
- Так как первый компонент веса начинается положительным, а воспроизведение no
red
уменьшает его, для последовательности потребуется хотя бы одно воспроизведение blue
, что означает, что оно обязательно будет включать red D
не реже одного раза (поскольку что единственный способ получить игру blue
, если вы не начинаете с одного).
- Поскольку последовательность включает
red D
хотя бы один раз, а red D
дает нам две игры blue
, последовательность обязательно будет включать blue
не реже двух раз (так как игра не заканчивается до тех пор, пока никакие пьесы не останутся).
- Поскольку последовательность включает
red D
не реже одного раза, а red D
добавляет 2 ко второму компоненту веса, он обязательно будет либо содержать red A
по крайней мере один раз, либо содержать red B
по крайней мере дважды ( так как нет другого способа уменьшить второй компонент веса по крайней мере на 2). Но ясно, что если он содержит red D
хотя бы один раз, blue
по крайней мере дважды, а red B
по крайней мере дважды, то он будет содержать не менее пяти ходов, что запрещено по предположению; поэтому он должен использовать подход red A
.
- Итак, последовательность содержит
red D
по крайней мере один раз, blue
не менее двух раз и red A
по крайней мере один раз. И по предположению он содержит менее пяти ходов. Таким образом, он должен состоять только из одного red D
, двух blue
s, одного red A
и ноль других ходов.
- Исходное положение дает нам только один ход
red
, и последовательность включает ровно две игры red
. Поэтому последовательность должна содержать шаг, который дает ровно один ход red
. Но единственный возможный ход, который может сделать это, - red B
, который не содержит последовательности.
Следовательно, такая последовательность невозможна.
Другая стартовая позиция:
Я также могу доказать, используя аналогичные аргументы, что любое решение, начинающееся с опции "weight (3,1,-1)
и two red
play", также должно содержать не менее пяти ходов. Одним из таких решений с пятью перемещениями является:
move weight plays
------ --------- -------
(3,1,-1) red x2
red A (3,-1,-2) red
red B (4,-2,-3) red
red D (4,0,-2) blue x2
blue A (2,0,-1) blue
blue A (0,0,0) -
Ответ 2
Здесь представлены решения для каждой исходной позиции:
Start 1: (2, 0, -1) Reds=1 Blues=0
Red B ==> (3, -1, -2) Reds=1 Blues=0
Red B ==> (4, -2, -3) Reds=1 Blues=0
Red D ==> (4, 0, -2) Reds=0 Blues=2
Blue A ==> (2, 0, -1) Reds=0 Blues=1
Blue A ==> (0, 0, 0) Reds=0 Blues=0
Start 2: (3, 1, -1) Reds=2 Blues=0
Red A ==> (3, -1, -2) Reds=1 Blues=0
Red B ==> (4, -2, -3) Reds=1 Blues=0
Red D ==> (4, 0, -2) Reds=0 Blues=2
Blue A ==> (2, 0, -1) Reds=0 Blues=1
Blue A ==> (0, 0, 0) Reds=0 Blues=0
Найдено мгновенно следующей программой на С#, которая выполняет случайное блуждание и отказывается после небольшого количества ходов.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SO8683939
{
struct State
{
public int V1;
public int V2;
public int V3;
public int Reds;
public int Blues;
public int Tokens { get { return Reds + Blues; } }
public string Description;
public State(int v1, int v2, int v3, int reds, int blues)
{
V1 = v1;
V2 = v2;
V3 = v3;
Reds = reds;
Blues = blues;
Description = null;
}
public State Add(State other)
{
State sum;
sum.V1 = V1 + other.V1;
sum.V2 = V2 + other.V2;
sum.V3 = V3 + other.V3;
sum.Reds = Reds + other.Reds;
sum.Blues = Blues + other.Blues;
sum.Description = null;
return sum;
}
public override string ToString()
{
var detail = string.Format("({0}, {1}, {2}) Reds={3} Blues={4}", V1, V2, V3, Reds, Blues);
if (Description != null)
{
return Description + ": " + detail;
}
return detail;
}
}
class Program
{
static void Main(string[] args)
{
var start1 = new State(2, 0, -1, 1, 0) { Description = "Start 1" };
var start2 = new State(3, 1, -1, 2, 0) { Description = "Start 2" };
var end = new State(0, 0, 0, 0, 0);
var redA = new State(0, -2, -1, -1, 0) { Description = "Red A" };
var redB = new State(1, -1, -1, 0, 0) { Description = "Red B" }; ;
var redC = new State(2, 0, -1, 1, 0) { Description = "Red C" }; ;
var redD = new State(0, 2, 1, -1, 2) { Description = "Red D" }; ;
var redOptions = new[] { redA, redB, redC, redD };
var blueA = new State(-2, 0, 1, 0, -1) { Description = "Blue A" };
var blueB = new State(-1, 1, 1, 0, 0) { Description = "Blue B" };
var blueC = new State(0, 2, 1, 0, 1) { Description = "Blue C" };
var blueD = new State(2, 0, -1, 2, -1) { Description = "Blue D" };
var blueOptions = new[] { blueA, blueB, blueC, blueD };
var startingPosition = start1;
var maxSolutionLength = 5;
var rand = new Random();
var path = new List<State>();
while (true)
{
var current = startingPosition;
path.Clear();
//Console.WriteLine("Starting");
//Console.WriteLine(current);
while (true)
{
State selected;
if (current.Reds == 0)
{
selected = blueOptions[rand.Next(4)];
}
else if (current.Blues == 0)
{
selected = redOptions[rand.Next(4)];
}
else
{
if (rand.NextDouble() < 0.5)
{
selected = blueOptions[rand.Next(4)];
}
else
{
selected = redOptions[rand.Next(4)];
}
}
//Console.WriteLine(selected);
path.Add(selected);
current = current.Add(selected);
//Console.WriteLine(current);
if (current.Equals(end))
{
Console.WriteLine("Success!");
var retrace = startingPosition;
Console.WriteLine(retrace);
foreach (var selection in path)
{
retrace = retrace.Add(selection);
Console.WriteLine("{0} ==> {1}", selection.Description, retrace);
}
Console.ReadLine();
break;
}
else if (current.Tokens == 0)
{
// fail
//Console.WriteLine("Fail");
break;
}
else if (path.Count >= maxSolutionLength)
{
// fail
//Console.WriteLine("Fail");
break;
}
}
}
}
}
}
Ответ 3
Учитывайте, что количество красных и синих пьес должно быть двумя дополнительными измерениями в вашей позиции. Это значительно снижает сложность проблемы.
Ниже, проблема пересчитывается с последними двумя измерениями, представляющими оставшиеся красные и синие.
СТАРТ. Вы начинаете с одной из двух позиций:
- вес
(2, 0,-1, 1, 0)
- вес
(3,-1,-1, 2, 0)
END Игра заканчивается, когда у вас есть вес (0, 0, 0, 0, 0)
.
Учитывая игру, вы выбираете одну из восьми частей: Ar,Br,Cr,Dr,Ab,Bb,Cb,Db
, которая дает вам дополнительный вес. Вот правила:
- Ar добавляет вес
(0,-2,-1,-1, 0)
- Br добавляет вес
(1,-1,-1, 0, 0)
- Cr добавляет вес
(2, 0,-1, 1, 0)
- Dr добавляет вес
(0, 2, 1,-1, 2)
- Ab добавляет вес
(-2,0, 1, 0,-1)
- Bb добавляет вес
(-1,1, 1, 0, 0)
- Cb добавляет вес
(0, 2, 1, 0, 1)
- Db добавляет вес
(2, 0,-1, 2,-1)
Кроме того, последние два измерения никогда не могут быть отрицательными.
Теперь его можно решить как уравнение с 8 переменными.