مرحبًا ومرحبًا بكم في برنامج Python التعليمي هذا.
حسنًا ، سنقوم اليوم بوظيفة التحديث ، والتي ستعمل على تحديث كل شيء
هناك للتحديث بمجرد وصول العين إلى حالة جديدة.
لذلك عندما تصل إلى الحالة الجديدة ، كما تعلم ، نحتاج إلى تحديث الإجراء.
يصبح الإجراء الأخير هو الإجراء الجديد الذي تم عرضه ، ولكنه أيضًا الحالة الأخيرة التي تصبح الحالة
الجديدة.
وأخيرًا ، المكافأة الأخيرة.
تصبح هذه هي المكافأة الجديدة التي نحصل عليها عندما نلعب الإجراء.
هذا هو المسار المنطقي الذي يحدث مباشرة بعد تحديد الإجراء ، نحتاج إلى تحديث
جميع عناصر التحولات وبالطبع سنحصل على انتقال جديد.
لذا سيتعين علينا إلحاق هذا الانتقال الجديد بالذاكرة.
وأخيرًا ، سنقوم أيضًا بتحديث نافذة المكافآت الخاصة بنا ، كما تعلمون ، لمراقبة
تطور كيفية سير التدريب وكيف يسير الاستكشاف.
ولكن الشيء الأكثر أهمية بالنسبة لك هو أنه يمكننا أخيرًا إجراء اتصال بين الذكاء
الاصطناعي الذي نطبقه الآن على خريطتنا ، لأننا إذا عدنا إلى خريطتنا ، تذكر أن هناك
وظيفة التحديث الكبيرة هذه في اللعبة صف دراسي.
هذا هو المكان الذي نصنع فيه اللعبة مع السيارة ونحدد كيف يجب معاقبة السيارة
عندما ترتكب خطأ.
لكن في فئة اللعبة هذه ، نلاحظ وظيفة التحديث هذه وفي وظيفة التحديث هذه ، نلاحظ
أن هذا الخط يساوي تحديث نقطة الدماغ ، ومكافأة أقل ، وإشارة أقل.
وفي الواقع هذا هو بالضبط ما كنا على وشك القيام به.
نحن على وشك إجراء وظيفة التحديث هذه التي ستأخذ المكافأة الأخيرة والإشارة الأخيرة للحصول على الإجراء
التالي للعب.
لذلك لن نقوم فقط بتحديث جميع العناصر المختلفة للانتقال ، ولكن في الغالب سنلعب الإجراء الذي يجب
أن نلعبه عند الحصول على المكافأة الأخيرة والإشارة الأخيرة.
وبالتالي ، بالطبع ، في وظيفة التحديث هذه ، سنستخدم وظيفة إجراء التحديد التي قمنا بتنفيذها للتو
من قبل.
سنقوم بدمج وظيفة Select Action في وظيفة التحديث المستقبلي التي نحن بصدد القيام بها لتحديد
الإجراء الصحيح للعب بالإضافة إلى إجراء جميع التحديثات.
لذلك من المهم حقًا إجراء هذا الارتباط بالخريطة.
في الوقت الحالي ، ما نحن بصدد تحقيقه هو في النهاية الصلة بين الذكاء الاصطناعي الخاص بنا واللعبة ، اللعبة التي
نصنعها في هذا الفصل.
وما يمكننا فعله الآن هو أن نأخذ هذا التحديث مباشرةً في آخر مرة كنا آخر إشارة لأن هذه هي بالضبط الوظيفة
التي سنقوم بها باستخدام هاتين الوسيطتين هنا.
وكتذكير سريع ، الدماغ هو هدف أعيننا.
وهذا هو موضوع الفصل.
إذن ما سنفعله الآن هو أننا سنقوم بنسخ هذا التحديث ، مكافأة أقل ، إشارة أقل ، وستكون هذه هي
وظيفتنا التالية التي نقوم بها ، وبالتالي سألصقها هنا.
ثم لمجرد توخي الحذر ، أود فقط أن أقدم بعض الأسماء المختلفة عن الأسماء التي لدينا هنا.
كما تعلم ، لدينا مكافأة أقل هنا.
وأنا لا أريد الخلط بين هذه المكافأة الأخيرة مع هذه.
يمكن أن يكون ذلك خطيرًا.
لذلك سأستبدل الكلمة الأخيرة هنا بالمكافأة.
وبالمناسبة ، نفس الشيء مع إشارة أقل.
دعنا فقط نضع إشارة أو حتى إشارة جديدة لتحديد أننا نريد إجراء التحديث عند الوصول إلى حالة جديدة
وبالتالي الحصول على إشارة جديدة.
ولكن بعد ذلك ، بالطبع ، هذه المكافأة هنا ستكون آخر مكافأة نحصل عليها هنا ، كما تعلم ، عندما نذهب إلى بعض الرمال
أو ما هو أسوأ ، عندما نقترب كثيرًا من حافة واحدة من الخريطة.
هذا هو المكان الذي نحدد فيه المكافأة الأخيرة.
ستكون هذه المكافأة الأخيرة هي مدخلات وظيفة التحديث.
لهذا السبب لدينا مكافأة أقل هنا.
لكن هنا أعطي فقط اسمًا آخر لمكافأة الحجة حتى لا تخلط بينها.
آخر كلمة هنا.
حسنا.
إذن هذه هي وظيفة التحديث.
والآن دعنا نذهب بداخله ونفعل هذين الأمرين.
هذا هو تحديث جميع عناصر انتقالنا وبالطبع حدد الإجراء.
تمام.
إذن ما الذي نحتاجه للتحديث أولاً؟
حسنًا ، كما فهمت ، نريد إجراء التحديث عند الوصول إلى حالة جديدة.
لذا فإن أول شيء سنقوم بتحديثه هو بوضوح هذه الحالة الجديدة.
هذه هي الحالة الجديدة التي نصل إليها.
لذلك سأسمي هذه الحالة الجديدة ، الدولة الجديدة ثم متساوية.
فكيف نحصل على هذه الدولة الجديدة؟
حسنًا ، بالطبع ، هذا يعتمد على الإشارة ، الإشارة الجديدة التي اكتشفتها المستشعرات للتو.
وللتذكير ، فإن الحالة هي الإشارة نفسها المكونة من الإشارات الثلاث لأجهزة الاستشعار ، والإشارة الأولى ، والإشارة
الثانية والإشارات الثلاثة ، بالإضافة إلى الاتجاه والتوجيه الناقص.
هذه دولتنا.
لذا تأكد من فهم أن الإشارة هي الحالة.
لكنها الآن قائمة بسيطة من خمسة عناصر.
وبما أن هذا سيكون مدخلات الشبكة العصبية ، تذكر أنه يتعين علينا تحويله
إلى موتر شعلة.
لذلك هذا بالضبط ما سنفعله الآن.
سنأخذ مكتبة الشعلة الخاصة بنا ثم نأخذها.
فئة Tensor.
هناك نذهب.
والذي سيحول إشارتنا الجديدة إلى موتر شعلة.
ثم من الأفضل التأكد من أن جميع عناصر موتر الشعلة تطفو.
لذلك سأقوم بتحويل نوع لتحويلهم إلى تعويم مثل هذا ثم أخيرًا أحاول الحصول على رد الفعل
لما نحتاج إلى القيام به بعد ذلك.
إنه ، بالطبع ، لإنشاء هذا البعد المزيف ، لإضافة بُعد يتوافق مع الدُفعة.
ونقوم بذلك ، بالطبع ، باستخدام وظيفة الضغط التي يتعين علينا إدخال مؤشر هذا البعد الوهمي
الذي نريده للدفعة ، وهو صفر.
حسنا.
والآن لدينا حالتنا الجديدة تتكون من ثلاث إشارات من أجهزة الاستشعار الثلاثة بالإضافة إلى الاتجاه
ناقص الاتجاه.
وبالطبع ، سيعتمد ذلك على الإشارة الجديدة التي نحصل عليها من خلال وظيفة التحديث هذه مباشرةً عند هذا
الخط.
الإشارة الأخيرة ، نحصل على الإشارات الثلاث بالإضافة إلى الاتجاه مطروحًا منه الاتجاه.
وللتذكير ، هذه الإشارات الثلاث هي كثافة الرائحة المكتشفة حول المستشعرات.
حسنا.
لقد حصلنا للتو على حالتنا الجديدة ، وهذا يعني أننا وصلنا إلى الحالة الجديدة وعلينا الآن إجراء التحديث
التالي.
لذا وفقًا لك ، ما الذي نحتاجه للتحديث الآن؟
ما هو الشيء المنطقي الذي يجب تحديثه الآن بعد الوصول إلى هذه الحالة الجديدة؟
حسنًا ، ما نحتاج إلى تحديثه الآن هو الذاكرة.
لماذا هذا؟
ذلك لأنه في كل مرة يتألف الانتقال من الحالة الحالية حيث أن الحالة التالية هي t زائد
واحد والمكافأة r t والإجراء a t.
والآن لدينا t بالفعل ولدينا T بالفعل ولدينا بالفعل t وحصلنا للتو على العنصر الأخير
في الانتقال مثل T زائد واحد.
لذلك من خلال الحصول على هذه الحالة الجديدة مثل T زائد واحد ، نحصل على انتقال جديد تمامًا للذاكرة.
وبالتالي يتعين علينا إلحاق هذا الانتقال الجديد تمامًا بالذاكرة لأن هذا مجرد انتقالنا
التالي.
لهذا السبب علينا تحديث الذاكرة الآن.
وبالتالي ، ما سأفعله هو أخذ كائن ذاكرتي الذي تم إنشاؤه من فئة ذاكرة إعادة التشغيل ، وبالتالي
سأقوم بأخذ الذات.
تلك الذاكرة للإشارة إلى الكائن.
ولكن بما أنني أستخدم self ، يجب أن أدرج الذات في وظيفة التحديث.
حتى الآن يمكنك أن ترى حقًا ما هي الذات.
عندما تستخدم متغيرًا واحدًا قمت بإنشائه وتهيئته في دالة init.
إذاً الذاكرة النقطية الذاتية ونحن الآن بحاجة إلى تحديثها.
ووفقًا لك ، كيف سنقوم بتحديث ذلك؟
حسنًا ، الخبر السار هو أننا قمنا بالفعل بعمل وظيفة للقيام بذلك.
إنها وظيفة الدفع التي تلحق حدثًا أو انتقالًا إلى الذاكرة.
هذا هو بالضبط ما سنستخدمه الآن.
سنستخدم وظيفة الدفع لإلحاق انتقالنا الجديد الذي قمنا به للتو بالذاكرة.
وبالتالي ، أنا هنا لا أعتبر متساويًا لأننا سنستخدم طريقة وبالتالي يمكننا
استخدام الدفع النقطي مباشرةً.
وأولًا ، سأضيف الانتقال ، هذا الانتقال الجديد الذي حصلنا عليه للتو
وهذا أولاً هو آخر حالة ذاتية حتى أقل حالة.
إذن هذا هو S-T هذا بالضبط هو الموجود بالفعل.
ثم العنصر التالي لهذا الانتقال هو بالطبع الحالة الجديدة التي وصلنا إليها للتو.
وبالتالي ، نظرًا لأنه ليس متغيرًا للكائن الذي أنشأناه وأعدناه في دالة init
هذه ، فإننا لا نضع الذات هنا.
نضع الدولة الجديدة مباشرة.
ثم العنصر التالي في الانتقال هو الإجراء والقول بأن لدينا بالفعل الإجراء الأخير
، وهو الإجراء الذاتي الأخير هنا.
لذلك بالطبع يساوي الصفر ، ولكن بعد ذلك بالطبع سيتم تحديثه بوظيفة التحديد.
لكن هذا هو واحد.
إذن ، فهذا هو الإجراء الذاتي للنقطة الأخيرة.
لكن كن حذرا الآن.
يجب أن تكون العناصر التي نقوم بتضمينها في هذا الانتقال هي راقصات الشعلة.
كما ترى ، هذا هو الحال بالنسبة للتاريخ الأخير.
إنها راقصة الشعلة.
الدولة الجديدة هي أيضا راقصة الشعلة.
ولذا يجب أن يكون هذا هو نفسه بالنسبة للإجراء.
ثم المكافأة بالطبع.
لكنك ستفكر الآن ، كيف يمكن أن تكون راقصة شعلة ، مع الأخذ في الاعتبار أنها مجرد رقم
، كما تعلمون ، الإجراء إما صفر واحد أو اثنين ، لكن في الواقع ، هذه ليست مشكلة.
لا يزال بإمكاننا تحويل هذا المتغير صفر أو متغيران إلى راقص شعلة.
سيكون هذا ما نسميه موتر طويل.
الطويل هو نوع ، وهذا هو الموتر الذي سيحتوي على عدد صحيح.
لأن القسم الأخير عدد صحيح ، فهو صفر واحد أو اثنان.
إذن ما سنأخذه الآن هو مصباح مكتبتنا.
ثم سنستغرق وقتًا طويلاً هنا هو فئة الموتر الطويلة التي ستنشئ كائنًا جديدًا ، والذي سيكون الموتر
الطويل نفسه.
وباستخدام وظيفة الإجراء الذاتي الأخير كمدخل ، فإنها ستنشئ هذا الموضوع طويل المدى ، لكنها
ستظل تحتوي على صفر واحد أو اثنين في كائن موتر طويل.
وهذا فقط ليكون متسقًا مع الانتقال.
يجب أن يحتوي ذلك فقط على أجهزة استشعار لأننا نعمل مع PyTorch ونعمل مع الشبكة العصبية.
لذلك علينا أن نعمل مع أجهزة الاستشعار حتى نذهب بشعلة موتر طويل.
وتحويل أخير يجب إجراؤه ، يجب أن نتأكد من أن ما بداخل هذه الإجابة الطويلة هو عدد صحيح وللتأكد من ذلك ،
حتى لو كنا نعلم بالفعل أن القسم الأخير هو صفر واحد أو اثنان للتأكد من أننا
ذاهبون إلى قم بإجراء هذا التحويل من النوع int مرة أخرى ، نقوم بتحويل الإجراء الذاتي الأخير إلى عدد صحيح.
هناك نذهب.
وبعد ذلك ، يجب علينا فقط وضع الإجراء الذاتي الأخير للعدد الصحيح بين قوسين هنا حتى نحصل الآن على موتر طويل لعنصر
واحد والذي سيكون هذا الإجراء الأخير صفرًا واحدًا أو اثنين بحد ذاته.
لذا فإن النقطة الأساسية هي كيفية تحويل رقم بسيط ، صفر واحد أو اثنين إلى موتر بلمسة.
حسنا.
وأخيرًا ، العنصر الأخير في الانتقال ، وهذا بالطبع آخر مكافأة حصلنا عليها.
هذا هو بالضبط متغير المكافأة الأخير الذي أنشأناه في دالة init التي تمت تهيئتها إلى
الصفر ولكن بالطبع يتم تحديثها هنا في هذا الرمز إما عندما نتطرق إلى نوع من المكافأة السالبة
أو إذا ابتعدنا عن الهدف ، هذا مرة أخرى مكافأة سلبية.
إذا اقتربنا من الهدف ، فهذه مكافأة إيجابية.
وأسوأ عقوبة إذا اقتربنا جدًا من إحدى حواف الخريطة ، حسنًا ، هذه مكافأة سلبية
رهيبة ، ناقص واحد.
و هذا كل شيء.
لذلك دعونا نضيف هذا العنصر الأخير من نفسية الانتقال التي تكافئ.
لذلك أقوم بنسخ هذا اللصق هنا والآن علينا إجراء تحويل آخر والذي سيكون بالطبع هو نفسه تمامًا
مثل هذا التحويل.
فقط نظرًا لأن المكافأة ليست عددًا صحيحًا بل رقمًا عائمًا ، فسنقوم ببساطة بعمل شعلة لتحويل الموتر.
لكن بدون ints ، سنحتفظ بالأقواس هنا لأنه ، كما تعلم ، علينا أولاً
أن نضع الرقم في قائمة ثم ستذهب هذه القائمة كمدخلات في فئة موتر الشعلة.
لكن لا يتعين علينا إجراء ذلك في التحويل لأن المكافأة الأخيرة هي رقم عائم.
إذن ما سنفعله هو ببساطة إضافة موتر نقطة الشعلة إلى هذا الموتر ، ثم الأقواس ، الأقواس.
وسنغلق الأقواس هنا ونغلق الأقواس.
هناك نذهب.
للتلخيص مع الحالة الجديدة التي وصلنا إليها للتو والمكافأة ، نلاحظ حدثًا جديدًا من الانتقال
نضيفه إلى الذاكرة.
وهذا الانتقال يحتوي على الحالة الأخيرة فيما يتعلق بالدولة الجديدة.
SD زائد واحد ، الإجراء الأخير لعب 80 والمكافأة الأخيرة.
حسنًا.
حسنا.
والآن نحن جيدون في تحديث ذاكرتنا.
لذلك دعونا نحصل على استراحة سريعة وسنتولى التحديث التالي في البرنامج التعليمي التالي.
حتى ذلك الحين ، استمتع.
أنا.