Доломал минимакс

Вот мно­гие счи­та­ют, на мой взгляд, необос­но­ван­но, что маши­на, создан­ная чело­ве­ком, завсе­гда будет дур­нее созда­те­ля. По мое­му опы­ту, вер­но обрат­ное — создан­ный чело­ве­ком иску­ствен­ный интел­лект (ого­во­рюсь сра­зу, для дан­ной кон­крет­ной опре­де­лён­ной зада­чи — т.н. «сла­бый» ИИ) рабо­та­ет намно­го мощ­нее, чем спо­со­бен чело­век, его напи­сав­ший. Во вся­ком слу­чае, мои кре­сти­ки-ноли­ки лег­ко меня гро­мят, если толь­ко я не намор­щу ум — тогда полу­ча­ет­ся ничья. Да и Deep Blue, кото­рый обыг­рал Кас­па­ро­ва, писа­ли хоть и люди, заве­до­мо зна­ко­мые с шах­ма­та­ми, но всё же не игро­ки выше уров­ня вели­ко­го шах­ма­ти­ста.

Поэто­му, так ска­зать, в даль­ней пер­спек­ти­ве я вижу, что чело­век смо­жет создать силь­ный иску­ствен­ный интел­лект, кото­рый пре­во­зой­дёт его само­го. Вопрос, какая роль будет отве­де­на чело­ве­ку в дан­ном мире — ОЧЕНЬ инте­рес­ный, и по-мое­му, одно­знач­но­го отве­та нет ни у кого. Элон Маск, напри­мер, счи­та­ет, что чело­ве­че­ство будет пора­бо­ще­но силь­ным ИИ. Созда­те­ли сери­а­ла «Person of Interest» дума­ют, что чело­век будет суще­ство­вать с силь­ным ИИ сим­био­ти­че­ски — т.е. всё управ­ле­ние и раз­ви­тие чело­ве­че­ства возь­мёт на себя ИИ, люди будут абсо­лют­но счаст­ли­вы, а в обмен на это будут этот самый ИИ обслу­жи­вать, напри­мер, бата­рей­ки вовре­мя менять 🙂 Ну, а созда­те­ли сери­а­ла «Westworld» отво­дят ИИ роль рабов, при­служ­ни­ков чело­ве­ка. Какой из этих отве­тов вер­ный — неиз­вест­но, но не исклю­че­но, что ответ мы узна­ем в тече­ние нашей жиз­ни.

Одна­ко хва­тит фило­со­фии.

Вся зада­ча напи­са­ния игры, спо­соб­ной обыг­рать созда­те­ля, в ито­ге таки све­лась к напи­са­нию алго­рит­ма мини­макс. В этом была вся загвозд­ка. Попы­та­юсь объ­яс­нить попро­ще, как он рабо­та­ет.

Для каж­до­го потен­ци­аль­но­го хода нуж­но рас­счи­тать некий коэф­фи­ци­ент. Отри­ца­тель­ный коэф­фи­ци­ент будет озна­чать, что выиг­рал про­тив­ник, поло­жи­тель­ный — что выиг­ра­ла про­грам­ма. Я начал с того, что при­сво­ил немед­лен­но­му выиг­ры­шу зна­че­ние 1.0, про­иг­ры­шу ‑1.0, а ничьей 0. Далее, алго­ритм поме­ча­ет этот ход как кор­не­вой узел, и стро­ит исхо­дя­щее из него дере­во потен­ци­аль­ных ходов про­тив­ни­ка, а потом сно­ва сво­их, вызы­вая сам себя рекур­сив­но (а как же ещё, если речь идёт о дере­вьях про­из­воль­ной высо­ты). Рань­ше или поз­же, алго­ритм добе­рёт­ся до листьев игро­во­го дере­ва, и будет воз­вра­щать +1.0, ‑1.0 или 0. Оста­ёт­ся толь­ко сло­жить все зна­че­ния, полу­чен­ные из листьев игро­во­го дере­ва, вме­сте, и запи­сать их в мас­сив, из кото­ро­го выбрать мак­си­маль­ное зна­че­ние, при­сво­ен­ное како­му-либо ходу.

Но это­го ока­за­лось недо­ста­точ­но. Напи­сан­ная с таким алго­рит­мом про­грам­ма таки игра­ла, но на сред­нем уровне. У неё мож­но было выиг­рать. Шишеч­кой на этой ёлоч­ке ока­за­лось вве­де­ние допол­ни­тель­ной поправ­ки, на кото­рую умно­жал­ся коэф­фи­ци­ент, полу­чен­ный из листьев игро­во­го дере­ва. По про­стой при­чине — немед­лен­ный выиг­рыш или про­иг­рыш, пря­мо со сле­ду­ю­ще­го хода, дол­жен учи­ты­вать­ся зна­чи­тель­но боль­ше, чем выиг­рыш или про­иг­рыш после несколь­ких ходов. Я начал с того, что коэф­фи­ци­ен­ты, полу­чен­ные из каж­до­го более ниж­не­го уров­ня игро­во­го дере­ва, стал делить на 2. Но и это­го ока­за­лось мало, хотя и замет­но улуч­ши­ло рабо­ту алго­рит­ма. Маги­че­ским чис­лом ока­за­лось 4. Т.е. немед­лен­ный выиг­рыш на пер­вом ходе учи­ты­ва­ет­ся как +1.0, выиг­рыш на вто­ром — как +0.25, на тре­тьем — +0.0625 и так далее. Вот тут уже выиг­рать про­тив про­грам­мы не ока­за­лось ника­ких шан­сов. В луч­шем слу­чае я могу сыг­рать вни­чью.

Сме­ха ради, запу­стил про­грам­му играть про­тив гуг­лов­ских кре­сти­ков-ноли­ков на уровне слож­но­сти impossible. Все игры так же были све­де­ны к ничьей. Уррр­ря!!

Надо будет напи­сать про­грам­му, игра­ю­щую в пре­фе­ранс. А то комп меня лег­ко дрю­чит, осо­бен­но на рас­па­сах (я вооб­ще не очень играю ни в пре­фе­ранс, ни в шах­ма­ты, ни в шаш­ки, хотя поче­му-то непло­хо — в под­дав­ки).