ایجاد یک الگوریتم ژنتیک برای شبکه عصبی و یک شبکه عصبی برای بازی های گرافیکی و بازی های ویدئویی با استفاده از Python و NumPy

Summarize this content to 400 words in Persian Lang
امروز می گویم و نشان می دهم که چگونه یک الگوریتم ژنتیک (GA) برای یک شبکه عصبی بسازیم تا بتواند بازی های مختلفی را با آن انجام دهد. من آن را روی بازی Pong and Flappy bird امتحان کردم. خیلی خوب خودش را نشان داد. به شما توصیه می کنم اگر مقاله اول را نخوانده اید، آن را بخوانید: «ایجاد یک الگوریتم ژنتیک ساده و کارآمد برای شبکه عصبی با پایتون و NumPy»، زیرا من کدم را که در آن مقاله نشان داده شده بود تغییر داده ام.
من کد را به دو اسکریپت تقسیم کردم، در یکی شبکه عصبی بازی می کند، در دیگری یاد می گیرد و تصمیم می گیرد (خود الگوریتم ژنتیک). کد با بازی تابعی است که تابع تناسب اندام را برمی گرداند (برای مرتب سازی شبکه های عصبی، به عنوان مثال، مدت زمان دوام، چند امتیاز و غیره مورد نیاز است). بنابراین، کد بازی ها (دو مورد از آنها وجود دارد) در انتهای مقاله خواهد بود. الگوریتم ژنتیک شبکه عصبی برای بازی Pong و بازی Flappy Bird فقط در پارامترها متفاوت است. با استفاده از اسکریپتی که در مقاله قبلی نوشتم و توضیح دادم، یک کد الگوریتم ژنتیک به شدت اصلاح شده برای بازی Pong ایجاد کردم که بیشتر از همه توضیح خواهم داد، زیرا زمانی که GA را برای Flappy Bird ایجاد کردم به آن اعتماد کردم.
ابتدا باید ماژول ها، لیست ها و متغیرها را وارد کنیم:
import numpy as np
import random
import ANNPong as anp
import pygame as pg
import sys
from pygame.locals import *
pg.init()
listNet = {}
NewNet = []
goodNet = []
timeNN = 0
moveRight = False
moveLeft = False
epoch = 0
mainClock = pg.time.Clock()
WINDOWWIDTH = 800
WINDOWHEIGHT = 500
windowSurface = pg.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
pg.display.set_caption(‘ANN Pong’)
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
AnnPong یک فیلمنامه با یک بازی استlistNet، NewNet، goodNet – لیست شبکه های عصبی (در ادامه به جزئیات بیشتر خواهیم پرداخت)timeNN – عملکرد تناسب اندامMoveRight، moveLeft – شبکه عصبی را برای حرکت انتخاب کنیدepoch – عصر شمار
def sigmoid(x):
return 1/(1 + np.exp(-x))
class Network():
def __init__(self):
self.H1 = np.random.randn(6, 12)
self.H2 = np.random.randn(12, 6)
self.O1 = np.random.randn(6, 3)
self.BH1 = np.random.randn(12)
self.BH2 = np.random.randn(6)
self.BO1 = np.random.randn(3)
self.epoch = 0
def predict(self, x, first, second):
nas = x @ self.H1 + self.BH1
nas = sigmoid(nas)
nas = nas @ self.H2 + self.BH2
nas = sigmoid(nas)
nas = nas @ self.O1 + self.BO1
nas = sigmoid(nas)
if nas[0] > nas[1] and nas[0] > nas[2]:
first = True
second = False
return first, second
elif nas[1] > nas[0] and nas[1] > nas[2]:
first = False
second = True
return first, second
elif nas[2] > nas[0] and nas[2] > nas[1]:
first = False
second = False
return first, second
else:
first = False
second = False
return first, second
def epoch(self, a):
return 0
class Network1():
def __init__(self, H1, H2, O1, BH1, BH2, BO1, ep):
self.H1 = H1
self.H2 = H2
self.O1 = O1
self.BH1 = BH1
self.BH2 = BH2
self.BO1 = BO1
self.epoch = ep
def predict(self, x, first, second):
nas = x @ self.H1 + self.BH1
nas = sigmoid(nas)
nas = nas @ self.H2 + self.BH2
nas = sigmoid(nas)
nas = nas @ self.O1 + self.BO1
nas = sigmoid(nas)
if nas[0] > nas[1] and nas[0] > nas[2]:
first = True
second = False
return first, second
elif nas[1] > nas[0] and nas[1] > nas[2]:
first = False
second = True
return first, second
elif nas[2] > nas[0] and nas[2] > nas[1]:
first = False
second = False
return first, second
else:
first = False
second = False
return first, second
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
سیگموئید به عنوان تابع فعال سازی استفاده می شود.در کلاس Network پارامترهای شبکه عصبی را تعریف می کنیم و در تابع پیش بینی به ما می گوید که کجا در بازی حرکت کنیم. (nas مخفف Network answer است)، تابع epoch دوران ظهور این هوش مصنوعی را برای نسل صفر برمی گرداند، زیرا یک متغیر جداگانه برای آن در کلاس Network1 () تنظیم شده است.
for s in range (1000):
s = Network()
timeNN = anp.NNPong(s)
listNet.update({
s : timeNN
})
listNet = dict(sorted(listNet.items(), key=lambda item: item[1]))
NewNet = listNet.keys()
goodNet = list(NewNet)
NewNet = goodNet[:10]
listNet = {}
goodNet = NewNet
anp.NPong(NewNet[0])
print(str(epoch) + ” epoch”)
print(NewNet[0].epoch)
print(‘next’)
anp.NPong(NewNet[1])
print(NewNet[1].epoch)
print(‘next’)
anp.NPong(NewNet[2])
print(NewNet[2].epoch)
print(‘next’)
anp.NPong(NewNet[3])
print(NewNet[3].epoch)
print(‘next’)
anp.NPong(NewNet[4])
print(NewNet[4].epoch)
print(‘next’)
anp.NPong(NewNet[5])
print(NewNet[5].epoch)
print(‘next’)
anp.NPong(NewNet[6])
print(NewNet[6].epoch)
print(‘next’)
anp.NPong(NewNet[7])
print(NewNet[7].epoch)
print(‘next’)
anp.NPong(NewNet[8])
print(NewNet[8].epoch)
print(‘next’)
anp.NPong(NewNet[9])
print(NewNet[9].epoch)
print(‘that is all’)
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در اینجا شبکه های عصبی را با وزن های تصادفی ایجاد شده اجرا می کنیم و از بین آنها 10 بدترین آنها را انتخاب می کنیم تا الگوریتم ژنتیک تمام کار بالا بردن آنها را به عهده بگیرد))) و آنها را نشان می دهد.جزئیات بیشتر:تابع fitness برگردانده شده از کد بازی در timeNN نوشته می شود، سپس AI و مقدار timeNN آن را به listNet اضافه می کنیم. پس از چرخه، لیست را مرتب می کنیم، شبکه های عصبی را از listNet در NewNet می نویسیم، سپس یک لیست تشکیل می دهیم و تنها ده عدد باقی می گذاریم.
for g in range(990):
parent1 = random.choice(NewNet)
parent2 = random.choice(NewNet)
ch1H = np.vstack((parent1.H1[:3], parent2.H1[3:])) * random.uniform(-2, 2)
ch2H = np.vstack((parent1.H2[:6], parent2.H2[6:])) * random.uniform(-2, 2)
ch1O = np.vstack((parent1. O1[:3], parent2. O1[3:])) * random.uniform(-2, 2)
chB1 = parent1.BH1 * random.uniform(-2, 2)
chB2 = parent2.BH2 * random.uniform(-2, 2)
chB3 = parent2.BO1 * random.uniform(-2, 2)
g = Network1(ch1H, ch2H, ch1O, chB1, chB2, chB3, 1)
goodNet.append(g)
NewNet = []
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در اینجا تلاقی و جهش رخ می دهد. (این گونه نکات در مقاله اول با جزئیات بیشتر توضیح داده شد)
while True:
epoch += 1
print(str(epoch) + ” epoch”)
for s in goodNet:
timeNN = anp.NNPong(s)
listNet.update({
s : timeNN
})
goodNet =[]
listNet = dict(sorted(listNet.items(), key=lambda item: item[1], reverse=True))
goodNet = list(listNet.keys())
NewNet.append(goodNet[0])
goodNet = list(listNet.values())
for i in listNet:
a = goodNet[0]
if listNet.get(i) == a:
NewNet.append(i)
goodNet = list(NewNet)
listNet = {}
try:
print(NewNet[0].epoch)
anp.NPong(NewNet[0])
print(‘next’)
print(NewNet[1].epoch)
anp.NPong(NewNet[1])
print(‘next’)
print(NewNet[2].epoch)
anp.NPong(NewNet[2])
print(‘next’)
print(NewNet[3].epoch)
anp.NPong(NewNet[3])
print(‘next’)
print(NewNet[4].epoch)
anp.NPong(NewNet[4])
print(‘next’)
print(NewNet[5].epoch)
anp.NPong(NewNet[5])
print(‘next’)
print(NewNet[6].epoch)
anp.NPong(NewNet[6])
print(‘next’)
print(NewNet[7].epoch)
anp.NPong(NewNet[7])
print(‘next’)
except IndexError:
print(‘that is all’)
for g in range(1000 – len(NewNet)):
parent1 = random.choice(NewNet)
parent2 = random.choice(NewNet)
ch1H = np.vstack((parent1.H1[:3], parent2.H1[3:])) * random.uniform(-2, 2)
ch2H = np.vstack((parent1.H2[:6], parent2.H2[6:])) * random.uniform(-2, 2)
ch1O = np.vstack((parent1. O1[:3], parent2. O1[3:])) * random.uniform(-2, 2)
chB1 = parent1.BH1 * random.uniform(-2, 2)
chB2 = parent2.BH2 * random.uniform(-2, 2)
chB3 = parent2.BO1 * random.uniform(-2, 2)
g = Network1(ch1H, ch2H, ch1O, chB1, chB2, chB3, epoch)
goodNet.append(g)
print(len(NewNet))
print(len(goodNet))
NewNet = []
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در اینجا ما قبلاً خودمان را تکرار می کنیم ، بنابراین من فقط آنچه قبلاً گفته نشده است را توضیح می دهم:در اینجا ما اولین مورد در لیست را انتخاب می کنیم، یعنی یکی از بهترین های دوران، و نتایج آن را با بقیه مقایسه می کنیم، زیرا اغلب چندین هوش مصنوعی وجود دارند که به موفقیت یکسانی دست یافته اند. و این رهبران برابر در جهش ها شرکت خواهند کرد، ما از روش تلاش استفاده می کنیم، زیرا ممکن است کمتر از 10 بهترین در این دوره وجود داشته باشد. و همچنین این شبکههای عصبی را بدون تغییر به دوره بعدی میاندازیم، زیرا ممکن است نسلها از اجدادشان بدتر باشند، یعنی از بین نرود.همه اینها طبق کد اول است!بریم سراغ کد بازی. در اینجا من فقط آنچه را که مربوط به آموزش هوش مصنوعی است توضیح خواهم داد (من یک پیوند به دیسک ارسال خواهم کرد).در بازی Pong، شبکه عصبی دو بار بازی کرد: بار اول توپ به سمت چپ پرش می کند، بار دوم – به سمت راست*whGo یک متغیر در کد است (مخفف “where to go”)ما زمان را به عنوان تابع تناسب اندام برمی گردانیم. بازی دو عملکرد تقریباً یکسان دارد، اما در دومی ما همه چیز را روی صفحه نمایش می دهیم، این لازم است تا بتوانیم پیشرفت را بعد از هر دوره ببینیم و وقتی شبکه عصبی بازی را کامل کرد، اگر بیشتر طول بکشد این را تعیین می کنیم. بیش از 8000 به روز رسانی در اولین.پس از ماه ها کار و بهبود، موفق به ایجاد یک الگوریتم یادگیری برای بازی پنگ شدم، اما برای اطمینان، تصمیم گرفتم هوش مصنوعی را نه روی بازی خود، بلکه روی یکی از ساخته شده توسط شخص دیگری آزمایش کنم (تست برای همه چیزخواری)) ))، من بازی Flappy Bird در pygame را از این ویدیو انتخاب کردم: https://youtu.be/7IqrZb0Sotw?feature=sharedبرای مثال، با تغییر کمی بازی برای شبکه عصبی، متغیرهایی را برای فاصله پرنده تا لوله اضافه کردم. 3 در 3 وجود دارد، زیرا ما باید ارتفاع هر لوله (y) و فاصله را با x بدانیم، و بیش از سه جفت لوله روی صفحه وجود نداشت، بنابراین سه در سه (در مجموع نه) وجود دارد. . همچنین پس از برخورد، تابع مجدداً راه اندازی شد و پارامتر سوم که rep تابع نامیده می شود، ارسال شد که چه نوع راه اندازی مجدد بود، اگر برابر با سه بود، سپس بازی تابع تناسب اندام را به الگوریتم ژنتیک برمی گرداند. اگر صفر بود، مقدار 0 را به متغیر زمان نسبت می دهیم. همچنین، من دو تابع بسیار مشابه را ننوشتم، اما به سادگی بررسی کردم که آیا متغیر checkNN True است، سپس صفحه باید به روز شود. کد آموزشی را هم اصلاح کردم
while True:
for event in pg.event.get():
if event.type == KEYDOWN:
if event.key == K_1:
showNN = True
epoch += 1
print(str(epoch) + ” epoch”)
if epoch < 10:
for s in goodNet:
timeNN = anp.NPong(s, False, 0, 0)
listNet.update({
s : timeNN
})
if epoch >= 10:
for s in goodNet:
timeNN = anp.NPong(s, False, 0, 1)
listNet.update({
s : timeNN
})
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
بعد از دوره دهم، به دلیل آخرین پارامتر که آن را به یک تغییر می دهیم (در کد بازی این پارامتر را varRe از کلمات variant of return نامیدم)، بازی نه زمان، بلکه تعداد لوله های قبل از برخورد را برمی گرداند. به این ترتیب شبکه عصبی بهتر یاد می گیرد)
howALot = 1000 – len(NewNet)
if howALot < 40:
howALot = 40
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این سه خط کد مورد نیاز است اگر در دوره قبلی هوش مصنوعی تعداد بسیار بسیار زیادی با نتیجه مشابه وجود داشت و ممکن است الگوریتم یادگیری را متوقف کند، زیرا چیزی برای یادگیری نخواهد داشت :-).
بعد از آن من GA خود را برای FlappyBird به روز کردم و شتاب دادم، اکنون همه پرندگان به طور همزمان راه اندازی می شوند، بنابراین آموزش از ~ 3-5 ساعت به 5-10 دقیقه در هنگام راه اندازی بر روی CPU، یعنی 50 بار افزایش یافت! چگونه کار می کند – پیشنهاد می کنم خودتان ببینید: یک تکرار مفید کوچک از آنچه پوشش داده شده است!
این همه، اگر سوالی دارید، در نظرات بنویسید، خداحافظ!
هنوز خیلی چیزهای جدید پیش روی ماست، این مبنای کارهای بعدی است: اکنون من در حال کار بر روی پیاده سازی هوش مصنوعی کامل با کمک الگوریتم های تکاملی در یک محیط مصنوعی هستم، جالب خواهد بود!
کدها: https://github.com/LanskoyKirill/GenNumPy.git
در سایت من: https://selfrobotics.space/2024/12/13/creating-a-genetic-algorithm-for-a-neural-network-and-a-neural-network-for-graphic-games-and- بازی های ویدیویی با استفاده از پایتون و نامپی/
امروز می گویم و نشان می دهم که چگونه یک الگوریتم ژنتیک (GA) برای یک شبکه عصبی بسازیم تا بتواند بازی های مختلفی را با آن انجام دهد. من آن را روی بازی Pong and Flappy bird امتحان کردم. خیلی خوب خودش را نشان داد. به شما توصیه می کنم اگر مقاله اول را نخوانده اید، آن را بخوانید: «ایجاد یک الگوریتم ژنتیک ساده و کارآمد برای شبکه عصبی با پایتون و NumPy»، زیرا من کدم را که در آن مقاله نشان داده شده بود تغییر داده ام.
من کد را به دو اسکریپت تقسیم کردم، در یکی شبکه عصبی بازی می کند، در دیگری یاد می گیرد و تصمیم می گیرد (خود الگوریتم ژنتیک). کد با بازی تابعی است که تابع تناسب اندام را برمی گرداند (برای مرتب سازی شبکه های عصبی، به عنوان مثال، مدت زمان دوام، چند امتیاز و غیره مورد نیاز است). بنابراین، کد بازی ها (دو مورد از آنها وجود دارد) در انتهای مقاله خواهد بود. الگوریتم ژنتیک شبکه عصبی برای بازی Pong و بازی Flappy Bird فقط در پارامترها متفاوت است. با استفاده از اسکریپتی که در مقاله قبلی نوشتم و توضیح دادم، یک کد الگوریتم ژنتیک به شدت اصلاح شده برای بازی Pong ایجاد کردم که بیشتر از همه توضیح خواهم داد، زیرا زمانی که GA را برای Flappy Bird ایجاد کردم به آن اعتماد کردم.
ابتدا باید ماژول ها، لیست ها و متغیرها را وارد کنیم:
import numpy as np
import random
import ANNPong as anp
import pygame as pg
import sys
from pygame.locals import *
pg.init()
listNet = {}
NewNet = []
goodNet = []
timeNN = 0
moveRight = False
moveLeft = False
epoch = 0
mainClock = pg.time.Clock()
WINDOWWIDTH = 800
WINDOWHEIGHT = 500
windowSurface = pg.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
pg.display.set_caption('ANN Pong')
AnnPong یک فیلمنامه با یک بازی است
listNet، NewNet، goodNet – لیست شبکه های عصبی (در ادامه به جزئیات بیشتر خواهیم پرداخت)
timeNN – عملکرد تناسب اندام
MoveRight، moveLeft – شبکه عصبی را برای حرکت انتخاب کنید
epoch – عصر شمار
def sigmoid(x):
return 1/(1 + np.exp(-x))
class Network():
def __init__(self):
self.H1 = np.random.randn(6, 12)
self.H2 = np.random.randn(12, 6)
self.O1 = np.random.randn(6, 3)
self.BH1 = np.random.randn(12)
self.BH2 = np.random.randn(6)
self.BO1 = np.random.randn(3)
self.epoch = 0
def predict(self, x, first, second):
nas = x @ self.H1 + self.BH1
nas = sigmoid(nas)
nas = nas @ self.H2 + self.BH2
nas = sigmoid(nas)
nas = nas @ self.O1 + self.BO1
nas = sigmoid(nas)
if nas[0] > nas[1] and nas[0] > nas[2]:
first = True
second = False
return first, second
elif nas[1] > nas[0] and nas[1] > nas[2]:
first = False
second = True
return first, second
elif nas[2] > nas[0] and nas[2] > nas[1]:
first = False
second = False
return first, second
else:
first = False
second = False
return first, second
def epoch(self, a):
return 0
class Network1():
def __init__(self, H1, H2, O1, BH1, BH2, BO1, ep):
self.H1 = H1
self.H2 = H2
self.O1 = O1
self.BH1 = BH1
self.BH2 = BH2
self.BO1 = BO1
self.epoch = ep
def predict(self, x, first, second):
nas = x @ self.H1 + self.BH1
nas = sigmoid(nas)
nas = nas @ self.H2 + self.BH2
nas = sigmoid(nas)
nas = nas @ self.O1 + self.BO1
nas = sigmoid(nas)
if nas[0] > nas[1] and nas[0] > nas[2]:
first = True
second = False
return first, second
elif nas[1] > nas[0] and nas[1] > nas[2]:
first = False
second = True
return first, second
elif nas[2] > nas[0] and nas[2] > nas[1]:
first = False
second = False
return first, second
else:
first = False
second = False
return first, second
سیگموئید به عنوان تابع فعال سازی استفاده می شود.
در کلاس Network پارامترهای شبکه عصبی را تعریف می کنیم و در تابع پیش بینی به ما می گوید که کجا در بازی حرکت کنیم. (nas مخفف Network answer است)، تابع epoch دوران ظهور این هوش مصنوعی را برای نسل صفر برمی گرداند، زیرا یک متغیر جداگانه برای آن در کلاس Network1 () تنظیم شده است.
for s in range (1000):
s = Network()
timeNN = anp.NNPong(s)
listNet.update({
s : timeNN
})
listNet = dict(sorted(listNet.items(), key=lambda item: item[1]))
NewNet = listNet.keys()
goodNet = list(NewNet)
NewNet = goodNet[:10]
listNet = {}
goodNet = NewNet
anp.NPong(NewNet[0])
print(str(epoch) + " epoch")
print(NewNet[0].epoch)
print('next')
anp.NPong(NewNet[1])
print(NewNet[1].epoch)
print('next')
anp.NPong(NewNet[2])
print(NewNet[2].epoch)
print('next')
anp.NPong(NewNet[3])
print(NewNet[3].epoch)
print('next')
anp.NPong(NewNet[4])
print(NewNet[4].epoch)
print('next')
anp.NPong(NewNet[5])
print(NewNet[5].epoch)
print('next')
anp.NPong(NewNet[6])
print(NewNet[6].epoch)
print('next')
anp.NPong(NewNet[7])
print(NewNet[7].epoch)
print('next')
anp.NPong(NewNet[8])
print(NewNet[8].epoch)
print('next')
anp.NPong(NewNet[9])
print(NewNet[9].epoch)
print('that is all')
در اینجا شبکه های عصبی را با وزن های تصادفی ایجاد شده اجرا می کنیم و از بین آنها 10 بدترین آنها را انتخاب می کنیم تا الگوریتم ژنتیک تمام کار بالا بردن آنها را به عهده بگیرد))) و آنها را نشان می دهد.
جزئیات بیشتر:
تابع fitness برگردانده شده از کد بازی در timeNN نوشته می شود، سپس AI و مقدار timeNN آن را به listNet اضافه می کنیم. پس از چرخه، لیست را مرتب می کنیم، شبکه های عصبی را از listNet در NewNet می نویسیم، سپس یک لیست تشکیل می دهیم و تنها ده عدد باقی می گذاریم.
for g in range(990):
parent1 = random.choice(NewNet)
parent2 = random.choice(NewNet)
ch1H = np.vstack((parent1.H1[:3], parent2.H1[3:])) * random.uniform(-2, 2)
ch2H = np.vstack((parent1.H2[:6], parent2.H2[6:])) * random.uniform(-2, 2)
ch1O = np.vstack((parent1. O1[:3], parent2. O1[3:])) * random.uniform(-2, 2)
chB1 = parent1.BH1 * random.uniform(-2, 2)
chB2 = parent2.BH2 * random.uniform(-2, 2)
chB3 = parent2.BO1 * random.uniform(-2, 2)
g = Network1(ch1H, ch2H, ch1O, chB1, chB2, chB3, 1)
goodNet.append(g)
NewNet = []
در اینجا تلاقی و جهش رخ می دهد. (این گونه نکات در مقاله اول با جزئیات بیشتر توضیح داده شد)
while True:
epoch += 1
print(str(epoch) + " epoch")
for s in goodNet:
timeNN = anp.NNPong(s)
listNet.update({
s : timeNN
})
goodNet =[]
listNet = dict(sorted(listNet.items(), key=lambda item: item[1], reverse=True))
goodNet = list(listNet.keys())
NewNet.append(goodNet[0])
goodNet = list(listNet.values())
for i in listNet:
a = goodNet[0]
if listNet.get(i) == a:
NewNet.append(i)
goodNet = list(NewNet)
listNet = {}
try:
print(NewNet[0].epoch)
anp.NPong(NewNet[0])
print('next')
print(NewNet[1].epoch)
anp.NPong(NewNet[1])
print('next')
print(NewNet[2].epoch)
anp.NPong(NewNet[2])
print('next')
print(NewNet[3].epoch)
anp.NPong(NewNet[3])
print('next')
print(NewNet[4].epoch)
anp.NPong(NewNet[4])
print('next')
print(NewNet[5].epoch)
anp.NPong(NewNet[5])
print('next')
print(NewNet[6].epoch)
anp.NPong(NewNet[6])
print('next')
print(NewNet[7].epoch)
anp.NPong(NewNet[7])
print('next')
except IndexError:
print('that is all')
for g in range(1000 - len(NewNet)):
parent1 = random.choice(NewNet)
parent2 = random.choice(NewNet)
ch1H = np.vstack((parent1.H1[:3], parent2.H1[3:])) * random.uniform(-2, 2)
ch2H = np.vstack((parent1.H2[:6], parent2.H2[6:])) * random.uniform(-2, 2)
ch1O = np.vstack((parent1. O1[:3], parent2. O1[3:])) * random.uniform(-2, 2)
chB1 = parent1.BH1 * random.uniform(-2, 2)
chB2 = parent2.BH2 * random.uniform(-2, 2)
chB3 = parent2.BO1 * random.uniform(-2, 2)
g = Network1(ch1H, ch2H, ch1O, chB1, chB2, chB3, epoch)
goodNet.append(g)
print(len(NewNet))
print(len(goodNet))
NewNet = []
در اینجا ما قبلاً خودمان را تکرار می کنیم ، بنابراین من فقط آنچه قبلاً گفته نشده است را توضیح می دهم:
در اینجا ما اولین مورد در لیست را انتخاب می کنیم، یعنی یکی از بهترین های دوران، و نتایج آن را با بقیه مقایسه می کنیم، زیرا اغلب چندین هوش مصنوعی وجود دارند که به موفقیت یکسانی دست یافته اند. و این رهبران برابر در جهش ها شرکت خواهند کرد، ما از روش تلاش استفاده می کنیم، زیرا ممکن است کمتر از 10 بهترین در این دوره وجود داشته باشد. و همچنین این شبکههای عصبی را بدون تغییر به دوره بعدی میاندازیم، زیرا ممکن است نسلها از اجدادشان بدتر باشند، یعنی از بین نرود.
همه اینها طبق کد اول است!
بریم سراغ کد بازی. در اینجا من فقط آنچه را که مربوط به آموزش هوش مصنوعی است توضیح خواهم داد (من یک پیوند به دیسک ارسال خواهم کرد).
در بازی Pong، شبکه عصبی دو بار بازی کرد: بار اول توپ به سمت چپ پرش می کند، بار دوم – به سمت راست
*whGo یک متغیر در کد است (مخفف “where to go”)
ما زمان را به عنوان تابع تناسب اندام برمی گردانیم. بازی دو عملکرد تقریباً یکسان دارد، اما در دومی ما همه چیز را روی صفحه نمایش می دهیم، این لازم است تا بتوانیم پیشرفت را بعد از هر دوره ببینیم و وقتی شبکه عصبی بازی را کامل کرد، اگر بیشتر طول بکشد این را تعیین می کنیم. بیش از 8000 به روز رسانی در اولین.
پس از ماه ها کار و بهبود، موفق به ایجاد یک الگوریتم یادگیری برای بازی پنگ شدم، اما برای اطمینان، تصمیم گرفتم هوش مصنوعی را نه روی بازی خود، بلکه روی یکی از ساخته شده توسط شخص دیگری آزمایش کنم (تست برای همه چیزخواری)) ))، من بازی Flappy Bird در pygame را از این ویدیو انتخاب کردم: https://youtu.be/7IqrZb0Sotw?feature=shared
برای مثال، با تغییر کمی بازی برای شبکه عصبی، متغیرهایی را برای فاصله پرنده تا لوله اضافه کردم. 3 در 3 وجود دارد، زیرا ما باید ارتفاع هر لوله (y) و فاصله را با x بدانیم، و بیش از سه جفت لوله روی صفحه وجود نداشت، بنابراین سه در سه (در مجموع نه) وجود دارد. . همچنین پس از برخورد، تابع مجدداً راه اندازی شد و پارامتر سوم که rep تابع نامیده می شود، ارسال شد که چه نوع راه اندازی مجدد بود، اگر برابر با سه بود، سپس بازی تابع تناسب اندام را به الگوریتم ژنتیک برمی گرداند. اگر صفر بود، مقدار 0 را به متغیر زمان نسبت می دهیم. همچنین، من دو تابع بسیار مشابه را ننوشتم، اما به سادگی بررسی کردم که آیا متغیر checkNN True است، سپس صفحه باید به روز شود. کد آموزشی را هم اصلاح کردم
while True:
for event in pg.event.get():
if event.type == KEYDOWN:
if event.key == K_1:
showNN = True
epoch += 1
print(str(epoch) + " epoch")
if epoch < 10:
for s in goodNet:
timeNN = anp.NPong(s, False, 0, 0)
listNet.update({
s : timeNN
})
if epoch >= 10:
for s in goodNet:
timeNN = anp.NPong(s, False, 0, 1)
listNet.update({
s : timeNN
})
بعد از دوره دهم، به دلیل آخرین پارامتر که آن را به یک تغییر می دهیم (در کد بازی این پارامتر را varRe از کلمات variant of return نامیدم)، بازی نه زمان، بلکه تعداد لوله های قبل از برخورد را برمی گرداند. به این ترتیب شبکه عصبی بهتر یاد می گیرد)
howALot = 1000 - len(NewNet)
if howALot < 40:
howALot = 40
این سه خط کد مورد نیاز است اگر در دوره قبلی هوش مصنوعی تعداد بسیار بسیار زیادی با نتیجه مشابه وجود داشت و ممکن است الگوریتم یادگیری را متوقف کند، زیرا چیزی برای یادگیری نخواهد داشت :-).
بعد از آن من GA خود را برای FlappyBird به روز کردم و شتاب دادم، اکنون همه پرندگان به طور همزمان راه اندازی می شوند، بنابراین آموزش از ~ 3-5 ساعت به 5-10 دقیقه در هنگام راه اندازی بر روی CPU، یعنی 50 بار افزایش یافت! چگونه کار می کند – پیشنهاد می کنم خودتان ببینید: یک تکرار مفید کوچک از آنچه پوشش داده شده است!
این همه، اگر سوالی دارید، در نظرات بنویسید، خداحافظ!
هنوز خیلی چیزهای جدید پیش روی ماست، این مبنای کارهای بعدی است: اکنون من در حال کار بر روی پیاده سازی هوش مصنوعی کامل با کمک الگوریتم های تکاملی در یک محیط مصنوعی هستم، جالب خواهد بود!
کدها: https://github.com/LanskoyKirill/GenNumPy.git
در سایت من: https://selfrobotics.space/2024/12/13/creating-a-genetic-algorithm-for-a-neural-network-and-a-neural-network-for-graphic-games-and- بازی های ویدیویی با استفاده از پایتون و نامپی/