recent
أخبار ساخنة

كيفية إنشاء محاكاة مونت كارلو باستخدام بايثون

الصفحة الرئيسية

 

ما هي محاكاة مونت كارلو؟

محاكاة مونت كارلو هي نوع من الخوارزمية الحسابية التي تقدر احتمالية حدوث حدث غير محدد بسبب تورط متغيرات عشوائية. تعتمد الخوارزمية على أخذ العينات العشوائية المتكررة في محاولة لتحديد الاحتمال. هذا يعني محاكاة حدث بمدخلات عشوائية لعدد كبير من المرات للحصول على تقديرك. يمكنك تحديد عوامل أخرى أيضًا ، وسنرى ذلك في المثال. يمكن استخدام محاكاة مونت كارلو في مجموعة واسعة من المجالات التي تمتد من الاقتصاد ، والمقامرة ، والهندسة ، والطاقة ، وأي شيء بينهما. لذلك ، بغض النظر عن المجال الوظيفي الذي تعمل فيه ، فمن الجيد أن تعرف شيئًا عنه.

عند تعلم كيفية إنشاء عمليات محاكاة مونت كارلو ، من الأفضل البدء بنموذج أساسي لفهم الأساسيات. الطريقة الأسهل والأكثر شيوعًا للقيام بذلك هي الألعاب البسيطة ، لذلك سوف نستفيد من لعبة النرد في هذه المقالة. من المحتمل أنك سمعت المثل ، "المنزل دائمًا يفوز" ، لذلك في هذا المثال ، سيكون للمنزل (عادةً كازينو) ميزة ، وسنعرض ما يعنيه ذلك بالنسبة للأرباح المحتملة للاعب.

لعبة النرد

ستشمل لعبتنا البسيطة نردان من ستة جوانب. من أجل الفوز ، يحتاج اللاعب إلى دحرجة نفس الرقم على كلا النرد. النرد السداسي له ستة نتائج محتملة (1 ، 2 ، 3 ، 4 ، 5 ، و 6). مع اثنين من النرد ، هناك الآن 36 نتيجة محتملة (1 و 1 ، 1 و 2 ، 1 و 3 ، إلخ ، أو 6 × 6 = 36 احتمالًا). في هذه اللعبة ، يتمتع المنزل بفرص أكبر للفوز (30 نتيجة مقابل 6 نتائج للاعب) ، مما يعني أن المنزل يتمتع بميزة تامة.

لنفترض أن لاعبنا بدأ برصيد 1000 دولار وهو مستعد لخسارة كل شيء ، لذلك راهنوا بدولار واحد على كل لفة (بمعنى أنه يتم رمي النرد) وقرروا لعب 1000 لفة. لأن المنزل كريم للغاية ، فإنهم يعرضون دفع 4 أضعاف رهان اللاعب عندما يفوز اللاعب. على سبيل المثال ، إذا ربح اللاعب أول لفة ، فإن رصيده يزيد بمقدار 4 دولارات ، وينتهي الجولة برصيد 1004 دولارات. إذا ذهبوا بأعجوبة إلى 1000 لفة متتالية ، فيمكنهم العودة إلى ديارهم بمبلغ 5000 دولار. إذا خسروا كل جولة ، يمكنهم العودة إلى المنزل بدون أي شيء. ليست نسبة مخاطرة سيئة ... أو ربما تكون كذلك.

استيراد حزم بايثون

دعنا نحاكي لعبتنا لمعرفة ما إذا كان اللاعب قد اتخذ الخيار الصحيح للعب. نبدأ الكود الخاص بنا عن طريق استيراد حزم Python الضرورية: Pyplot من Matplotlib وعشوائية. سنستخدم Pyplot لتصور نتائجنا وبشكل عشوائي لمحاكاة لفة نرد عادية سداسية الجوانب. وظيفة لفة النرد

# Importing Packages
import matplotlib.pyplot as plt
import random

بعد ذلك ، يمكننا تحديد دالة تقوم بترتيب عدد صحيح من 1 إلى 6 عشوائيًا لكل من نرد (محاكاة لفة). ستعمل الوظيفة أيضًا على مقارنة حجري النرد لمعرفة ما إذا كانا متماثلين. ستعيد الوظيفة متغيرًا منطقيًا ، same_num ، لتخزينه إذا كانت القوائم هي نفسها أم لا. سنستخدم هذه القيمة لاحقًا لتحديد الإجراءات في التعليمات البرمجية الخاصة بنا.

# Creating Roll Dice Function
def roll_dice():
die_1 = random.randint(1, 6)
die_2 = random.randint(1, 6)

# Determining if the dice are the same number
if die_1 == die_2:
same_num = True
else:
same_num = False
return same_num

متغيرات المدخلات والتتبع

ستتطلب منك كل محاكاة لمحاكاة مونت كارلو أن تعرف ما هي مدخلاتك وما هي المعلومات التي تتطلع للحصول عليها. لقد حددنا بالفعل ما هي مدخلاتنا عندما وصفنا اللعبة. قلنا أن عدد القوائم لكل لعبة هو 1000 ، والمبلغ الذي سيراهن اللاعب على كل لفة هو 1 دولار. بالإضافة إلى متغيرات الإدخال لدينا ، نحتاج إلى تحديد عدد المرات التي نريد محاكاة اللعبة. يمكننا استخدام متغير عدد المحاكاة كعدد لمحاكاة مونت كارلو. كلما زاد هذا الرقم ، زادت دقة الاحتمال المتوقع مع قيمته الحقيقية.

عادة ما يتناسب عدد المتغيرات التي يمكننا تتبعها مع مدى تعقيد المشروع ، لذا من المهم تحديد ما تريد معلومات عنه. في هذا المثال ، سنتعقب احتمالية الفوز (الفوز في كل لعبة مقسومًا على إجمالي عدد القوائم) والتوازن النهائي لكل محاكاة (أو لعبة). تتم تهيئة هذه كقوائم وسيتم تحديثها في نهاية كل لعبة.

# Inputs
num_simulations = 10000
max_num_rolls = 1000
bet = 1

# Tracking
win_probability = []
end_balance = []

إعداد الشكل

الخطوة التالية هي إعداد الشكل الخاص بنا قبل تشغيل المحاكاة. من خلال القيام بذلك قبل المحاكاة ، فإنه يسمح لنا بإضافة خطوط إلى الشكل الخاص بنا بعد كل لعبة. بعد ذلك ، بمجرد تشغيل جميع عمليات المحاكاة ، يمكننا عرض الحبكة لإظهار نتائجنا.

# Creating Figure for Simulation Balances
fig = plt.figure()
plt.title("Monte Carlo Dice Game [" + str(num_simulations) + "
simulations]")
plt.xlabel("Roll Number")
plt.ylabel("Balance [$]")
plt.xlim([0, max_num_rolls])

محاكاة مونت كارلو

في الكود أدناه ، لدينا حلقة for خارجية تتكرر من خلال عدد عمليات المحاكاة المحددة مسبقًا (10000 محاكاة) وحلقة أثناء متداخلة تدير كل لعبة (1000 لفة). قبل أن نبدأ كل حلقة أثناء ، نقوم بتهيئة رصيد اللاعب على أنه 1000 دولار (كقائمة لأغراض التخطيط) وإحصاء اللفات والفوز.

ستعمل حلقة while loop على محاكاة اللعبة مقابل 1000 لفة. داخل هذه الحلقة ، نرمي النرد ونستخدم المتغير المنطقي العائد من roll_dice () لتحديد النتيجة. إذا كان النرد هو نفس الرقم ، نضيف 4 أضعاف الرهان إلى قائمة الرصيد ونضيف فوزًا إلى عدد الفوز. إذا كان النرد مختلفًا ، فإننا نطرح الرهان من قائمة الرصيد. في نهاية كل لفة ، نضيف عددًا إلى قائمة عدد اللفات.

بمجرد أن يصل عدد القوائم إلى 1000 ، يمكننا حساب احتمالية فوز اللاعب بعدد مرات الفوز مقسومًا على إجمالي عدد القوائم. يمكننا أيضًا تخزين الرصيد النهائي للعبة المكتملة في متغير end_balance التعقب. أخيرًا ، يمكننا رسم عدد اللفات ومتغيرات التوازن لإضافة خط إلى الشكل الذي حددناه سابقًا.

الحصول على النتائج

تتمثل الخطوة الأخيرة في عرض بيانات مفيدة من متغيرات التتبع لدينا. يمكننا عرض الشكل (الموضح أدناه) الذي أنشأناه في حلقة for الخاصة بنا. أيضًا ، يمكننا حساب وعرض (كما هو موضح أدناه) احتمالية الفوز الإجمالية ورصيد النهاية من خلال حساب متوسط قوائم احتمالية الفوز و end_balance.

تحليل النتائج

أهم جزء في أي محاكاة لمونتي كارلو (أو أي تحليل لهذا الأمر) هو استخلاص النتائج من النتائج. من رقمنا ، يمكننا تحديد أن اللاعب نادرًا ما يحقق ربحًا بعد 1000 لفة. في الواقع ، متوسط ​​الرصيد الختامي لمحاكاة 10000 هو 833.66 دولارًا (قد تختلف نتائجك قليلاً بسبب التوزيع العشوائي). لذلك ، على الرغم من أن المنزل كان "كريمًا" في دفع 4 أضعاف رهاننا عندما فاز اللاعب ، إلا أن المنزل لا يزال في المقدمة.

نلاحظ أيضًا أن احتمال فوزنا يبلغ حوالي 0.1667 ، أو 1/6 تقريبًا. دعونا نفكر في سبب حدوث ذلك. بالعودة إلى إحدى الفقرات السابقة ، لاحظنا أن اللاعب قد حقق 6 نتائج يمكن أن يفوز بها. لاحظنا أيضًا أن هناك 36 لفة محتملة. باستخدام هذين الرقمين ، نتوقع أن يفوز اللاعب بـ 6 لفات من أصل 36 لفة ، أو 1/6 لفة ، وهو ما يتطابق مع تنبؤات مونت كارلو الخاصة بنا. لطيف جدا!

استنتاج

يمكنك استخدام هذا المثال لتكون مبدعًا وتجربة رهانات مختلفة ، ولقطات نرد مختلفة ، وما إلى ذلك. يمكنك أيضًا تتبع بعض المتغيرات الأخرى إذا أردت. استخدم هذا المثال للاعتياد على محاكاة مونت كارلو وجعله ملكًا لك حقًا. في ملاحظة أكثر إثارة للاهتمام ، إذا دفع المنزل 5 أضعاف الرهان ، فإن اللاعب سيتساوى مع المنزل في المتوسط. علاوة على ذلك ، إذا دفعوا أي مبلغ يزيد عن 5 أضعاف الرهان ، فمن المحتمل أن يُفلس المنزل في النهاية. إذا كنت تريد أن ترى هذه النتائج ، فأعلمني في التعليقات! يوضح هذا المثال البسيط سبب أهمية عمليات محاكاة مونت كارلو واحتمالاته.

google-playkhamsatmostaqltradent