در این مطلب، ویدئو آموزش هوش مصنوعی برای بازی Snake – دوره آموزشی تقویتی (Python، PyTorch، Pygame) با زیرنویس فارسی را برای دانلود قرار داده ام. شما میتوانید با پرداخت 15 هزار تومان ، این ویدیو به علاوه تمامی فیلم های سایت را دانلود کنید.اکثر فیلم های سایت به زبان انگلیسی می باشند. این ویدئو دارای زیرنویس فارسی ترجمه شده توسط هوش مصنوعی می باشد که میتوانید نمونه ای از آن را در قسمت پایانی این مطلب مشاهده کنید.
مدت زمان فیلم: 1:38:34
تصاویر این ویدئو:
قسمتی از زیرنویس این فیلم:
00:00:00,000 –> 00:00:02,240
پاتریک لوبر یک مربی محبوب پایتون است
2
00:00:02,240 –> 00:00:04,400
و در این دوره
3
00:00:04,400 –> 00:00:06,240
به شما آموزش می دهد که چگونه یک
4
00:00:06,240 –> 00:00:09,760
هوش مصنوعی را برای انجام یک بازی مار با استفاده از
5
00:00:09,760 –> 00:00:12,320
یادگیری تقویتی آموزش دهید سلام بچه ها
6
00:00:12,320 –> 00:00:14,480
امروز یک پروژه بسیار هیجان انگیز برای شما دارم
7
00:00:14,480 –> 00:00:16,560
ما قصد داریم یک هوش مصنوعی بسازیم که
8
00:00:16,560 –> 00:00:19,199
خودش را آموزش می دهد. چگونه مار بازی کنیم و
9
00:00:19,199 –> 00:00:21,279
همه چیز را از ابتدا خواهیم ساخت، بنابراین
10
00:00:21,279 –> 00:00:23,680
با ساخت بازی با pygame
11
00:00:23,680 –> 00:00:26,080
شروع می کنیم و سپس یک عامل و یک
12
00:00:26,080 –> 00:00:29,119
الگوریتم یادگیری عمیق با مشعل پای می سازیم،
13
00:00:29,119 –> 00:00:30,880
همچنین اصول یادگیری تقویتی را به شما آموزش می دهم
14
00:00:30,880 –> 00:00:32,960
که باید
15
00:00:32,960 –> 00:00:35,680
بدانیم چگونه همه اینها کار می کنند، بنابراین
16
00:00:35,680 –> 00:00:37,840
فکر می کنم این بسیار جالب خواهد بود
17
00:00:37,840 –> 00:00:40,399
و اکنون قبل از شروع، اجازه دهید
18
00:00:40,399 –> 00:00:42,719
پروژه نهایی را به شما نشان دهم
19
00:00:42,719 –> 00:00:45,680
تا بتوانم اسکریپت را با گفتن
20
00:00:45,680 –> 00:00:49,840
عوامل پایتون نقطه پی شروع
21
00:00:49,840 –> 00:00:52,000
کنم، اکنون این آموزش عامل ما را شروع می کند
22
00:00:52,000 –> 00:00:55,520
و در اینجا ما می بینیم بازی و سپس در اینجا من
23
00:00:55,520 –> 00:00:58,879
همچنین نمرات و سپس
24
00:00:58,879 –> 00:01:00,559
میانگین امتیاز را ترسیم می کنم
25
00:01:00,559 –> 00:01:04,000
و اکنون اجازه دهید یک کرونومتر نیز راه اندازی کنم تا
26
00:01:04,000 –> 00:01:05,760
بتوانید ببینید که همه اینها به صورت
27
00:01:05,760 –> 00:01:07,200
زنده اتفاق می افتد
28
00:01:07,200 –> 00:01:10,080
و اکنون در این مرحله مار مار ما
29
00:01:10,080 –> 00:01:12,479
در مورد بازی مطلقاً چیزی نیست و
30
00:01:12,479 –> 00:01:14,960
فقط از محیط آگاه است و
31
00:01:14,960 –> 00:01:17,360
سعی می کند چند حرکت کم و بیش تصادفی انجام دهد
32
00:01:17,360 –> 00:01:20,400
اما با هر حرکت و به خصوص
33
00:01:20,400 –> 00:01:23,759
با هر بازی بیشتر و بیشتر یاد می گیرد
34
00:01:23,759 –> 00:01:26,320
و سپس می داند که چگونه بازی را انجام دهد و
35
00:01:26,320 –> 00:01:28,880
باید بهتر شود. و بهتر
36
00:01:28,880 –> 00:01:31,439
است در چند بازی اول
37
00:01:31,439 –> 00:01:33,920
پیشرفت های زیادی نخواهید دید، اما نگران نباشید
38
00:01:33,920 –> 00:01:36,640
که کاملا طبیعی است، می توانم به شما
39
00:01:36,640 –> 00:01:39,840
بگویم که حدود 80 تا 100 بازی طول می کشد
40
00:01:39,840 –> 00:01:43,360
تا زمانی که ai ما یک استراتژی بازی خوب داشته باشد
41
00:01:43,360 –> 00:01:46,399
و این حدود 10 بازی طول می کشد. چند دقیقه
42
00:01:46,399 –> 00:01:49,680
همچنین برای این کار نیازی به gpu ندارید، بنابراین
43
00:01:49,680 –> 00:01:52,000
همه این آموزشها میتواند روی این cpu اتفاق بیفتد
44
00:01:52,000 –> 00:01:54,640
که کاملاً خوب است،
45
00:01:54,640 –> 00:01:56,799
بنابراین اجازه دهید من کمی سرعت این کار را
46
00:01:56,799 –> 00:01:59,270
47
00:01:59,270 –> 00:02:05,329
[Music]
48
00:02:07,730 –> 00:02:16,080
[Music] افزایش
49
00:02:16,080 –> 00:02:18,720
دهم، بنابراین اکنون حدود 10 دقیقه
50
00:02:18,720 –> 00:02:22,800
گذشته است. ما تقریباً در بازی 90 هستیم
51
00:02:22,800 –> 00:02:25,280
حدس میزنم و اکنون میتوانیم به وضوح ببینیم که
52
00:02:25,280 –> 00:02:27,840
مار ما میداند چه کاری باید انجام دهد،
53
00:02:27,840 –> 00:02:30,239
بنابراین کم و بیش مستقیم به سمت
54
00:02:30,239 –> 00:02:33,599
غذا میرود و سعی میکند به مرزها برخورد
55
00:02:33,599 –> 00:02:36,720
نکند، بنابراین در این مرحله کامل نیست، اما
56
00:02:36,720 –> 00:02:38,720
میتوانیم ببینیم که داره بهتر و
57
00:02:38,720 –> 00:02:39,840
بهتر میشه
58
00:02:39,840 –> 00:02:43,200
بنابراین ما همچنین می بینیم که میانگین امتیاز
59
00:02:43,200 –> 00:02:46,720
در اینجا در حال افزایش است و در حال حاضر
60
00:02:46,720 –> 00:02:49,760
بهترین امتیاز تا کنون بوده است
61
00:02:49,760 –> 00:02:52,160
و صادقانه بگویم این برای من فوق العاده
62
00:02:52,160 –> 00:02:54,239
هیجان انگیز است بنابراین اگر تصور کنید که در
63
00:02:54,239 –> 00:02:56,879
ابتدا مار ما چیزی
64
00:02:56,879 –> 00:02:59,280
در مورد بازی نمی دانست و اکنون با
65
00:02:59,280 –> 00:03:02,080
کمی ریاضی در پشت صحنه، به وضوح
66
00:03:02,080 –> 00:03:04,400
از یک استراتژی پیروی می کند،
67
00:03:04,400 –> 00:03:06,560
بنابراین این بسیار جالب است، فکر نمی
68
00:03:06,560 –> 00:03:08,800
کنید خوب است، اجازه دهید من این کار را کمی بیشتر تسریع کنم
69
00:03:08,800 –> 00:03:12,360
70
00:03:13,650 –> 00:03:18,080
[موسیقی
71
00:03:21,519 –> 00:03:25,360
] خیلی خوب است، بنابراین بعد از 12 دقیقه مار ما
72
00:03:25,360 –> 00:03:28,080
است. بهتر و بهتر میشود، بنابراین فکر
73
00:03:28,080 –> 00:03:30,080
میکنم به وضوح میتوانید ببینید که الگوریتم ما
74
00:03:30,080 –> 00:03:31,120
کار میکند،
75
00:03:31,120 –> 00:03:34,879
بنابراین اجازه دهید من این کار را متوقف کنم و سپس
76
00:03:34,879 –> 00:03:36,879
با تئوری شروع میکنیم،
77
00:03:36,879 –> 00:03:39,120
بنابراین
78
00:03:39,120 –> 00:03:41,760
در این ویدیوی اول مجموعه را به چهار قسمت تقسیم میکنم که
79
00:03:41,760 –> 00:03:43,599
کمی در مورد تئوری یاد میگیریم.
80
00:03:43,599 –> 00:03:46,000
یادگیری تقویتی در قسمت دوم
81
00:03:46,000 –> 00:03:48,959
بازی واقعی
82
00:03:48,959 –> 00:03:51,360
یا محیط را در اینجا با
83
00:03:51,360 –> 00:03:52,560
pygame
84
00:03:52,560 –> 00:03:54,959
پیاده سازی می کنیم سپس agent را پیاده سازی می کنیم تا
85
00:03:54,959 –> 00:03:57,280
در یک ثانیه به شما بگویم که این یعنی چه و
86
00:03:57,280 –> 00:03:59,599
در قسمت آخر مدل واقعی را با pytorch پیاده سازی می
87
00:03:59,599 –> 00:04:01,760
کنیم.
88
00:04:01,760 –> 00:04:04,080
بنابراین بیایید با کمی
89
00:04:04,080 –> 00:04:07,280
تئوری در مورد یادگیری تقویتی شروع کنیم،
90
00:04:07,280 –> 00:04:10,239
بنابراین این تعریف ویکیپدیا است،
91
00:04:10,239 –> 00:04:13,120
بنابراین یادگیری تقویتی حوزهای از
92
00:04:13,120 –> 00:04:15,519
یادگیری ماشینی است که به این موضوع مربوط میشود که چگونه
93
00:04:15,519 –> 00:04:18,320
عوامل نرمافزار باید اقداماتی را در
94
00:04:18,320 –> 00:04:21,040
یک محیط انجام دهند تا
95
00:04:21,040 –> 00:04:24,479
مفهوم پاداش تجمعی را به حداکثر برسانند. این
96
00:04:24,479 –> 00:04:27,120
ممکن است کمی پیچیده به نظر برسد، بنابراین
97
00:04:27,120 –> 00:04:29,120
به عبارت دیگر میتوانیم بگوییم که
98
00:04:29,120 –> 00:04:31,680
یادگیری تقویتی به یک عامل نرمافزار آموزش میدهد که
99
00:04:31,680 –> 00:04:34,240
چگونه در یک
100
00:04:34,240 –> 00:04:36,560
محیط رفتار کند، با گفتن اینکه چقدر خوب است.
101
00:04:36,560 –> 00:04:37,520
102
00:04:37,520 –> 00:04:39,919
103
00:04:39,919 –> 00:04:42,400
این اساساً
104
00:04:42,400 –> 00:04:45,280
پخش کننده رایانه ما است، پس ما یک
105
00:04:45,280 –> 00:04:48,240
محیط داریم، بنابراین این بازی ما در این
106
00:04:48,240 –> 00:04:49,199
مورد است
107
00:04:49,199 –> 00:04:51,919
و سپس به نماینده یک جایزه می دهیم، بنابراین
108
00:04:51,919 –> 00:04:55,360
با این کار به او می گوییم که چقدر خوب انجام می دهد
109
00:04:55,360 –> 00:04:58,560
و سپس بر اساس پاداش آنها باید
110
00:04:58,560 –> 00:05:02,240
سعی کند بهترین بازی بعدی را پیدا کند.
111
00:05:02,240 –> 00:05:05,039
عمل، بله، یادگیری تقویتی است
112
00:05:05,039 –> 00:05:08,720
و برای آموزش عامل،
113
00:05:08,720 –> 00:05:11,120
رویکردهای مختلفی وجود دارد و همه
114
00:05:11,120 –> 00:05:14,160
آنها شامل یادگیری عمیق نیستند، اما در مورد
115
00:05:14,160 –> 00:05:16,960
ما ما از یادگیری عمیق استفاده می کنیم و به
116
00:05:16,960 –> 00:05:20,320
آن یادگیری q تند نیز می گویند، بنابراین این
117
00:05:20,320 –> 00:05:22,800
رویکرد یادگیری تقویتی را
118
00:05:22,800 –> 00:05:25,120
با استفاده از یک شبکه عصبی عمیق برای
119
00:05:25,120 –> 00:05:27,360
پیش بینی اقدامات گسترش می دهد و ما
120
00:05:27,360 –> 00:05:30,080
در این آموزش از آن استفاده خواهیم کرد،
121
00:05:30,080 –> 00:05:32,240
بنابراین اجازه دهید یک نمای کلی را به شما نشان دهم.
122
00:05:32,240 –> 00:05:35,360
از نحوه سازماندهی کد به طوری
123
00:05:35,360 –> 00:05:38,400
که همانطور که گفتم چهار قسمت داریم بنابراین در
124
00:05:38,400 –> 00:05:40,960
قسمت بعدی بازی را با
125
00:05:40,960 –> 00:05:44,479
بازی پای پیاده سازی می کنیم سپس عامل را پیاده سازی می کنیم و
126
00:05:44,479 –> 00:05:46,880
سپس مدل را با مشعل پای پیاده سازی می کنیم
127
00:05:46,880 –> 00:05:48,160
128
00:05:48,160 –> 00:05:49,039
بنابراین
129
00:05:49,039 –> 00:05:52,880
بازی ما باید به این صورت اختصاص داده شود. که
130
00:05:52,880 –> 00:05:55,840
ما یک حلقه بازی داریم و سپس با هر
131
00:05:55,840 –> 00:05:58,880
حلقه بازی یک مرحله بازی انجام می دهیم
132
00:05:58,880 –> 00:06:01,199
که یک اکشن می گیرد
133
00:06:01,199 –> 00:06:04,960
و سپس یک مرحله انجام می دهد تا مار را حرکت دهد
134
00:06:04,960 –> 00:06:08,080
و بعد از حرکت
135
00:06:08,080 –> 00:06:10,960
پاداش فعلی را برمی گرداند و اگر بازی
136
00:06:10,960 –> 00:06:13,360
تمام شد یا نه و سپس امتیاز فعلی،
137
00:06:13,360 –> 00:06:14,720
138
00:06:14,720 –> 00:06:19,039
سپس ما نماینده را داریم و عامل
139
00:06:19,039 –> 00:06:21,600
اساساً همه چیز را کنار هم قرار می دهد
140
00:06:21,600 –> 00:06:24,639
، به همین دلیل باید در مورد بازی
141
00:06:24,639 –> 00:06:27,039
بداند و همچنین از مدل اطلاع داشته باشد، بنابراین
142
00:06:27,039 –> 00:06:30,960
هر دوی آنها را در عامل خود ذخیره می کنیم و
143
00:06:30,960 –> 00:06:33,600
سپس آموزش را پیاده سازی می کنیم. حلقه g بنابراین
144
00:06:33,600 –> 00:06:36,479
این تقریباً همان کاری است که ما باید انجام دهیم،
145
00:06:36,479 –> 00:06:37,600
بنابراین
146
00:06:37,600 –> 00:06:40,800
بر اساس بازی باید یک حالت را محاسبه کنیم
147
00:06:40,800 –> 00:06:42,240
148
00:06:42,240 –> 00:06:45,680
و سپس بر اساس حالتی که ما
149
00:06:45,680 –> 00:06:48,400
عمل بعدی را محاسبه می کنیم
150
00:06:48,400 –> 00:06:52,720
و این شامل فراخوانی مدل پیش بینی است
151
00:06:52,720 –> 00:06:55,280
و سپس با این عمل جدید،
152
00:06:55,280 –> 00:06:59,599
ما یک حالت بعدی را انجام می دهیم. مرحله بازی و سپس همانطور که
153
00:06:59,599 –> 00:07:02,880
گفتم ما یک جایزه می گیریم overstate بازی
154
00:07:02,880 –> 00:07:04,160
و امتیاز
155
00:07:04,160 –> 00:07:06,319
و حالا با این اطلاعات
156
00:07:06,319 –> 00:07:09,280
یک حالت جدید را محاسبه می کنیم
157
00:07:09,280 –> 00:07:12,080
و سپس همه اینها را به خاطر می آوریم بنابراین
158
00:07:12,080 –> 00:07:15,440
حالت جدید و حالت قدیمی
159
00:07:15,440 –> 00:07:18,479
و بازی را روی حالت ذخیره می کنیم و امتیاز
160
00:07:18,479 –> 00:07:22,319
و با این کار ما مدل خود را آموزش می دهیم
161
00:07:22,319 –> 00:07:25,599
بنابراین برای مدل من این شبکه q خطی را می نامم
162
00:07:25,599 –> 00:07:27,840
بنابراین این خیلی پیچیده نیست،
163
00:07:27,840 –> 00:07:30,960
این فقط یک شبکه عصبی پیشرو
164
00:07:30,960 –> 00:07:35,199
با چند لایه خطی است و
165
00:07:35,199 –> 00:07:38,080
باید این اطلاعات را داشته باشد تا جدید
166
00:07:38,080 –> 00:07:41,199
حالت و حالت قدیمی و سپس میتوانیم
167
00:07:41,199 –> 00:07:44,080
مدل را آموزش دهیم و میتوانیم مدل
168
00:07:44,080 –> 00:07:45,120
پیشبینی را صدا کنیم
169
00:07:45,120 –> 00:07:48,560
و سپس این عمل بعدی را به ما میدهد، بنابراین
170
00:07:48,560 –> 00:07:49,919
بله، این
171
00:07:49,919 –> 00:07:52,160
یک نمای کلی است که کد باید
172
00:07:52,160 –> 00:07:54,639
چگونه باشد و اکنون اجازه دهید در مورد برخی
173
00:07:54,639 –> 00:07:57,680
از آن متغیرها در موارد بیشتر صحبت کنیم. جزئیات برای
174
00:07:57,680 –> 00:08:01,039
به عنوان مثال عمل یا وضعیت یا
175
00:08:01,039 –> 00:08:02,160
پاداش،
176
00:08:02,160 –> 00:08:04,639
بنابراین بیایید با پاداش شروع کنیم، بنابراین این کار
177
00:08:04,639 –> 00:08:05,919
بسیار آسان است،
178
00:08:05,919 –> 00:08:09,360
بنابراین هر زمان که مار ما غذایی می خورد،
179
00:08:09,360 –> 00:08:13,120
زمانی که
180
00:08:13,120 –> 00:08:16,639
بازی به پایان می رسد به او جایزه به اضافه 10 می دهیم، بنابراین وقتی می میریم، پس از آن 10-
181
00:08:16,639 –> 00:08:19,039
و برای همه چیز می گیریم. در غیر این صورت، ما فقط روی
182
00:08:19,039 –> 00:08:21,680
صفر می مانیم، بنابراین این بسیار ساده است،
183
00:08:21,680 –> 00:08:24,960
سپس عمل را داریم، بنابراین عمل
184
00:08:24,960 –> 00:08:27,680
حرکت بعدی ما را تعیین می کند،
185
00:08:27,680 –> 00:08:30,479
بنابراین می توانیم فکر کنیم که چهار
186
00:08:30,479 –> 00:08:33,839
عمل مختلف داریم که چپ و راست
187
00:08:33,839 –> 00:08:35,360
بالا و پایین هستند،
188
00:08:35,360 –> 00:08:38,799
اما اگر آن را به این شکل طراحی کنیم، برای
189
00:08:38,799 –> 00:08:41,440
مثال چه چیزی می تواند اتفاق می افتد این است که اگر ما به
190
00:08:41,440 –> 00:08:44,560
سمت راست برویم، ممکن است عمل را به سمت چپ انجام دهیم
191
00:08:44,560 –> 00:08:47,920
و سپس بلافاصله می میریم، بنابراین این
192
00:08:47,920 –> 00:08:51,360
اساساً یک چرخش 180 درجه است،
193
00:08:51,360 –> 00:08:53,839
بنابراین ما اجازه نمی دهیم، بنابراین یک
194
00:08:53,839 –> 00:08:56,959
رویکرد بهتر برای طراحی اکشن این است که فقط
195
00:08:56,959 –> 00:08:58,000
از
196
00:08:58,000 –> 00:09:00,399
سه عدد مختلف استفاده کنیم
197
00:09:00,399 –> 00:09:04,160
و اکنون این بستگی به جهت فعلی
198
00:09:04,160 –> 00:09:05,440
دارد
199
00:09:05,440 –> 00:09:06,480
بنابراین
200
00:09:06,480 –> 00:09:10,320
um 1 صفر صفر به این معنی است که ما در
201
00:09:10,320 –> 00:09:13,040
جهت فعلی می مانیم پس مستقیم می رویم پس
202
00:09:13,040 –> 00:09:15,839
این بدان معنی است که اگر به راست برویم پس
203
00:09:15,839 –> 00:09:19,120
اگر به چپ برویم راست می مانیم سپس به چپ می رویم و
204
00:09:19,120 –> 00:09:20,240
به همین
205
00:09:20,240 –> 00:09:24,720
ترتیب اگر 0 داشته باشیم 1 0 به این معنی است که ما یک را انجام می دهیم
206
00:09:24,720 –> 00:09:27,200
چرخش به راست و دوباره این بستگی به
207
00:09:27,200 –> 00:09:30,560
جهت فعلی دارد، بنابراین اگر به راست برویم
208
00:09:30,560 –> 00:09:33,200
و یک گردش به راست انجام دهیم،
209
00:09:33,200 –> 00:09:36,560
سپس اگر پایین برویم و
210
00:09:36,560 –> 00:09:38,720
دوباره به راست بپیچیم، سپس به چپ میرویم و سپس
211
00:09:38,720 –> 00:09:40,640
دوباره بالا میرویم،
212
00:09:40,640 –> 00:09:43,120
بنابراین این گردش به راست و گردش به
213
00:09:43,120 –> 00:09:45,360
چپ برعکس است، بنابراین اگر به
214
00:09:45,360 –> 00:09:48,880
چپ برویم و یک گردش به چپ انجام دهیم، به پایین میرویم
215
00:09:48,880 –> 00:09:51,680
و به همین ترتیب با این رویکرد
216
00:09:51,680 –> 00:09:55,200
نمیتوانیم یک چرخش 180 درجه انجام دهیم و
217
00:09:55,200 –> 00:09:57,680
همچنین فقط باید سه حالت مختلف را پیشبینی کنیم.
218
00:09:57,680 –> 00:10:00,240
بنابراین این کار را
219
00:10:00,240 –> 00:10:02,640
برای مدل ما کمی آسانتر میکند،
220
00:10:02,640 –> 00:10:05,680
بنابراین اکنون ما پاداش و عمل را
221
00:10:05,680 –> 00:10:09,120
داریم، سپس باید حالت را نیز محاسبه کنیم
222
00:10:09,120 –> 00:10:12,079
و حالت به این معنی است که
223
00:10:12,079 –> 00:10:14,640
باید اطلاعاتی را در
224
00:10:14,640 –> 00:10:17,360
مورد بازی که میداند به مار خود بگوییم. باید
225
00:10:17,360 –> 00:10:19,600
در مورد محیط زیست بداند
226
00:10:19,600 –> 00:10:24,160
و در این مورد حالت ما دارای 11 مقدار است
227
00:10:24,160 –> 00:10:26,800
بنابراین اگر
228
00:10:26,800 –> 00:10:29,839
خطر مستقیم است یا اگر جلوتر است اگر
229
00:10:29,839 –> 00:10:33,440
خطر درست است یا اگر خطر چپ است اطلاعات دارد
230
00:10:33,440 –> 00:10:37,519
پس جهت فعلی را
231
00:10:37,519 –> 00:10:41,120
دارد. چپ راست بالا و پایین
232
00:10:41,120 –> 00:10:44,079
و سپس آن را در هکتار اطلاعاتی است که اگر
233
00:10:44,079 –> 00:10:48,000
غذا در سمت چپ یا راست یا بالا یا پایین باشد
234
00:10:48,000 –> 00:10:51,440
و همه اینها مقادیر بولی هستند، بنابراین
235
00:10:51,440 –> 00:10:54,399
اجازه دهید یک مثال واقعی به شما نشان دهم، بنابراین در
236
00:10:54,399 –> 00:10:55,760
این مورد
237
00:10:55,760 –> 00:10:59,440
اگر ما درست پیش می رویم و غذای ما
238
00:10:59,440 –> 00:11:00,640
اینجاست،
239
00:11:00,640 –> 00:11:04,160
ما خطر را مستقیماً می بینیم.
240
00:11:04,160 –> 00:11:06,560
و هیچکدام از اینها درست
241
00:11:06,560 –> 00:11:07,920
نیست،
242
00:11:07,920 –> 00:11:12,079
به عنوان مثال اگر مار ما اینجا در
243
00:11:12,079 –> 00:11:16,320
این انتها باشد و هنوز درست پیش میرود،
244
00:11:16,320 –> 00:11:21,040
خطر مستقیم خواهد بود،
245
00:11:21,040 –> 00:11:23,680
بنابراین این باز هم به جهت فعلی بستگی دارد،
246
00:11:23,680 –> 00:11:27,120
برای مثال اگر
247
00:11:27,120 –> 00:11:30,000
در این گوشه اینجا حرکت کنیم.
248
00:11:30,000 –> 00:11:33,839
در این صورت حق خطر a1 خواهد بود،
249
00:11:33,839 –> 00:11:36,880
پس برای این جهت ها فقط یکی از
250
00:11:36,880 –> 00:11:39,920
آنها یک است و بقیه همیشه صفر است،
251
00:11:39,920 –> 00:11:43,200
بنابراین در این مورد ما حق خطر را روی
252
00:11:43,200 –> 00:11:44,240
یک تنظیم می کنیم
253
00:11:44,240 –> 00:11:47,760
و سپس برای این مورد در مورد ما غذای ما
254
00:11:47,760 –> 00:11:51,040
سمت راست مار و همچنین پایین است.
255
00:11:51,040 –> 00:11:54,880
از مار، بنابراین غذا درست یکی است و غذا
256
00:11:54,880 –> 00:11:57,360
به عنوان یکی کاملاً درست است، بنابراین اکنون با
257
00:11:57,360 –> 00:12:00,880
وضعیت و عمل می توانیم مدل خود را طراحی کنیم،
258
00:12:00,880 –> 00:12:03,839
بنابراین این فقط یک
259
00:12:03,839 –> 00:12:07,040
شبکه عصبی پیشخور است با یک لایه ورودی، یک لایه پنهان
260
00:12:07,040 –> 00:12:11,279
و یک لایه خروجی و برای
261
00:12:11,279 –> 00:12:14,720
ورودی آن حالت را به صورت i می گیرد گفت:
262
00:12:14,720 –> 00:12:18,160
ما 11 عدد مختلف در حالت خود داریم
263
00:12:18,160 –> 00:12:22,160
11 مقدار بولی مختلف صفر یا یک،
264
00:12:22,160 –> 00:12:25,600
بنابراین در ابتدا به این اندازه 11 نیاز داریم،
265
00:12:25,600 –> 00:12:29,200
سپس میتوانیم یک اندازه um پنهان را انتخاب کنیم
266
00:12:29,200 –> 00:12:33,040
و برای خروجی به سه خروجی نیاز داریم
267
00:12:33,040 –> 00:12:36,399
زیرا پس از آن عمل را پیشبینی میکنیم تا
268
00:12:36,399 –> 00:12:39,279
بتوانیم برخی از اعداد باشند
269
00:12:39,279 –> 00:12:42,240
و اینها نیازی به احتمال
270
00:12:42,240 –> 00:12:44,959
ندارند، بنابراین در اینجا می توانیم اعداد خام داشته باشیم و سپس
271
00:12:44,959 –> 00:12:47,680
به سادگی ماکزیمم را انتخاب می کنیم، برای
272
00:12:47,680 –> 00:12:49,279
مثال
273
00:12:49,279 –> 00:12:53,440
اگر 1 0 صفر را بگیریم و اگر به عقب برگردیم، می
274
00:12:53,440 –> 00:12:56,320
بینیم که این عمل مستقیم خواهد بود.
275
00:12:56,320 –> 00:12:58,720
جهت فعلی را حفظ کنید،
276
00:12:58,720 –> 00:13:02,320
بنابراین بله، مدل ما اینگونه به نظر می رسد
277
00:13:02,320 –> 00:13:05,920
و البته اکنون باید مدل را آموزش دهیم،
278
00:13:05,920 –> 00:13:06,880
279
00:13:06,880 –> 00:13:09,120
بنابراین برای این، بیایید کمی
280
00:13:09,120 –> 00:13:12,560
در مورد یادگیری عمیق q صحبت کنیم،
281
00:13:12,560 –> 00:13:13,920
بنابراین q
282
00:13:13,920 –> 00:13:17,040
مخفف این مقدار q است و این
283
00:13:17,040 –> 00:13:20,800
نشان دهنده کیفیت است.
284
00:13:20,800 –> 00:13:23,120
پس این چیزی است که ما میخواهیم آن را بهبود ببخشیم، بنابراین
285
00:13:23,120 –> 00:13:26,639
هر عمل باید کیفیت snake را بهبود بخشد،
286
00:13:26,639 –> 00:13:28,880
287
00:13:28,880 –> 00:13:32,480
بنابراین با مقداردهی q شروع میکنیم،
288
00:13:32,480 –> 00:13:35,200
بنابراین در این مورد مدل خود را
289
00:13:35,200 –> 00:13:37,760
با برخی پارامترهای تصادفی مقداردهی اولیه
290
00:13:37,760 –> 00:13:41,360
میکنیم سپس یک عمل را با calli انتخاب میکنیم.
291
00:13:41,360 –> 00:13:44,480
مدل ng حالت پیشبینی میکند و ما
292
00:13:44,480 –> 00:13:47,440
گاهی اوقات یک حرکت تصادفی را انتخاب میکنیم، بنابراین
293
00:13:47,440 –> 00:13:49,760
این کار را در ابتدای کار انجام میدهیم، زمانی که
294
00:13:49,760 –> 00:13:52,560
هنوز اطلاعات زیادی در مورد بازی نداریم،
295
00:13:52,560 –> 00:13:53,839
296
00:13:53,839 –> 00:13:56,720
بنابراین بعداً وقتی نمیخواهیم باید یک مبادله
297
00:13:56,720 –> 00:13:59,279
انجام دهیم. برای انجام یک حرکت تصادفی
298
00:13:59,279 –> 00:14:03,120
دیگر و فقط فراخوانی مدل پیش بینی
299
00:14:03,120 –> 00:14:06,000
و به این نیز مبادله
300
00:14:06,000 –> 00:14:10,079
بین اکتشاف و بهره برداری گفته می شود،
301
00:14:10,079 –> 00:14:12,959
بنابراین زمانی که
302
00:14:12,959 –> 00:14:15,040
کدگذاری واقعی را انجام می دهیم این موضوع بعدا واضح تر می شود،
303
00:14:15,040 –> 00:14:18,480
بنابراین با این عمل جدید
304
00:14:18,480 –> 00:14:21,440
این عمل را انجام می دهیم تا حرکت بعدی
305
00:14:21,440 –> 00:14:24,639
و سپس پاداش را اندازه گیری می کنیم و با
306
00:14:24,639 –> 00:14:27,440
این اطلاعات می توانیم مقدار q خود را به روز کنیم
307
00:14:27,440 –> 00:14:30,480
و سپس مدل را آموزش دهیم و سپس
308
00:14:30,480 –> 00:14:32,560
این مرحله را تکرار می کنیم بنابراین این یک
309
00:14:32,560 –> 00:14:34,000
310
00:14:34,000 –> 00:14:37,920
حلقه آموزشی تکراری است بنابراین اکنون برای آموزش مدل
311
00:14:37,920 –> 00:14:41,040
مانند همیشه باید نوعی داشته باشیم. از
312
00:14:41,040 –> 00:14:44,639
تابع ضرری که میخواهیم آن را بهینه
313
00:14:44,639 –> 00:14:47,839
یا کمینه کنیم، بنابراین برای تابع
314
00:14:47,839 –> 00:14:51,040
ضرر باید کمی ریاضی را بررسی کنیم و
315
00:14:51,040 –> 00:14:53,199
برای این منظور میخواهم معادله بلمونت را به شما ارائه دهم
316
00:14:53,199 –> 00:14:55,920
317
00:14:55,920 –> 00:14:59,120
تا ترسناک به نظر برسد، پس
318
00:14:59,120 –> 00:15:01,440
نترسید. در اینجا من این را توضیح خواهم داد همه چیز
319
00:15:01,440 –> 00:15:03,920
و در واقع آنقدرها سخت نیست
320
00:15:03,920 –> 00:15:06,560
که ما این را بفهمیم و بعداً آن را کدگذاری
321
00:15:06,560 –> 00:15:07,920
کنیم،
322
00:15:07,920 –> 00:15:08,800
بنابراین
323
00:15:08,800 –> 00:15:10,639
آنچه می خواهیم اینجا انجام دهیم باید
324
00:15:10,639 –> 00:15:14,399
مقدار q را همانطور که در اینجا گفتم به روز کنیم بنابراین
325
00:15:14,399 –> 00:15:16,720
با توجه به معادله بلمونت
326
00:15:16,720 –> 00:15:19,760
مقدار q جدید به این صورت محاسبه می شود.
327
00:15:19,760 –> 00:15:22,800
ما مقدار q فعلی را
328
00:15:22,800 –> 00:15:24,160
به اضافه
329
00:15:24,160 –> 00:15:26,399
نرخ یادگیری داریم و سپس
330
00:15:26,399 –> 00:15:29,759
پاداش انجام آن عمل در آن
331
00:15:29,759 –> 00:15:30,959
حالت را
332
00:15:30,959 –> 00:15:33,920
به اضافه یک پارامتر گاما داریم که این نرخ شمارش نامیده میشود،
333
00:15:33,920 –> 00:15:36,079
بنابراین نگران این نباشید،
334
00:15:36,079 –> 00:15:38,480
این را نیز بعداً در کد نشان خواهم داد.
335
00:15:38,480 –> 00:15:39,680
336
00:15:39,680 –> 00:15:42,720
و سپس ما حداکثر
337
00:15:42,720 –> 00:15:44,480
پاداش مورد انتظار آینده را
338
00:15:44,480 –> 00:15:47,519
با توجه به وضعیت جدید و همه
339
00:15:47,519 –> 00:15:50,160
اقدامات ممکن در آن وضعیت جدید می گیریم،
340
00:15:50,160 –> 00:15:51,199
بنابراین
341
00:15:51,199 –> 00:15:53,279
بله، ترسناک به نظر می رسد، اما من
342
00:15:53,279 –> 00:15:55,360
آن را برای شما ساده می کنم و سپس در
343
00:15:55,360 –> 00:15:57,360
واقع آنقدرها هم سخت
344
00:15:57,360 –> 00:16:01,920
نیست، بنابراین مقدار q قدیمی، مدل پیش بینی با
345
00:16:01,920 –> 00:16:04,000
حالت است. 0،
346
00:16:04,000 –> 00:16:06,480
بنابراین اگر به
347
00:16:06,480 –> 00:16:09,920
این نمای کلی برگردیم، اولین بار که می
348
00:16:09,920 –> 00:16:12,720
گوییم وضعیت را از بازی بگیرید، این حالت ما
349
00:16:12,720 –> 00:16:14,320
0 است
350
00:16:14,320 –> 00:16:17,519
و سپس پس از برداشتن این مرحله از مکان،
351
00:16:17,519 –> 00:16:20,880
دوباره حالت بعدی را اندازه گیری یا محاسبه می کنیم،
352
00:16:20,880 –> 00:16:24,720
بنابراین این حالت st ما است.
353
00:16:24,720 –> 00:16:28,320
پس با این اطلاعات دوباره صف اول ما
354
00:16:28,320 –> 00:16:29,680
355
00:16:29,680 –> 00:16:33,279
فقط پیش بینی مدل با حالت قدیمی است
356
00:16:33,279 –> 00:16:35,759
و سپس صف جدید پاداش
357
00:16:35,759 –> 00:16:38,320
به اضافه مقدار گامای ما
358
00:16:38,320 –> 00:16:41,519
ضربدر حداکثر مقدار
359
00:16:41,519 –> 00:16:45,279
حالت q است بنابراین دوباره این پیش بینی مدل است
360
00:16:45,279 –> 00:16:48,399
اما این بار حالت را می گیریم. یکی
361
00:16:48,399 –> 00:16:51,199
و سپس با این دو اطلاعات،
362
00:16:51,199 –> 00:16:53,040
ضرر ما به
363
00:16:53,040 –> 00:16:56,880
سادگی q جدید منهای q مربع است
364
00:16:56,880 –> 00:16:59,519
و بله، این چیزی نیست جز
365
00:16:59,519 –> 00:17:02,639
میانگین مربعات خطا، بنابراین این یک
366
00:17:02,639 –> 00:17:04,559
خطای بسیار ساده است که ما از قبل باید
367
00:17:04,559 –> 00:17:07,199
درباره آن بدانیم و سپس این همان چیزی است که باید
368
00:17:07,199 –> 00:17:09,439
در مورد خود استفاده کنیم. بهینه سازی
369
00:17:09,439 –> 00:17:11,760
پس بله این چیزی است که ما قرار است از
370
00:17:11,760 –> 00:17:13,359
آن استفاده کنیم بنابراین باید
371
00:17:13,359 –> 00:17:17,280
همه این سه کلاس را پیاده سازی کنیم
372
00:17:17,280 –> 00:17:20,240
و در ویدیوی بعدی با
373
00:17:20,240 –> 00:17:23,760
اجرای بازی
374
00:17:26,959 –> 00:17:28,799
در قسمت آخر شروع می کنیم تمام
375
00:17:28,799 –> 00:17:31,120
تئوری های لازم را که برای شروع باید بدانیم به
376
00:17:31,120 –> 00:17:34,000
شما نشان دادم. با یادگیری عمیق q
377
00:17:34,000 –> 00:17:36,559
و اکنون شروع به پیاده سازی همه
378
00:17:36,559 –> 00:17:39,840
قسمت ها می کنیم بنابراین همانطور که گفتم باید یک
379
00:17:39,840 –> 00:17:42,640
بازی داشته باشیم پس محیط و سپس به یک
380
00:17:42,640 –> 00:17:45,280
عامل و یک مدل نیاز داریم
381
00:17:45,280 –> 00:17:48,000
بنابراین در این قسمت با پیاده سازی بازی شروع می کنیم
382
00:17:48,000 –> 00:17:52,080
و ما از pytorch برای این کار استفاده می کنیم،
383
00:17:52,080 –> 00:17:52,960
بنابراین
384
00:17:52,960 –> 00:17:56,400
اجازه دهید در واقع با ایجاد یک محیط شروع کنم
385
00:17:56,400 –> 00:17:58,960
و تمام
386
00:17:58,960 –> 00:18:02,000
وابستگی های لازم را که نیاز داریم نصب می کنیم،
387
00:18:02,000 –> 00:18:06,240
بنابراین در این مورد من از conda برای
388
00:18:06,240 –> 00:18:08,640
مدیریت محیط ها استفاده می کنم و اگر نمی دانید
389
00:18:08,640 –> 00:18:11,280
چگونه از conda استفاده کنید، من یک آموزش
390
00:18:11,280 –> 00:18:13,600
برای شما که من اینجا لینک می کنم
391
00:18:13,600 –> 00:18:16,080
اما بله اگر نمی خواهید از کانر استفاده
392
00:18:16,080 –> 00:18:18,400
کنید می توانید فقط از یک مجازی معمولی استفاده کنید
393
00:18:18,400 –> 00:18:22,720
و من توصیه می کنم از مجازی استفاده کنید
394
00:18:22,720 –> 00:18:26,080
و حالا بیایید یک مجازی ایجاد کنیم و با
395
00:18:26,080 –> 00:18:29,360
conda منهای n را ایجاد کنیم و سپس به آن یک
396
00:18:29,360 –> 00:18:33,440
نام برای مثال pi game n بدهید و من هم
397
00:18:33,440 –> 00:18:38,559
میگویم میخواهم پایتون برابر با 3.7 باشد،
398
00:18:38,559 –> 00:18:41,360
بنابراین اکنون این ایجاد شده است، بنابراین اکنون
399
00:18:41,360 –> 00:18:44,080
میخواهیم آن را با
400
00:18:44,080 –> 00:18:47,679
فعال کردن conda و سپس پای بازی n فعال کنیم و اینتر
401
00:18:47,679 –> 00:18:49,760
را بزنید و سپس نام آن را میبینیم.
402
00:18:49,760 –> 00:18:52,000
محیط جلویی به این معنی است
403
00:18:52,000 –> 00:18:54,799
که ما آن را با موفقیت فعال کردیم و
404
00:18:54,799 –> 00:18:57,520
اکنون میتوانیم شروع به نصب تمام موارد مورد
405
00:18:57,520 –> 00:18:59,840
نیاز خود کنیم، بنابراین اولین چیزی که میخواهیم
406
00:18:59,840 –> 00:19:04,240
نصب کنیم بازی پای بازی است، بنابراین بازی Pip
407
00:19:04,240 –> 00:19:08,400
install pie را بزنید و اینتر را بزنید
408
00:19:08,400 –> 00:19:11,280
تا این کار انجام شود. چیزی که ما نیاز
409
00:19:11,280 –> 00:19:15,280
داریم pytorch fo است مدل ما بعداً برای
410
00:19:15,280 –> 00:19:18,080
این کار ما می توانیم به صفحه اصلی رسمی
411
00:19:18,080 –> 00:19:20,160
و در هنگام نصب برویم
412
00:19:20,160 –> 00:19:22,480
و سپس در اینجا می توانید سیستم عامل خود را انتخاب کنید
413
00:19:22,480 –> 00:19:25,760
بنابراین من از مک استفاده می
414
00:19:25,760 –> 00:19:29,039
کنم و در واقع می خواهم بگویم نصب pip
415
00:19:29,039 –> 00:19:32,880
و ما به پشتیبانی cuda نیاز نداریم بنابراین فقط یک
416
00:19:32,880 –> 00:19:34,720
cpu خوب است
417
00:19:34,720 –> 00:19:37,200
و ما نیازی به صدای مشعل نداریم زیرا
418
00:19:37,200 –> 00:19:39,679
با فایل های صوتی کار نمی کنیم بنابراین فقط می توانیم
419
00:19:39,679 –> 00:19:43,039
این pip install torch
420
00:19:43,039 –> 00:19:44,080
vision
421
00:19:44,080 –> 00:19:47,440
را بگیریم و سپس آن را در اینجا
422
00:19:47,440 –> 00:19:50,240
بچسبانیم و اینتر را بزنید و اکنون pytorch و
423
00:19:50,240 –> 00:19:52,960
همه وابستگی ها را نصب می کند.
424
00:19:52,960 –> 00:19:55,120
بسیار خوب، بنابراین این کار انجام شد و سپس ما
425
00:19:55,120 –> 00:19:58,000
به دو چیز دیگر برای ترسیم بعدا نیاز داریم،
426
00:19:58,000 –> 00:20:01,440
بنابراین برای این کار میگویم pip install
427
00:20:01,440 –> 00:20:05,919
much plot lip و همچنین ما میخواهیم پایتون را انجام دهیم
428
00:20:05,919 –> 00:20:08,880
و سپس اینتر را فشار
429
00:20:08,880 –> 00:20:10,960
دهید تا این کار نیز موفقیتآمیز بود
430
00:20:10,960 –> 00:20:13,280
و اکنون ما همه چیز را داریم. بنابراین
431
00:20:13,280 –> 00:20:15,919
اکنون میتوانیم اجرای همه کدها را شروع کنیم
432
00:20:15,919 –> 00:20:19,760
و به عنوان یک نقطه شروع میخواهم
433
00:20:19,760 –> 00:20:22,080
کد را از آموزش دیگری
434
00:20:22,080 –> 00:20:24,880
که انجام دادم بگیرم، بنابراین میتوانید آن را در github و
435
00:20:24,880 –> 00:20:28,320
سپس در حساب کاربری من و سپس در
436
00:20:28,320 –> 00:20:30,400
repo python fun
437
00:20:30,400 –> 00:20:33,520
و اینجا پیدا کنید. در واقع دو بازی مار
438
00:20:33,520 –> 00:20:36,880
پس و پس از آن ما به این یک بازی پای مار نیاز داریم
439
00:20:36,880 –> 00:20:37,760
440
00:20:37,760 –> 00:20:41,200
و این را دانلود کنید تا بتوانید این کار را انجام دهید و
441
00:20:41,200 –> 00:20:44,880
من قبلاً این کار را انجام دادم و این را اینجا داشتم، بنابراین
442
00:20:44,880 –> 00:20:47,440
اگر
443
00:20:47,440 –> 00:20:50,159
ویرایشگر را در اینجا باز کنیم، من تصاویری را با استفاده از کد ویژوال استودیو انجام می دهم،
444
00:20:50,159 –> 00:20:51,520
445
00:20:51,520 –> 00:20:54,240
می بینیم که دقیقاً آن
446
00:20:54,240 –> 00:20:56,159
دو فایل را داریم.
447
00:20:56,159 –> 00:20:57,200
و
448
00:20:57,200 –> 00:21:00,400
سپس اولین کاری که میخواهم انجام دهم این است
449
00:21:00,400 –> 00:21:04,000
که میخواهم این فایل را اجرا کنم و آزمایش کنم
450
00:21:04,000 –> 00:21:05,919
که آیا واقعاً کار میکند یا
451
00:21:05,919 –> 00:21:09,039
نه، بنابراین در حال حاضر این فقط یک
452
00:21:09,039 –> 00:21:11,360
بازی مار معمولی است که باید
453
00:21:11,360 –> 00:21:13,679
خود را کنترل کنید، بنابراین باید
454
00:21:13,679 –> 00:21:17,919
از کلیدهای جهتدار استفاده کنید. بگو
455
00:21:17,919 –> 00:21:21,520
بازی مار پایتون dot pi و سپس بیایید امیدوار باشیم
456
00:21:21,520 –> 00:21:24,080
که این کار می کند بنابراین بله، بنابراین اکنون
457
00:21:24,080 –> 00:21:26,320
می توانم مار را کنترل
458
00:21:26,320 –> 00:21:29,919
کنم و امیدوارم بتوانم غذا را بخورم بله
459
00:21:29,919 –> 00:21:32,799
و حالا اگر به مرز ضربه زدم
460
00:21:32,799 –> 00:21:34,240
، بازی را تمام کرده ایم،
461
00:21:34,240 –> 00:21:36,880
بنابراین این کار ما کار می کند محیط
462
00:21:36,880 –> 00:21:40,720
راهاندازی شده است و اکنون میتوانیم
463
00:21:40,720 –> 00:21:43,919
پیادهسازی کد خود را شروع کنیم، بنابراین میتوانیم آن را تغییر دهیم تا
464
00:21:43,919 –> 00:21:46,240
بتوانیم از آن به عنوان یک
465
00:21:46,240 –> 00:21:48,320
بازی کنترلشده با هوش مصنوعی استفاده
466
00:21:48,320 –> 00:21:51,679
کنیم، بنابراین اجازه دهید نمای کلی از
467
00:21:51,679 –> 00:21:54,640
آخرین بار را به شما نشان دهم، دفعه قبل به شما گفتم که
468
00:21:54,640 –> 00:21:58,640
به یک مرحله بازی نیاز داریم. در بازی ما و این
469
00:21:58,640 –> 00:22:02,000
یک اکشن و بر اساس این عمل می شود
470
00:22:02,000 –> 00:22:05,120
سپس حرکتی را انجام میدهیم و سپس
471
00:22:05,120 –> 00:22:08,240
باید یک جایزه به حالت بازی و امتیاز فعلی برگردانیم،
472
00:22:08,240 –> 00:22:09,919
473
00:22:09,919 –> 00:22:10,960
بنابراین
474
00:22:10,960 –> 00:22:12,799
ابتدا
475
00:22:12,799 –> 00:22:14,960
بیایید همه چیزهایی را که
476
00:22:14,960 –> 00:22:16,720
باید تغییر دهیم را اینجا
477
00:22:16,720 –> 00:22:20,240
بنویسیم، بنابراین ابتدا میخواهیم یک
478
00:22:20,240 –> 00:22:22,880
تابع بازنشانی داشته باشیم، بنابراین بعد از
479
00:22:22,880 –> 00:22:26,240
هر بازی ما agent باید بتواند
480
00:22:26,240 –> 00:22:29,919
بازی را تنظیم مجدد کند و با یک بازی جدید شروع کند،
481
00:22:29,919 –> 00:22:32,720
سپس باید
482
00:22:32,720 –> 00:22:36,880
پاداشی را که نماینده ما دریافت می کند پیاده سازی کنیم،
483
00:22:36,880 –> 00:22:40,400
سپس باید تابع play را تغییر
484
00:22:40,400 –> 00:22:43,520
دهیم تا یک عمل انجام دهد و
485
00:22:43,520 –> 00:22:45,360
سپس um
486
00:22:45,360 –> 00:22:47,520
a را برمی گرداند یا
487
00:22:47,520 –> 00:22:49,600
جهت را محاسبه می کند.
488
00:22:49,600 –> 00:22:53,120
ما همچنین میخواهیم فریم فعلی را ردیابی کنیم
489
00:22:53,120 –> 00:22:56,799
یا اجازه دهید این
490
00:22:56,799 –> 00:22:57,919
بازی را
491
00:22:57,919 –> 00:22:59,840
تکرار صدا کنیم
492
00:22:59,840 –> 00:23:02,640
و برای بعداً باید
493
00:23:02,640 –> 00:23:06,080
در تابع if is collision نیز تغییری ایجاد کنیم
494
00:23:06,080 –> 00:23:09,440
تا بررسی کنیم که آیا این یک برخورد است،
495
00:23:09,440 –> 00:23:10,400
بنابراین
496
00:23:10,400 –> 00:23:11,840
ابتدا
497
00:23:11,840 –> 00:23:15,280
اجازه دهید سریعاً این کد را مرور کنم. کاری که
498
00:23:15,280 –> 00:23:18,400
ما در اینجا انجام می دهیم این است که از بازی pi استفاده می کنیم،
499
00:23:18,400 –> 00:23:22,559
سپس برای جهت از یک enum استفاده می کنیم،
500
00:23:22,559 –> 00:23:26,640
سپس برای نقطه از یک تاپل با نام استفاده می کنیم
501
00:23:26,640 –> 00:23:30,080
و سپس در اینجا من یک بازی کلاس snake ایجاد کردم
502
00:23:30,080 –> 00:23:33,520
و در اینجا چیزهایی را
503
00:23:33,520 –> 00:23:35,360
که برای بازی نیاز داریم مقداردهی اولیه می کنیم،
504
00:23:35,360 –> 00:23:38,240
بنابراین در اینجا مقداردهی اولیه می کنیم. بازی حالت e برای
505
00:23:38,240 –> 00:23:41,760
مثال برای مار از یک
506
00:23:41,760 –> 00:23:43,279
لیست با
507
00:23:43,279 –> 00:23:45,600
سه مقدار اولیه استفاده می کنیم
508
00:23:45,600 –> 00:23:48,799
و سر همیشه جلوی این
509
00:23:48,799 –> 00:23:49,679
لیست است،
510
00:23:49,679 –> 00:23:52,559
سپس امتیاز را پیگیری می کنیم و در
511
00:23:52,559 –> 00:23:55,520
اینجا یک تابع کمکی برای قرار دادن
512
00:23:55,520 –> 00:23:56,720
غذا
513
00:23:56,720 –> 00:23:59,679
داریم و بله و از
514
00:23:59,679 –> 00:24:03,440
قبل یک تابعی که به آن play step می گویند
515
00:24:03,440 –> 00:24:06,000
و سپس اگر تا انتها پایین برویم، در
516
00:24:06,000 –> 00:24:08,000
اینجا حلقه بازی خود را داریم،
517
00:24:08,000 –> 00:24:11,200
بنابراین در حالی که این درست است،
518
00:24:11,200 –> 00:24:14,159
یک بازی یا یک مرحله بازی
519
00:24:14,159 –> 00:24:16,960
برداریم و بازی را روی حالت و امتیاز می گیریم،
520
00:24:16,960 –> 00:24:20,720
بنابراین این مکان تابع
521
00:24:20,720 –> 00:24:23,840
مهم ترین است، بنابراین در اینجا ابتدا
522
00:24:23,840 –> 00:24:27,120
ورودی کاربر را می گیریم تا
523
00:24:27,120 –> 00:24:28,880
کلیدی را که فشار می دهیم،
524
00:24:28,880 –> 00:24:32,400
سپس یک حرکت را بر اساس این کلید محاسبه
525
00:24:32,400 –> 00:24:33,360
526
00:24:33,360 –> 00:24:37,200
می کنیم و سپس مار خود را به روز می کنیم و بررسی
527
00:24:37,200 –> 00:24:39,919
می کنیم که آیا بازی تمام شده است یا
528
00:24:39,919 –> 00:24:42,559
خیر و آیا می توانیم ادامه دهیم یا خیر. غذای جدید را قرار دهید
529
00:24:42,559 –> 00:24:45,360
یا بررسی کنید که آیا غذا
530
00:24:45,360 –> 00:24:49,200
را می خوریم و رابط کاربری خود را با این
531
00:24:49,200 –> 00:24:52,480
تابع کمکی به روز رسانی رابط کاربری به روز می کنیم، در اینجا
532
00:24:52,480 –> 00:24:56,080
ما این تابع کمکی را
533
00:24:56,080 –> 00:24:58,320
داریم که در آن بررسی می کنیم که آیا به مرز برخورد کرده
534
00:24:58,320 –> 00:25:02,320
ایم یا به خودمان برخورد کرده ایم
535
00:25:02,320 –> 00:25:05,200
و سپس ما نیز داریم این تابع کمکی به
536
00:25:05,200 –> 00:25:08,559
جایی که ما حرکت می کنیم جهت فعلی را دریافت کنید
537
00:25:08,559 –> 00:25:10,960
و سپس بر اساس این
538
00:25:10,960 –> 00:25:14,159
جهت، ما به سادگی
539
00:25:14,159 –> 00:25:16,880
موقعیت جدید کلاه جدید را محاسبه می کنیم
540
00:25:16,880 –> 00:25:18,080
،
541
00:25:18,080 –> 00:25:21,120
بنابراین بله، همه
542
00:25:21,120 –> 00:25:24,400
چیز اینجا انجام می شود و اکنون اجازه دهید
543
00:25:24,400 –> 00:25:26,880
چند چیز را تغییر دهیم، بنابراین اولین موردی که
544
00:25:26,880 –> 00:25:29,919
می خواهم نام کلاس را تغییر دهم. بگوییم
545
00:25:29,919 –> 00:25:32,960
snake game ai تا مشخص شود که
546
00:25:32,960 –> 00:25:36,400
این یک بازی کنترلشده توسط عامل است
547
00:25:36,400 –> 00:25:39,840
و اکنون اولین چیزی که میخواهیم
548
00:25:39,840 –> 00:25:44,480
عملکرد بازنشانی است، بنابراین در اینجا اوم من
549
00:25:44,480 –> 00:25:48,080
قبلاً این نظر را دارم که در آن
550
00:25:48,080 –> 00:25:50,559
وضعیت بازی را داریم، بنابراین اکنون میخواهیم
551
00:25:50,559 –> 00:25:54,159
refactor کنیم. همه اینها در یک
552
00:25:54,159 –> 00:25:56,960
تابع بازنشانی ایجاد می کنیم، بنابراین ما یک
553
00:25:56,960 –> 00:25:58,960
تابع جدید تعریف می کنیم
554
00:25:58,960 –> 00:26:02,400
و سپس اجازه دهید این reset را فراخوانی کنیم و
555
00:26:02,400 –> 00:26:07,200
فقط خودش و هیچ آرگومان دیگری دریافت نمی کند
556
00:26:07,200 –> 00:26:11,200
و در اینجا می توانیم همه این کد
557
00:26:11,200 –> 00:26:14,960
را بگیریم و سپس به سادگی آن را در اینجا
558
00:26:14,960 –> 00:26:16,919
و در
559
00:26:16,919 –> 00:26:21,919
مقداردهی اولیه خود قرار دهیم. سپس خود dot reset را صدا
560
00:26:21,919 –> 00:26:24,640
561
00:26:24,640 –> 00:26:27,679
بزنید، بنابراین این اولین چیزی است که به آن نیاز داریم علاوه بر این، میخواهیم
562
00:26:27,679 –> 00:26:29,200
563
00:26:29,200 –> 00:26:32,880
تکرار بازی یا تکرار فریم را پیگیری
564
00:26:32,880 –> 00:26:36,320
کنیم، بنابراین بیایید این خود نقطه را
565
00:26:36,320 –> 00:26:39,320
تکرار فریم بنامیم
566
00:26:39,360 –> 00:26:42,320
و در ابتدا این فقط صفر است
567
00:26:42,320 –> 00:26:46,400
سپس این تعریف غذا در مکان می تواند همانطور
568
00:26:46,400 –> 00:26:49,760
که هست بماند و اکنون باید عملکرد مرحله بازی را تغییر دهیم،
569
00:26:49,760 –> 00:26:52,559
بنابراین
570
00:26:52,559 –> 00:26:56,240
اگر نگاهی به نمای کلی اینجا بیندازیم،
571
00:26:56,240 –> 00:26:58,880
قبلاً به شما گفته بودم که اکنون باید
572
00:26:58,880 –> 00:27:02,960
این عمل را از طرف عامل ارائه
573
00:27:02,960 –> 00:27:06,960
دهیم و نیاز داریم برای برگرداندن یک پاداش،
574
00:27:06,960 –> 00:27:08,320
بیایید با
575
00:27:08,320 –> 00:27:12,640
استفاده از این پارامتر عمل شروع
576
00:27:12,640 –> 00:27:16,320
کنیم و در اینجا ورودی کاربر را می گیریم، بنابراین
577
00:27:16,320 –> 00:27:18,960
در واقع همین الان می توانیم از شر آن خلاص شویم،
578
00:27:18,960 –> 00:27:22,640
بنابراین تنها چیزی است که هنوز بررسی می
579
00:27:22,640 –> 00:27:26,880
کنیم که آیا می خواهیم بازی را ترک
580
00:27:26,880 –> 00:27:29,279
کنیم یا نه
581
00:27:29,279 –> 00:27:32,080
این تابع کمکی را داشته باشید که
582
00:27:32,080 –> 00:27:34,640
در جهت فعلی حرکت می کنیم،
583
00:27:34,640 –> 00:27:37,600
بنابراین در واقع آنچه را که اکنون در اینجا تغییر می دهیم، این
584
00:27:37,600 –> 00:27:40,880
تابع حرکت جهت را از ورودی کاربر دریافت نمی کند،
585
00:27:40,880 –> 00:27:43,919
بنابراین اکنون در اینجا عمل را دریافت
586
00:27:43,919 –> 00:27:46,799
می کند و سپس باید
587
00:27:46,799 –> 00:27:48,880
جهت جدید را تعیین
588
00:27:48,880 –> 00:27:51,279
کنیم تا این کار را انجام دهیم. این در یک ثانیه، اما ابتدا
589
00:27:51,279 –> 00:27:54,399
اجازه دهید فقط این را تغییر دهیم و سپس در اینجا با اکشن
590
00:27:54,399 –> 00:27:56,559
self.move را صدا می
591
00:27:56,559 –> 00:27:59,039
592
00:27:59,039 –> 00:28:02,480
زنیم و سپس هد را به روز می کنیم سپس
593
00:28:02,480 –> 00:28:06,399
بررسی می کنیم که آیا بازی به پایان رسیده است یا نه و
594
00:28:06,399 –> 00:28:10,080
در واقع اکنون به پاداش نیز نیاز داریم، بنابراین
595
00:28:10,080 –> 00:28:13,760
ما به سادگی بگویید پاداش برابر با صفر است
596
00:28:13,760 –> 00:28:16,240
و بیایید g را بگیریم o به اسلایدهای
597
00:28:16,240 –> 00:28:19,279
دفعه قبل برگردیم، بنابراین پاداش واقعاً ساده است
598
00:28:19,279 –> 00:28:22,320
هر زمان که غذایی میخوریم،
599
00:28:22,320 –> 00:28:24,799
وقتی از دست میدهیم یا وقتی میمیریم، میگوییم به اضافه 10، سپس
600
00:28:24,799 –> 00:28:27,840
میگوییم پاداش ما 10- است و برای هر چیز
601
00:28:27,840 –> 00:28:30,480
دیگری فقط روی صفر میمانیم،
602
00:28:30,480 –> 00:28:33,840
بنابراین مقداردهی اولیه میکنیم. پاداش با صفر،
603
00:28:33,840 –> 00:28:36,960
پس اگر برخورد و بازی
604
00:28:36,960 –> 00:28:39,440
over داشتیم، می گوییم
605
00:28:39,440 –> 00:28:43,520
پاداش ما برابر با 10 است و می خواهیم
606
00:28:43,520 –> 00:28:47,919
این را نیز برگردانیم، بنابراین بازی پاداش را به
607
00:28:47,919 –> 00:28:51,200
بالا و self.score برگردانید
608
00:28:51,200 –> 00:28:54,399
و در اینجا فقط بررسی می کنیم که
609
00:28:54,399 –> 00:28:57,360
برخورد داشته باشیم. بنابراین در اینجا من واقعاً می خواهم یک بررسی دیگر انجام دهم،
610
00:28:57,360 –> 00:28:59,200
611
00:28:59,200 –> 00:29:01,600
بنابراین اگر
612
00:29:01,600 –> 00:29:04,320
برای مدت طولانی هیچ اتفاقی نیفتد، بنابراین اگر
613
00:29:04,320 –> 00:29:07,279
مار ما بهبود نیافت و
614
00:29:07,279 –> 00:29:10,320
غذا را نخورد اما همچنین نمرد،
615
00:29:10,320 –> 00:29:13,279
ما نیز می خواهیم این را بررسی کنیم
616
00:29:13,279 –> 00:29:16,240
و اگر این اتفاق افتاد برای خیلی طولانی است،
617
00:29:16,240 –> 00:29:18,559
سپس اینجا را نیز شکسته
618
00:29:18,559 –> 00:29:22,480
ایم تا بتوانیم بگوییم یا و سپس در اینجا می گوییم اگر
619
00:29:22,480 –> 00:29:25,600
تکرار قاب خود نقطه ای باشد
620
00:29:25,600 –> 00:29:28,960
و اگر این خیلی بزرگ شود بدون اینکه
621
00:29:28,960 –> 00:29:33,760
اتفاقی بیفتد، در اینجا متوقف می شویم،
622
00:29:33,760 –> 00:29:36,559
بنابراین اگر این مقدار بیشتر است، اینجا از این فرمول کوچک استفاده می کنم
623
00:29:36,559 –> 00:29:40,159
. بیش از 100 برابر
624
00:29:40,159 –> 00:29:43,520
طول مار ما است، بنابراین به یاد داشته باشید که این
625
00:29:43,520 –> 00:29:45,120
یک دروغ است
626
00:29:45,120 –> 00:29:48,240
بعدش میشکنیم پس این هم
627
00:29:48,240 –> 00:29:50,799
اینجوری میشه پس بستگی به
628
00:29:50,799 –> 00:29:52,720
طول مار داره
629
00:29:52,720 –> 00:29:56,720
پس هر چی مار ما بیشتر باشه زمانش بیشتر
630
00:29:56,720 –> 00:29:58,159
631
00:29:58,159 –> 00:30:00,880
میشه ولی بعد اگه از این
632
00:30:00,880 –> 00:30:03,200
مقدار بزرگتر شد میشکنیم
633
00:30:03,200 –> 00:30:05,200
و البته باید
634
00:30:05,200 –> 00:30:08,799
آپدیت کنیم تکرار self.frame و ما
635
00:30:08,799 –> 00:30:11,279
میتوانیم به سادگی این کار را اینجا در ابتدا انجام دهیم،
636
00:30:11,279 –> 00:30:13,039
بنابراین برای هر
637
00:30:13,039 –> 00:30:16,159
مرحله بازی میگوییم تکرار قاب خود نقطه
638
00:30:16,159 –> 00:30:18,559
به اضافه
639
00:30:18,559 –> 00:30:20,640
640
00:30:20,640 –> 00:30:21,600
1 است
641
00:30:21,600 –> 00:30:25,120
و وقتی آن را بازنشانی میکنیم، آن
642
00:30:25,120 –> 00:30:26,799
را به صفر برمیگردانیم،
643
00:30:26,799 –> 00:30:30,720
بنابراین این اینجا است و سپس بله اگر ما توقف
644
00:30:30,720 –> 00:30:33,360
کنید، پاداش 10- را داریم،
645
00:30:33,360 –> 00:30:36,080
سپس در اینجا اگر کلاه ما
646
00:30:36,080 –> 00:30:38,480
به غذا خورد، غذا را می خوریم بنابراین
647
00:30:38,480 –> 00:30:42,480
امتیاز ما افزایش می یابد و پاداش ما
648
00:30:42,480 –> 00:30:44,880
به اضافه 10 تنظیم می شود،
649
00:30:44,880 –> 00:30:47,840
سپس یک غذای جدید قرار می دهیم و می
650
00:30:47,840 –> 00:30:50,880
گوییم در غیر این صورت قسمت آخر را حذف می کنیم بنابراین
651
00:30:50,880 –> 00:30:52,720
به سادگی حرکت می کنیم. در اینجا
652
00:30:52,720 –> 00:30:55,520
پس از آن این می تواند باقی بماند زیرا تابع به روز رسانی
653
00:30:55,520 –> 00:30:58,399
است و در پایان ما همچنین
654
00:30:58,399 –> 00:31:01,760
می خواهیم پاداش را برگردانیم، سپس
655
00:31:01,760 –> 00:31:05,200
برای تابع is collision به یک تغییر جزئی نیاز داریم،
656
00:31:05,200 –> 00:31:08,919
بنابراین در اینجا من فقط self.head را بررسی می
657
00:31:08,919 –> 00:31:13,679
کنم اما بعداً برای محاسبه
658
00:31:13,679 –> 00:31:17,200
وضعیت وضعیت را بررسی می کنم. یا خطری که به شما
659
00:31:17,200 –> 00:31:19,279
گفتم پس اگر ما
660
00:31:19,279 –> 00:31:21,360
به وضعیت نگاهی بیندازید،
661
00:31:21,360 –> 00:31:24,159
بنابراین در اینجا ما خطر را محاسبه میکنیم،
662
00:31:24,159 –> 00:31:27,279
بنابراین اگر برای مثال
663
00:31:27,279 –> 00:31:30,640
در گوشهای هستیم،
664
00:31:30,640 –> 00:31:33,039
خطری در سمت راست داریم،
665
00:31:33,039 –> 00:31:36,320
بنابراین اگر
666
00:31:36,320 –> 00:31:39,840
از self.head در داخل استفاده نکنیم، ممکن است مفید باشد. در اینجا،
667
00:31:39,840 –> 00:31:43,440
اما اگر به این تابع یک نقطه بدهیم، پس
668
00:31:43,440 –> 00:31:46,320
آرگومان نقطه به دست میآید و اجازه دهید به
669
00:31:46,320 –> 00:31:49,200
طور پیشفرض بگوییم که این هیچ است
670
00:31:49,200 –> 00:31:51,840
و سپس در اینجا به سادگی بررسی میکنیم که آیا
671
00:31:51,840 –> 00:31:53,519
نقطه
672
00:31:53,519 –> 00:31:57,039
هیچکدام نیست، آن نقطه را برابر
673
00:31:57,039 –> 00:31:59,279
با head dot قرار
674
00:31:59,279 –> 00:32:02,559
میدهیم، بنابراین در داخل این جایی که ما این را
675
00:32:02,559 –> 00:32:06,399
بدون هیچ استدلالی بنامید، میتواند همانطور که هست باقی بماند
676
00:32:06,399 –> 00:32:09,200
و سپس اینجا البته باید خود را
677
00:32:09,200 –> 00:32:12,880
تغییر دهیم. سر به این
678
00:32:12,880 –> 00:32:16,399
نقطه است، بنابراین اگر به نقطه گوشه اینجا ضربه بزنیم و به
679
00:32:16,399 –> 00:32:17,679
680
00:32:17,679 –> 00:32:23,200
اینجا اشاره کنیم و به اینجا اشاره
681
00:32:23,200 –> 00:32:24,960
682
00:32:24,960 –> 00:32:28,720
کنیم، برخورد خواهیم کرد و در اینجا اگر
683
00:32:28,720 –> 00:32:32,080
نقطه ما در بدن مار باشد، پس ما نیز
684
00:32:32,080 –> 00:32:33,679
برخورد داریم
685
00:32:33,679 –> 00:32:36,240
و در غیر این صورت
686
00:32:36,240 –> 00:32:39,600
برخورد نداریم، بنابراین عملکرد رابط کاربری به روز رسانی می
687
00:32:39,600 –> 00:32:41,279
تواند به این صورت باقی بماند
688
00:32:41,279 –> 00:32:43,760
و اکنون برای تابع حرکت در اینجا
689
00:32:43,760 –> 00:32:47,440
باید چیزی را تغییر دهیم، بنابراین اکنون ما یک اکشن دریافت کنید
690
00:32:47,440 –> 00:32:51,200
و اکنون بر اساس این عمل می
691
00:32:51,200 –> 00:32:54,799
خواهیم تعیین کنیم حرکت بعدی،
692
00:32:54,799 –> 00:32:58,880
بنابراین اگر به اسلایدها برگردیم، در اینجا
693
00:32:58,880 –> 00:33:01,679
عمل را به این صورت طراحی کردیم،
694
00:33:01,679 –> 00:33:04,399
بنابراین سه مقدار
695
00:33:04,399 –> 00:33:07,919
um یک صفر صفر به این معنی است که ما جهت فعلی را حفظ می کنیم
696
00:33:07,919 –> 00:33:11,519
و مستقیم می رویم 0 1 0
697
00:33:11,519 –> 00:33:15,440
به این معنی که یک چرخش به راست انجام می دهیم و 0 0 1 به
698
00:33:15,440 –> 00:33:17,200
این معنی که ما یک گردش به چپ انجام می دهیم،
699
00:33:17,200 –> 00:33:20,559
بنابراین این بستگی به جهت فعلی
700
00:33:20,559 –> 00:33:23,679
دارد، بنابراین اگر به راست برویم و یک
701
00:33:23,679 –> 00:33:27,679
گردش به راست انجام دهیم، سپس اگر پایین برویم
702
00:33:27,679 –> 00:33:30,159
و یک چرخش به راست انجام دهیم، سپس به چپ برویم
703
00:33:30,159 –> 00:33:32,960
و به همین ترتیب، گردش به چپ است.
704
00:33:32,960 –> 00:33:34,320
برعکس،
705
00:33:34,320 –> 00:33:38,000
بنابراین اکنون ما می خواهیم
706
00:33:38,000 –> 00:33:42,000
جهت را بر اساس عمل تعیین کنیم، بنابراین
707
00:33:42,000 –> 00:33:45,039
بیایید یک نظر سریع در اینجا
708
00:33:45,039 –> 00:33:50,159
بنویسیم، چرخش مستقیم به راست یا چپ داریم، بنابراین
709
00:33:50,159 –> 00:33:54,080
برای رسیدن به جهت بعدی ابتدا می خواهم
710
00:33:54,080 –> 00:33:55,200
711
00:33:55,200 –> 00:33:59,200
تمام جهات ممکن را در
712
00:33:59,200 –> 00:34:03,200
جهت عقربه های ساعت تعریف کنم. ترتیب بدین ترتیب می گوییم در جهت عقربه های ساعت
713
00:34:03,200 –> 00:34:07,360
برابر است و سپس یک لیست و در اینجا با نقطه جهت شروع می کنیم،
714
00:34:07,360 –> 00:34:10,879
بنابراین
715
00:34:10,879 –> 00:34:14,000
در اینجا برای جهتی که از این کلاس enum استفاده می کنیم به خاطر بسپارید،
716
00:34:14,000 –> 00:34:16,239
717
00:34:16,239 –> 00:34:20,239
بنابراین باید یکی از آن جهت ها باشد،
718
00:34:20,239 –> 00:34:21,199
بنابراین
719
00:34:21,199 –> 00:34:22,399
720
00:34:22,399 –> 00:34:25,119
جهت عقربه های ساعت ما باید با
721
00:34:25,119 –> 00:34:28,879
جهت درست از این نقطه شروع شود. در
722
00:34:28,879 –> 00:34:30,399
بعدی در e
723
00:34:30,399 –> 00:34:33,440
نقطه جهت پایین است
724
00:34:33,440 –> 00:34:36,399
سپس نقطه جهت را به
725
00:34:36,399 –> 00:34:39,839
سمت چپ داریم و به عنوان آخرین چیزی که
726
00:34:39,839 –> 00:34:43,599
نقطه جهت بالا داریم پس راست پایین چپ به بالا در
727
00:34:43,599 –> 00:34:46,879
جهت عقربه های ساعت است و سپس برای بدست آوردن جهت جریان
728
00:34:46,879 –> 00:34:50,239
یا شاخص
729
00:34:50,239 –> 00:34:53,599
فعلی جهت فعلی می گوییم شاخص برابر است
730
00:34:53,599 –> 00:34:57,200
و سپس ما می توانیم بگوییم شاخص نقطه در جهت عقربه های ساعت
731
00:34:57,200 –> 00:35:00,839
و سپس شاخص جهت خود نقطه،
732
00:35:00,839 –> 00:35:04,320
بنابراین مطمئن هستیم که
733
00:35:04,320 –> 00:35:06,800
این باید در این آرایه باشد، زیرا جهت خود
734
00:35:06,800 –> 00:35:08,000
735
00:35:08,000 –> 00:35:11,440
باید یکی از آن مقادیر enum باشد
736
00:35:11,440 –> 00:35:16,079
و سپس بررسی می کنیم که um های مختلف
737
00:35:16,079 –> 00:35:19,680
حالت های ممکن را دارند بنابراین این یک ها
738
00:35:19,680 –> 00:35:23,920
بنابراین برای این کار میتوانیم از numpy استفاده کنیم و حدس میزنم
739
00:35:23,920 –> 00:35:29,119
که ابتدا باید numpy را بهعنوان np وارد کنیم
740
00:35:29,119 –> 00:35:31,280
و سپس میتوانیم از آن
741
00:35:31,280 –> 00:35:33,359
در اینجا استفاده کنیم، میتوانیم بگوییم که
742
00:35:33,359 –> 00:35:36,640
numpy است و سپس از این
743
00:35:36,640 –> 00:35:40,560
آرایه تابع برابر استفاده میکنیم و سپس در اینجا
744
00:35:40,560 –> 00:35:43,280
عمل و آرایهای را که ما می خواهیم
745
00:35:43,280 –> 00:35:44,640
مقایسه کنیم
746
00:35:44,640 –> 00:35:47,280
بنابراین اگر این برابر با
747
00:35:47,280 –> 00:35:49,920
یک صفر صفر است،
748
00:35:49,920 –> 00:35:53,440
مستقیم می رویم یا جهت های فعلی را حفظ می کنیم،
749
00:35:53,440 –> 00:35:56,960
بنابراین به سادگی می گوییم
750
00:35:56,960 –> 00:35:58,640
751
00:35:58,640 –> 00:36:00,000
جهت جدید ما
752
00:36:00,000 –> 00:36:03,359
برابر است و سپس در جهت عقربه های ساعت
753
00:36:03,359 –> 00:36:04,560
754
00:36:04,560 –> 00:36:07,119
شاخص است و سپس به یاد داشته باشید که شاخص
755
00:36:07,119 –> 00:36:10,320
فقط شاخص cur است. جهت اجاره
756
00:36:10,320 –> 00:36:13,040
بنابراین در اینجا ما اساساً هیچ
757
00:36:13,040 –> 00:36:15,839
تغییری نداریم سپس می گوییم
758
00:36:15,839 –> 00:36:18,320
l اگر اگر
759
00:36:18,320 –> 00:36:23,280
آرایه ما اگر آرایه numpy برابر باشد اگر عمل
760
00:36:23,280 –> 00:36:28,400
برابر با 0 باشد یک صفر آنگاه یک چرخش به راست انجام می دهیم
761
00:36:28,400 –> 00:36:30,240
762
00:36:30,240 –> 00:36:34,000
بنابراین این بدان معنی است که در جهت عقربه های ساعت می رویم پس اگر
763
00:36:34,000 –> 00:36:36,720
درست برویم جهت بعدی
764
00:36:36,720 –> 00:36:40,000
اگر پایین برویم، جهت بعدی
765
00:36:40,000 –> 00:36:42,480
چپ خواهد بود و اگر به
766
00:36:42,480 –> 00:36:44,320
چپ برویم جهت بعدی به
767
00:36:44,320 –> 00:36:48,000
سمت بالا خواهد بود، بنابراین در اینجا می گوییم
768
00:36:48,000 –> 00:36:49,200
شاخص
769
00:36:49,200 –> 00:36:53,440
برابر است یا این شاخص بعدی ما
770
00:36:53,440 –> 00:36:56,640
در واقع است و در اینجا می گوییم
771
00:36:56,640 –> 00:37:00,880
این شاخص فعلی به اضافه
772
00:37:00,880 –> 00:37:05,599
1 است. اما پس از آن مدول 4 بنابراین این بدان معناست که اگر
773
00:37:05,599 –> 00:37:08,960
ما در پایان هستیم و
774
00:37:08,960 –> 00:37:11,200
اگر شاخص داریم یکی بعدی را انجام دهیم،
775
00:37:11,200 –> 00:37:15,839
بنابراین این شاخص 0 1 2 3 است و سپس اگر
776
00:37:15,839 –> 00:37:17,280
شاخص 4 داشته باشیم،
777
00:37:17,280 –> 00:37:21,839
مدول 4 در واقع دوباره شاخص
778
00:37:21,839 –> 00:37:25,359
صفر است، بنابراین از این ما یک چرخش انجام می دهیم و
779
00:37:25,359 –> 00:37:28,160
دوباره به جلو برمی گردیم،
780
00:37:28,160 –> 00:37:31,119
بنابراین این چرخش به راست ما است، بنابراین اکنون این
781
00:37:31,119 –> 00:37:32,000
782
00:37:32,000 –> 00:37:35,680
شاخص بعدی است و اکنون جهت جدید ما در جهت
783
00:37:35,680 –> 00:37:38,880
عقربه های ساعت
784
00:37:38,880 –> 00:37:40,400
785
00:37:40,400 –> 00:37:41,440
شاخص بعدی است
786
00:37:41,440 –> 00:37:44,560
و سپس در غیر این صورت می توانیم به سادگی از
787
00:37:44,560 –> 00:37:48,720
other در اینجا استفاده کنیم و در واقع این را به تغییر دهیم
788
00:37:48,720 –> 00:37:52,480
a l اگر چنین است اکنون این آخرین مورد است
789
00:37:52,480 –> 00:37:55,119
پس باید h باشد قبل از اینکه باید
790
00:37:55,119 –> 00:37:57,440
صفر صفر یک باشد
791
00:37:57,440 –> 00:38:01,599
و اگر اینطور است، بیایید
792
00:38:01,599 –> 00:38:05,359
این را در اینجا کپی و جایگذاری کنیم، پس شاخص بعدی ما
793
00:38:05,359 –> 00:38:08,160
شاخص فعلی
794
00:38:08,160 –> 00:38:10,480
منهای یک مدول چهار است،
795
00:38:10,480 –> 00:38:12,880
بنابراین این در واقع به این معنی است که در
796
00:38:12,880 –> 00:38:16,240
خلاف جهت عقربه های ساعت حرکت می کنیم، بنابراین یک
797
00:38:16,240 –> 00:38:20,079
چرخش به چپ انجام می دهیم، اگر از سمت راست شروع می کنیم،
798
00:38:20,079 –> 00:38:22,640
سپس حرکت بعدی به سمت بالا خواهد بود و سپس حرکت
799
00:38:22,640 –> 00:38:24,000
بعدی به
800
00:38:24,000 –> 00:38:27,040
سمت چپ و سپس حرکت بعدی به سمت پایین
801
00:38:27,040 –> 00:38:29,839
و سپس دوباره به راست و به همین ترتیب است، بنابراین اکنون
802
00:38:29,839 –> 00:38:32,720
این جهت جدید ما است و سپس
803
00:38:32,720 –> 00:38:35,920
به سادگی می گوییم جهت خود
804
00:38:35,920 –> 00:38:37,839
مساوی
805
00:38:37,839 –> 00:38:39,280
جهت جدید است
806
00:38:39,280 –> 00:38:43,359
و سپس ادامه می دهیم، بنابراین در اینجا سر را استخراج می کنیم
807
00:38:43,359 –> 00:38:44,320
808
00:38:44,320 –> 00:38:48,000
و سپس در اینجا باید بررسی کنیم که آیا
809
00:38:48,000 –> 00:38:51,680
جهت خود نقطه در حال حاضر درست است یا خیر
810
00:38:51,680 –> 00:38:55,359
، موقعیت x را افزایش می دهیم
811
00:38:55,359 –> 00:38:58,880
و به همین ترتیب اگر
812
00:38:58,880 –> 00:39:01,520
جهت چپ داشتیم، x را کاهش می دهیم
813
00:39:01,520 –> 00:39:04,960
و اگر به پایین می رویم. پس در واقع
814
00:39:04,960 –> 00:39:08,240
y را افزایش می دهیم
815
00:39:08,240 –> 00:39:11,520
بنابراین y از بالا از صفر شروع می شود و
816
00:39:11,520 –> 00:39:15,119
سپس اگر پایین برویم افزایش می یابد بنابراین اگر
817
00:39:15,119 –> 00:39:18,160
پایین برویم باید y را افزایش دهیم و اگر
818
00:39:18,160 –> 00:39:21,680
بالا رفتیم باید y را کاهش دهیم بنابراین
819
00:39:21,680 –> 00:39:24,320
اگر جهت خود برابر است بالا و
820
00:39:24,320 –> 00:39:28,079
سپس y منهای برابر با اندازه بلوک است
821
00:39:28,079 –> 00:39:30,960
و اتفاقا اندازه بلوک فقط در اینجا یک
822
00:39:30,960 –> 00:39:33,760
مقدار ثابت 10 است، بنابراین
823
00:39:33,760 –> 00:39:36,720
اندازه یک بلوک مار ما باید در پیکسل چقدر باشد،
824
00:39:36,720 –> 00:39:38,160
825
00:39:38,160 –> 00:39:41,200
بنابراین بله، این همه آن چیزی است که
826
00:39:41,200 –> 00:39:45,440
در اینجا در تابع حرکت نیاز داریم و اکنون اینجا
827
00:39:45,440 –> 00:39:49,839
دیگر به این نیاز نداریم، بنابراین
828
00:39:49,839 –> 00:39:52,240
این در واقع دیگر با ورودی کاربر کار نمی کند
829
00:39:52,240 –> 00:39:55,440
، بنابراین می توانید فقط
830
00:39:55,440 –> 00:39:58,320
این را حذف کنید و بعداً ما
831
00:39:58,320 –> 00:40:01,280
این کلاس را از Agent کنترل می کنیم
832
00:40:01,280 –> 00:40:04,000
و این تابع مرحله بازی را صدا می
833
00:40:04,000 –> 00:40:06,240
زنیم، بنابراین بله در حال حاضر این تنها چیزی است که ما برای
834
00:40:06,240 –> 00:40:10,040
اجرای بازی نیاز داریم،
835
00:40:12,480 –> 00:40:15,680
بنابراین من قبلاً در مورد تئوری صحبت کردم.
836
00:40:15,680 –> 00:40:18,400
یادگیری عمیق q در قسمت اول
837
00:40:18,400 –> 00:40:21,200
در قسمت آخر ما بازی pi را پیاده سازی
838
00:40:21,200 –> 00:40:24,480
کردیم تا بتوانیم از آن در
839
00:40:24,480 –> 00:40:28,079
محیط کنترل شده توسط عامل خود استفاده کنیم و
840
00:40:28,079 –> 00:40:32,400
اکنون به عامل نیاز داریم پس بیایید شروع کنیم و
841
00:40:32,400 –> 00:40:35,119
اگر دو قسمت اول را ندیده اید اینجا باشید.
842
00:40:35,119 –> 00:40:37,359
پس من به شدت توصیه می
843
00:40:37,359 –> 00:40:38,640
کنم این کار را انجام دهید،
844
00:40:38,640 –> 00:40:41,280
بنابراین این نقطه شروع از آخرین
845
00:40:41,280 –> 00:40:44,319
بار است و من در واقع می خواهم یک
846
00:40:44,319 –> 00:40:46,720
تغییر دیگر ایجاد کنم که فراموش کردم،
847
00:40:46,720 –> 00:40:47,599
بنابراین
848
00:40:47,599 –> 00:40:50,480
در اینجا تابع collision باید
849
00:40:50,480 –> 00:40:53,599
در واقع عمومی باشد زیرا در این صورت
850
00:40:53,599 –> 00:40:55,680
نماینده ما باید از آن استفاده کند،
851
00:40:55,680 –> 00:40:59,280
بنابراین فقط th را حذف کنید اینجا را زیر خط
852
00:40:59,280 –> 00:41:02,480
بکشید و سپس وقتی این را صدا می زنیم آن را در خود این کلاس حذف کنید،
853
00:41:02,480 –> 00:41:04,240
854
00:41:04,240 –> 00:41:07,119
پس ما بازی مار خود را داریم و
855
00:41:07,119 –> 00:41:11,359
همچنین می خواهم نام آن را فقط به بازی تغییر دهم
856
00:41:11,359 –> 00:41:15,359
و اکنون یک عامل فایل جدید نقطه pi ایجاد می کنیم
857
00:41:15,359 –> 00:41:19,119
و سپس شروع به پیاده سازی می کنیم.
858
00:41:19,119 –> 00:41:22,560
ابتدا مشعل را از پی مشعل
859
00:41:22,560 –> 00:41:23,680
860
00:41:23,680 –> 00:41:27,280
وارد می کنیم سپس تصادفی وارد می کنیم زیرا وقتی بعداً
861
00:41:27,280 –> 00:41:29,920
به این نیاز داشتیم سپس به import numpy snp نیز نیاز داریم
862
00:41:29,920 –> 00:41:33,280
863
00:41:33,280 –> 00:41:38,000
و از کلاس um پیاده سازی شده ما
864
00:41:38,000 –> 00:41:42,000
به بازی snake نیاز داریم بنابراین می گوییم از
865
00:41:42,000 –> 00:41:45,440
بازی import snake
866
00:41:45,440 –> 00:41:49,200
like snake game a
867
00:41:49,200 –> 00:41:51,839
i بنابراین فکر می کنم این همان چیزی است که ما به این
868
00:41:51,839 –> 00:41:55,680
بازی کلاس مار می گوییم a
869
00:41:55,680 –> 00:41:56,640
i
870
00:41:56,640 –> 00:41:59,280
پس بله این نام درستی است، سپس
871
00:41:59,280 –> 00:42:02,880
در ابتدا می شنویم که
872
00:42:02,880 –> 00:42:06,480
این enum را برای جهت و این
873
00:42:06,480 –> 00:42:10,240
تاپل نامگذاری شده را برای نقطه ای که دارای یک ویژگی x
874
00:42:10,240 –> 00:42:12,800
و y است تعریف
875
00:42:12,800 –> 00:42:16,480
کرده ایم، بنابراین ما نیز می خواهیم این ها را وارد کنیم. دو
876
00:42:16,480 –> 00:42:19,359
چیز، بنابراین ما جهت را وارد می کنیم و
877
00:42:19,359 –> 00:42:24,480
نقطه را وارد می کنیم و سپس از
878
00:42:24,480 –> 00:42:26,079
مجموعه ها می
879
00:42:26,079 –> 00:42:30,160
گوییم که می خواهیم عرشه را وارد کنیم، بنابراین این یک
880
00:42:30,160 –> 00:42:33,440
ساختار داده است که می خواهیم خاطرات خود را در آن ذخیره کنیم،
881
00:42:33,440 –> 00:42:35,119
882
00:42:35,119 –> 00:42:38,720
بنابراین اگر نمی دانید عرشه چیست، پس
883
00:42:38,720 –> 00:42:41,280
من wi یک لینک در توضیحات
884
00:42:41,280 –> 00:42:42,319
زیر قرار خواهم داد،
885
00:42:42,319 –> 00:42:45,119
بنابراین در این مورد واقعاً مفید است و
886
00:42:45,119 –> 00:42:48,000
بعداً خواهید دید که چرا اینطور است
887
00:42:48,000 –> 00:42:51,680
و سپس در اینجا میخواهم برخی از
888
00:42:51,680 –> 00:42:54,960
پارامترها را به عنوان ثابت تعریف کنم، بنابراین ما
889
00:42:54,960 –> 00:42:59,599
حداکثر حافظه را مثلاً 100
890
00:42:59,599 –> 00:43:00,640
000
891
00:43:00,640 –> 00:43:04,560
داشته باشیم. می تواند 100000 مورد را در این
892
00:43:04,560 –> 00:43:05,760
حافظه ذخیره کند،
893
00:43:05,760 –> 00:43:10,240
سپس ما همچنین می خواهیم از یک اندازه دسته ای استفاده
894
00:43:10,240 –> 00:43:12,800
کنیم که بعداً آن را خواهید دید و در اینجا من آن را
895
00:43:12,800 –> 00:43:15,760
روی 1000 تنظیم می کنم تا بتوانید
896
00:43:15,760 –> 00:43:17,839
با این پارامترها بازی کنید
897
00:43:17,839 –> 00:43:21,200
و همچنین من یک نرخ یادگیری را بعداً
898
00:43:21,200 –> 00:43:25,040
می خواهم و می خواهم این را روی 0 0 1 قرار دهید
899
00:43:25,040 –> 00:43:27,920
و بله راحت باشید این را تغییر دهید و
900
00:43:27,920 –> 00:43:32,160
سپس ما شروع به ایجاد عامل کلاس خود
901
00:43:32,160 –> 00:43:35,599
می کنیم و البته یک تابع init
902
00:43:35,599 –> 00:43:38,839
با self و بدون آرگومان های دیگر دریافت می
903
00:43:38,839 –> 00:43:42,800
کند و سپس اجازه دهید نگاهی
904
00:43:42,800 –> 00:43:45,839
به اسلایدهای قسمت اول بیندازیم. من
905
00:43:45,839 –> 00:43:48,319
آموزش را توضیح دادم
906
00:43:48,319 –> 00:43:51,599
بنابراین می خواهیم یک تابع آموزشی ایجاد
907
00:43:51,599 –> 00:43:54,160
کنیم که در آن همه این کارها را انجام دهیم، بنابراین
908
00:43:54,160 –> 00:43:57,680
باید حالت را محاسبه
909
00:43:57,680 –> 00:43:59,760
کنیم که در آن از محیط فعلی آگاه
910
00:43:59,760 –> 00:44:03,359
هستیم، سپس باید
911
00:44:03,359 –> 00:44:06,960
حرکت بعدی از وضعیت را محاسبه
912
00:44:06,960 –> 00:44:09,280
کنیم و نیاز داریم به
913
00:44:09,280 –> 00:44:12,000
اوم سپس ما WA nt را آپدیت کنیم یا مرحله بعدی را انجام دهیم
914
00:44:12,000 –> 00:44:14,800
و game.playstep را فراخوانی کنیم و
915
00:44:14,800 –> 00:44:17,280
دوباره حالت جدید را محاسبه کنیم سپس می
916
00:44:17,280 –> 00:44:20,400
خواهیم همه چیز را در حافظه ذخیره کنیم و
917
00:44:20,400 –> 00:44:23,599
سپس می خواهیم مدل خود را آموزش دهیم بنابراین
918
00:44:23,599 –> 00:44:26,960
باید بازی و مدل را
919
00:44:26,960 –> 00:44:28,480
در این کلاس ذخیره کنیم.
920
00:44:28,480 –> 00:44:30,880
بنابراین اول از همه اجازه دهید ابتدا توابعی را ایجاد کنم
921
00:44:30,880 –> 00:44:33,760
که به آن نیاز داریم، بنابراین ما به
922
00:44:33,760 –> 00:44:38,240
یک تابع get state نیاز داریم که خودش می شود و
923
00:44:38,240 –> 00:44:41,200
این بازی را دریافت می کند
924
00:44:41,200 –> 00:44:44,160
و سپس حالتی را که به
925
00:44:44,160 –> 00:44:46,800
شما نشان دادم با این 11
926
00:44:46,800 –> 00:44:49,440
متغیر مختلف محاسبه می کنیم سپس می خواهیم یک
927
00:44:49,440 –> 00:44:52,119
تابعی که بهش
928
00:44:52,119 –> 00:44:56,560
میگیم memory memory و خودش داره و اینجا
929
00:44:56,560 –> 00:45:00,560
میخوایم در حالت قرار
930
00:45:00,560 –> 00:45:03,200
بدیم بعد اکشن بعد پاداش
931
00:45:03,200 –> 00:45:06,400
این عمل رو به خاطر بسپاریم و میخوایم محاسبه
932
00:45:06,400 –> 00:45:09,680
کنیم یا حالت بعدی رو ذخیره
933
00:45:09,680 –> 00:45:11,839
934
00:45:11,839 –> 00:45:15,920
کنیم و همچنین میخواهید انجام شده یا بیت را ذخیره کنید یا
935
00:45:15,920 –> 00:45:18,319
میتوانید این بازی را بیش از حد صدا بزنید، بنابراین
936
00:45:18,319 –> 00:45:22,000
این حالت فعلی بازی بیش از حد است، سپس ما
937
00:45:22,000 –> 00:45:25,839
به دو عملکرد مختلف برای آموزش نیاز
938
00:45:25,839 –> 00:45:29,200
داریم و این قطار تعریفشده را
939
00:45:29,200 –> 00:45:32,800
روی حافظه طولانی صدا میزنیم و فقط به خود نیاز دارد،
940
00:45:32,800 –> 00:45:35,599
بنابراین بعداً این را توضیح خواهم داد.
941
00:45:35,599 –> 00:45:39,599
و همچنین اجازه دهید این را کپی و پیست کنیم، من
942
00:45:39,599 –> 00:45:44,160
همچنین یک تابع تعریف قطار روی
943
00:45:44,160 –> 00:45:47,839
حافظه کوتاه دارم، بنابراین این فقط با یک
944
00:45:47,839 –> 00:45:48,880
مرحله است
945
00:45:48,880 –> 00:45:50,640
که بعداً آن را خواهید دید،
946
00:45:50,640 –> 00:45:54,240
سپس ما به یک تابع نیاز داریم و این
947
00:45:54,240 –> 00:45:58,000
عمل را دریافت مینامیم تا عمل را بر
948
00:45:58,000 –> 00:46:02,400
اساس وضعیت دریافت کنیم. خودش و حالت می شود
949
00:46:02,400 –> 00:46:05,599
و ابتدا فقط می گوییم پاس
950
00:46:05,599 –> 00:46:08,560
و اینها همه توابع مورد نیاز ما هستند
951
00:46:08,560 –> 00:46:12,800
حدس می زنم و سپس می خواهم یک
952
00:46:12,800 –> 00:46:16,960
تابع جهانی داشته باشم که آن را به سادگی train می نامم
953
00:46:16,960 –> 00:46:20,000
و در اینجا می گوییم پاس و سپس وقتی
954
00:46:20,000 –> 00:46:24,079
این ماژول را شروع می کنیم h نقطه pi بنابراین می گوییم
955
00:46:24,079 –> 00:46:25,680
اگر
956
00:46:25,680 –> 00:46:28,560
خط خطی نام برابر با
957
00:46:28,560 –> 00:46:32,560
main باشد، به سادگی این تابع قطار را صدا
958
00:46:32,560 –> 00:46:34,720
می زنیم و سپس می توانیم
959
00:46:34,720 –> 00:46:37,839
اسکریپت را با گفتن python agent dot pi شروع
960
00:46:37,839 –> 00:46:40,960
کنیم، همانطور که در همان آموزش اول انجام
961
00:46:40,960 –> 00:46:43,680
دادم، بنابراین بیایید پیاده سازی عامل و
962
00:46:43,680 –> 00:46:46,000
تابع آموزشی را شروع کنیم. بیایید
963
00:46:46,000 –> 00:46:49,280
با تابع init عامل شروع کنیم، بنابراین
964
00:46:49,280 –> 00:46:52,720
در اینجا چیزی که میخواهم ذخیره کنم این است که ابتدا
965
00:46:52,720 –> 00:46:56,920
میخواهم چند پارامتر دیگر را
966
00:46:56,920 –> 00:47:00,079
ذخیره کنم، بنابراین self.تعداد بازیها، بنابراین میخواهم این را
967
00:47:00,079 –> 00:47:02,240
پیگیری کنم، بنابراین در ابتدا صفر باشد
968
00:47:02,240 –> 00:47:03,359
969
00:47:03,359 –> 00:47:06,400
سپس self.epsilon
970
00:47:06,400 –> 00:47:10,480
برابر با ام صفر در ابتدا
971
00:47:10,480 –> 00:47:13,960
این پارامتری برای کنترل
972
00:47:13,960 –> 00:47:17,920
تصادفی بودن است، بنابراین بعداً این را خواهید دید،
973
00:47:17,920 –> 00:47:22,319
سپس ما همچنین به گامای خود نقطه برابر با صفر نیاز داریم،
974
00:47:22,319 –> 00:47:23,520
975
00:47:23,520 –> 00:47:25,680
بنابراین
976
00:47:25,680 –> 00:47:29,119
این به اصطلاح این نرخ شمارش است
977
00:47:29,119 –> 00:47:31,520
که در اولین آموزش به طور خلاصه نشان
978
00:47:31,520 –> 00:47:33,680
دادم که توضیح خواهم داد. این
979
00:47:33,680 –> 00:47:36,240
کمی بیشتر در آموزش بعدی که در
980
00:47:36,240 –> 00:47:38,400
آن مدل و الگوریتم یادگیری عمیق q واقعی را پیاده سازی
981
00:47:38,400 –> 00:47:41,440
می کنیم، سپس می
982
00:47:41,440 –> 00:47:43,960
خواهیم یک حافظه داشته باشیم، بنابراین می گوییم
983
00:47:43,960 –> 00:47:47,920
self.memory برابر است و برای این کار از این پشته استفاده می کنیم
984
00:47:47,920 –> 00:47:51,839
و این می تواند یک آرگومان
985
00:47:51,839 –> 00:47:54,480
حداکثر طول داشته باشد. برابر است
986
00:47:54,480 –> 00:47:57,520
و در اینجا می گوییم حداکثر حافظه
987
00:47:57,520 –> 00:48:00,800
و چه اتفاقی می افتد اگر از این
988
00:48:00,800 –> 00:48:04,079
حافظه تجاوز کنیم، به طور خودکار
989
00:48:04,079 –> 00:48:07,200
عناصر را از سمت چپ حذف می کند، بنابراین
990
00:48:07,200 –> 00:48:10,240
برای ما پاپ چپ را صدا می کند و به همین دلیل است که این
991
00:48:10,240 –> 00:48:12,640
دک اینجا واقعاً مفید است
992
00:48:12,640 –> 00:48:15,440
و بعداً اینجا نیز می خواهیم برای
993
00:48:15,440 –> 00:48:19,200
داشتن مدل و ترینر
994
00:48:19,200 –> 00:48:22,800
ما این کار را برای a یا s می گذارم تا قسمت آخر
995
00:48:22,800 –> 00:48:25,680
در ویدیوی بعدی انجام شود و اکنون
996
00:48:25,680 –> 00:48:28,720
همه اینها برای تابع init است و اکنون می توانیم
997
0