هوش مصنوعی با پایتون – بازی

3 سال پیش

هوش مصنوعی با پایتون – بازی

در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، شما به طور مفصل در مورد هوش مصنوعی با پایتون – بازی یاد خواهید گرفت.

بازی ها با استراتژی انجام می شود. هر بازیکن یا تیمی قبل از شروع بازی یک استراتژی ایجاد می کند و باید با توجه به شرایط (های) موجود در بازی استراتژی جدیدی را تغییر دهد یا ایجاد کند.

پیشنهاد ویژه : پکیج آموزش پایتون مختص بازار کار

در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، شما به طور مفصل در مورد هوش مصنوعی با پایتون – بازی یاد خواهید گرفت.

الگوریتم های جستجو

شما باید بازیهای رایانه ای را نیز با همان استراتژی بالا در نظر بگیرید. توجه داشته باشید که الگوریتم های جستجو مواردی هستند که استراتژی بازی های رایانه ای را کشف می کنند.

چگونه کار می کند

هدف از الگوریتم های جستجو یافتن مجموعه ای بهینه از حرکت ها است تا بتوانند در مقصد نهایی خود را بدست آورند و برنده شوند. این الگوریتم ها از مجموعه شرایط برنده، متفاوت برای هر بازی، برای یافتن بهترین حرکات استفاده می کنند.

یک بازی رایانه ای را مانند درخت تجسم کنید. ما می دانیم که درخت دارای گره است. با شروع از ریشه، می توانیم به گره نهایی برنده، اما با حرکات بهینه برسیم. این کار الگوریتم های جستجو است. هر گره در چنین درختی وضعیت آینده را نشان می دهد. الگوریتم های جستجو از طریق این درخت جستجو می کنند تا در هر مرحله یا گره از بازی تصمیم بگیرند.

جستجوی ترکیبی

مهمترین عیب استفاده از الگوریتم های جستجو ماهیت کامل آنهاست، به همین دلیل آنها کل فضای جستجو را جستجو می کنند تا راه حلی را که منجر به هدر رفتن منابع می شود، پیدا کنند. دشوارتر خواهد بود اگر این الگوریتم ها برای یافتن راه حل نهایی نیاز به جستجوی کل فضای جستجو داشته باشند.

برای از بین بردن چنین مشکلی، می توانیم از جستجوی ترکیبی استفاده کنیم که از روش اکتشافی برای کشف فضای جستجو استفاده می کند و با حذف حرکات اشتباه احتمالی، اندازه آن را کاهش می دهد. از این رو چنین الگوریتم هایی می توانند منابع را ذخیره کنند. برخی از الگوریتم هایی که از روش اکتشافی برای جستجوی فضا و صرفه جویی در منابع استفاده می کنند، در اینجا بحث شده است –

الگوریتم Minimax

این استراتژی مورد استفاده در جستجوی ترکیبی است که برای سرعت بخشیدن به استراتژی جستجو از روش ابتکاری استفاده می کند. مفهوم استراتژی Minimax را می توان با مثال دو بازی بازیکن درک کرد، که در آن هر بازیکن سعی می کند حرکت بعدی حریف را پیش بینی کند و سعی می کند آن عملکرد را به حداقل برساند. همچنین، برای برنده شدن بازیکن همیشه سعی می کند عملکرد خود را بر اساس شرایط فعلی به حداکثر برساند.

اکتشافی در چنین استراتژی هایی مانند Minimax نقش مهمی دارد. هر گره از درخت دارای عملکرد ابتکاری مرتبط با آن است. بر اساس این ابتکار عمل، تصمیم گرفته شود که به سمت گره ای حرکت کنید که بیشترین سود را برای آنها داشته باشد.

هرس آلفا-بتا

یک مسئله مهم در الگوریتم Minimax این است که می تواند قسمتهایی از درخت را بی ربط کند و منجر به هدر رفتن منابع شود. از این رو باید استراتژی وجود داشته باشد تا تصمیم بگیرد کدام قسمت از درخت مربوط است و کدام موضوع بی ربط است و قسمت بی ربط را بدون بررسی رها می کند. هرس آلفا-بتا یکی از این نوع استراتژی ها است.

هدف اصلی الگوریتم هرس آلفا-بتا جلوگیری از جستجوی قسمتهایی از درخت است که هیچ راه حلی ندارند. مفهوم اصلی هرس آلفا-بتا استفاده از دو مرز به نام های آلفا، حداکثر حد پایینی و بتا، حداقل حد بالایی است. این دو پارامتر مقادیری هستند که مجموعه راه حل های ممکن را محدود می کنند. مقدار گره فعلی را با مقدار پارامترهای آلفا و بتا مقایسه می کند، بنابراین می تواند به بخشی از درخت که محلول دارد حرکت کند و بقیه را دور بیندازد.

الگوریتم Negamax

این الگوریتم تفاوتی با الگوریتم Minimax ندارد، اما اجرای ظریف تری دارد. عیب اصلی استفاده از الگوریتم Minimax این است که ما باید دو عملکرد مختلف ابتکاری را تعریف کنیم. ارتباط بین این اکتشافات ابتدایی این است که، هرچه وضعیت یک بازی برای یک بازیکن بهتر باشد، برای بازیکن دیگر بدتر است. در الگوریتم نگاماکس، کار مشابه دو تابع اکتشافی با کمک یک تابع اکتشافی واحد انجام می شود.

ساخت ربات برای بازی کردن

برای ساخت ربات ها برای انجام بازی های دو نفره در AI ، باید کتابخانه easyAI را نصب کنیم. این یک چارچوب هوش مصنوعی است که کلیه قابلیت های ساخت بازی های دو نفره را فراهم می کند. می توانید آن را با کمک دستور زیر بارگیری کنید –

pip install easyAI

 

یک ربات برای پخش Last Coin Standing

در این بازی، انبوهی از سکه ها وجود دارد. هر بازیکن باید تعدادی سکه از آن کیسه بردارد. هدف از این بازی جلوگیری از گرفتن آخرین سکه در آن کیسه است. ما از کلاس LastCoinStanding که از کلاس TwoPlayersGame در کتابخانه easyAI به ارث رسیده است استفاده خواهیم کرد. کد زیر کد پایتون را برای این بازی نشان می دهد –

پکیج های مورد نیاز را همانطور که نشان داده شده وارد کنید –

from easyAI import TwoPlayersGame, id_solve, Human_Player, AI_Player
from easyAI.AI import TT

اکنون کلاس را از کلاس TwoPlayerGame به ارث برید تا تمام عملیات بازی را انجام دهد –

class LastCoin_game(TwoPlayersGame):
   def __init__(self, players):

اکنون، بازیکنان و بازیکنی را که قرار است بازی را شروع کند تعریف کنید.

self.players = players
self.nplayer = 1

اکنون، تعداد سکه های بازی را تعریف کنید ، در اینجا ما از ۱۵ سکه برای بازی استفاده می کنیم.

self.num_coins = 15

حداکثر تعداد سکه هایی که بازیکن می تواند در حین حرکت بگیرد را مشخص کنید.

self.max_coins = 4

اکنون برخی موارد خاص برای تعریف وجود دارد که در کد زیر نشان داده شده است. حرکات احتمالی را تعریف کنید.

def possible_moves(self):
   return [str(a) for a in range(1, self.max_coins + 1)]

حذف سکه ها را تعریف کنید

def make_move(self, move):
   self.num_coins -= int(move)

مشخص کنید چه کسی سکه آخر را گرفته است.

def win_game(self):
   return self.num_coins <= 0

مشخص کنید چه موقع بازی را متوقف کنید، این زمانی است که کسی برنده می شود.

def is_over(self):
   return self.win()

نحوه محاسبه نمره را مشخص کنید.

def score(self):
   return 100 if self.win_game() else 0

 

تعداد سکه های باقی مانده در کیسه را مشخص کنید.

def show(self):
   print(self.num_coins, 'coins left in the pile')
if __name__ == "__main__":
   tt = TT()
   LastCoin_game.ttentry = lambda self: self.num_coins

حل بازی با بلوک کد زیر –

r, d, m = id_solve(LastCoin_game,
   range(2, 20), win_score=100, tt=tt)
print(r, d, m)

تصمیم گیری در مورد اینکه چه کسی بازی را شروع می کند

game = LastCoin_game([AI_Player(tt), Human_Player()])
game.play()

می توانید خروجی زیر و یک بازی ساده از این بازی را پیدا کنید –

d:2, a:0, m:1
d:3, a:0, m:1
d:4, a:0, m:1
d:5, a:0, m:1
d:6, a:100, m:4
۱ ۶ ۴
۱۵ coins left in the pile
Move #1: player 1 plays 4 :
۱۱ coins left in the pile
Player 2 what do you play ? 2
Move #2: player 2 plays 2 :
۹ coins left in the pile
Move #3: player 1 plays 3 :
۶ coins left in the pile
Player 2 what do you play ? 1
Move #4: player 2 plays 1 :
۵ coins left in the pile
Move #5: player 1 plays 4 :
۱ coins left in the pile
Player 2 what do you play ? 1
Move #6: player 2 plays 1 :
۰ coins left in the pile

 

یک ربات برای بازی Tic Tac Toe

Tic-Tac-Toe بسیار آشنا و یکی از محبوب ترین بازی هاست. اجازه دهید این بازی را با استفاده از کتابخانه easyAI در پایتون بسازیم. کد زیر کد Python این بازی است –

پکیج ها را همانطور که نشان داده شده وارد کنید –

from easyAI import TwoPlayersGame, AI_Player, Negamax
from easyAI.Player import Human_Player

 

برای اداره همه عملیات بازی ، کلاس را از کلاس TwoPlayerGame  ارث بری کنید-

class TicTacToe_game(TwoPlayersGame):
   def __init__(self, players):

 

اکنون، بازیکنان و بازیکنی را که قرار است بازی را شروع کند تعریف کنید –

self.players = players
self.nplayer = 1

نوع board را مشخص کنید –

self.board = [0] * 9

 

برخی موارد خاص وجود دارد که به شرح زیر تعریف می شود –

حرکات احتمالی را تعریف کنید

def possible_moves(self):
   return [x + 1 for x, y in enumerate(self.board) if y == 0]

حرکت بازیکن را تعریف کنید –

def make_move(self, move):
   self.board[int(move) - 1] = self.nplayer

برای تقویت هوش مصنوعی، مشخص کنید که چه موقع بازیکن حرکت می کند –

def umake_move(self, move):
   self.board[int(move) - 1] = 0

شرط باخت را مشخص کنید که حریف سه خط داشته باشد

def condition_for_lose(self):
   possible_combinations = [[1,2,3], [4,5,6], [7,8,9],
      [۱,۴,۷], [۲,۵,۸], [۳,۶,۹], [۱,۵,۹], [۳,۵,۷]]
   return any([all([(self.board[z-1] == self.nopponent)
      for z in combination]) for combination in possible_combinations])

برای پایان بازی یک نقطه مشخص کنید

def is_over(self):
   return (self.possible_moves() == []) or self.condition_for_lose()

 

موقعیت فعلی بازیکنان را در بازی نشان دهید

def show(self):
   print('\n'+'\n'.join([' '.join([['.', 'O', 'X'][self.board[3*j + i]]
      for i in range(3)]) for j in range(3)]))

 

امتیازات را محاسبه کنید.

def scoring(self):
   return -100 if self.condition_for_lose() else 0

 

روش اصلی را برای تعریف الگوریتم و شروع بازی تعریف کنید –

if __name__ == "__main__":
   algo = Negamax(7)
   TicTacToe_game([Human_Player(), AI_Player(algo)]).play()

 

می توانید خروجی زیر و یک بازی ساده از این بازی را مشاهده کنید –

. . .
. . .
. . .
Player 1 what do you play ? 1
Move #1: player 1 plays 1 :
O . .
. . .
. . .
Move #2: player 2 plays 5 :
O . .
. X .
۱۲۱
. . .
Player 1 what do you play ? 3
Move #3: player 1 plays 3 :
O . O
. X .
. . .
Move #4: player 2 plays 2 :
O X O
. X .
. . .
Player 1 what do you play ? 4
Move #5: player 1 plays 4 :
O X O
O X .
. . .
Move #6: player 2 plays 8 :
O X O
O X .
. X .

 

منبع.

لیست جلسات قبل آموزش هوش مصنوعی با برنامه نویسی پایتون

  1. آموزش هوش مصنوعی با برنامه نویسی پایتون – مفهوم کلی
  2. شروع آموزش هوش مصنوعی با برنامه نویسی پایتون
  3. یادگیری ماشین در هوش مصنوعی با برنامه نویسی پایتون
  4. هوش مصنوعی با برنامه نویسی پایتون، آماده ‌سازی داده ها
  5. هوش مصنوعی با پایتون، یادگیری نظارت شده و طبقه بندی
  6. هوش مصنوعی با برنامه نویسی پایتون – یادگیری تحت نظارت: رگرسیون
  7. هوش مصنوعی با برنامه نویسی پایتون – برنامه نویسی منطقی
  8. هوش مصنوعی با پایتون – یادگیری بدون نظارت: خوشه بندی
  9. هوش مصنوعی با پایتون – پردازش زبان طبیعی
  10. هوش مصنوعی با پایتون – پکیج NLTK
  11. هوش مصنوعی با پایتون – تجزیه و تحلیل داده های سری زمانی
  12. هوش مصنوعی با پایتون – تشخیص گفتار
  13. هوش مصنوعی با پایتون – جستجوی کاشف

 

0
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه