Я переписал этот ответ, чтобы попытаться ответить на некоторые комментарии к предыдущей версии.
Я предполагаю, что вы прочитали определение Wikipedia для NP-полноты, которое действительно не фокусируется на играх. Я немного опишу точное значение NP-завершенности и теории игр и объясню суть игры NP-Complete.
Давайте рассмотрим игру с двумя игроками с альтернативными ходами, более ограниченно это по существу о комбинаторных играх . В основном это игра, в которой у вас есть определенное количество ходов, и вы должны выбрать один из них. Вы хотели бы играть «идеально», что означает, что вы никогда не сделаете «плохой» ход. Итак, из допустимых ходов вы бы хотели выбрать лучший. (Конечно, у вашего противника такая же цель ...)
Обратите внимание, что идеальная игра не означает, что вы всегда будете выигрывать. Правила игры могут быть такими, что первый или второй игрок должен выиграть. Также некоторые игры, такие как крестики-нолики, должны заканчиваться ничьей. Таким образом, «идеальная игра» означает в этом обсуждении:
(1) что вы никогда не будете в выигрышной позиции, а затем проиграете, потому что сделали «плохой» ход
(2) вы никогда не упустите возможность получить в выигрышную позицию, если такая возможность возникает.
Учитывая текущее состояние игры, вам нужно иметь возможность использовать «эффективный алгоритм» для расчета наилучшего хода. С другой стороны, отметим, что алгоритм, который должен искать по всему дереву игры, является «неэффективным алгоритмом».
Теперь давайте определим «эффективность» немного более формально. Я собираюсь немного упростить это, но суть верна. Рассмотрим количество вычислений , которое необходимо сделать, чтобы выбрать следующий ход, одно среднее значение каждого хода имеет возможностей ( коэффициент ветвления ) и что в игре осталось ходов. Понятие также , что каждое вычисление занимает столько же времени , так что усилия могут быть переведены на временной сложности , , вместо исходных расчетов.B n TCBnT
- «Эффективный алгоритм» будет иметь: где - «маленькое целое число» и ах некоторые реальные цифры. Таким образом, эффективный алгоритм выполняется за полиномиальное время, поскольку это полиномиальное выражение.
αT∝aBa+bBα−1+cBα−2+...+hB0
α
- «Неэффективный алгоритм» будет иметь:
и этот алгоритм выполняется за экспоненциальное время (т.е. за неполиноминальное время). Дело в том, что с увеличением комбинаторный взрыв.
nT∝aBn
n
Важным моментом является то, что невозможно иметь эффективный алгоритм полиномиального времени, который идеально подходит для игры с NP-завершением. Для идеального воспроизведения NP-полной задачи, по определению, необходимо решить с помощью неэффективного алгоритма, который выполняется за неполиномиальное время.
Обратите внимание, что время выполнения зависит от количества вычислений, а не от времени отклика, воспринимаемого человеком. В такой маленькой игре, как Tic-Tac-Toe, компьютер может выполнять все возможные будущие действия и при этом быстро реагировать, как это воспринимает человек.
Для Нима можно создать алгоритм полиномиального времени. В любой момент игры алгоритм может рассчитать, у какого игрока есть выигрышный ход и каким должен быть этот ход.
С другой стороны, давайте возьмем игру Qubic . (Вы пытаетесь построить линию 4 в 3D-сетке. Таким образом, это по сути крестики-нолики в сетке 4x4x4.) Qubic является NP-полной, поэтому нет алгоритма полиномиального времени для вычисления следующего совершенного движения. Единственный способ узнать, есть ли у вас выигрышный ход, состоит в том, чтобы попробовать все возможные ходы обоих игроков, чтобы убедиться, что тот или иной ход является победителем или, по крайней мере, не проигравшим.
По правде говоря, все дерево игр для Qubic достаточно маленькое, чтобы его можно было закодировать в компьютерную программу, которая может отлично играть. Что означает кодирование, так это то, что все дерево игры было исследовано, и все ходы проработаны заранее. Таким образом, программа может по существу выполнить быстрый вызов базы данных, используя текущее состояние доски, и получить лучший ход для этого состояния доски, не выполняя поиск по дереву каждый раз, когда должен быть сделан ход. Это действительно «чит» для наших целей здесь.
Теперь давайте обсудим шахматы, чтобы обсудить функцию оценки, игнорируя некоторые другие особенности программ игры в шахматы. Шахматы до сих пор не решены . Неизвестно, должен ли победить первый или второй игрок. Невозможно получить какую-либо позицию на доске и предсказать с уверенностью, кто победит. На самом деле шахматы имеют такое большое игровое дерево, что просто невозможно обыскать все игровое дерево. Вам понадобятся компьютеры, которые не только в 10 или 100 раз быстрее, но и в миллиарды миллиардов раз быстрее, чем любой другой компьютер. (Есть надежда, что квантовые вычисления могут пробиться через этот гордиев узел.)
Представьте себе, что функция оценки шахмат дает каждому возможному следующему ходу вероятность быть лучшим ходом. Шахматная программа сочетает в себе взгляды на будущее и функцию оценки. Таким образом, программа рассматривает все возможные будущие ходы, пока не достигнет точки, где «положительная» оценка может быть дана позиции доски. Таким образом, компьютер оценивает все возможные пути через дерево, а затем выбирает путь с наилучшей оценкой. Поскольку поиск по всем пройденным путям никогда не доходил до конца игры, все шахматные программы в конечном итоге используют несовершенную функцию оценки. (Если вы близки к концу игры, то компьютер может просматривать все возможные будущие ходы.) Это означает, что возможно победить программу, даже если в какой-то момент программа имела выигрышную позицию.