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

تُعرَّف Game Theory عادةً بأنها دراسة النماذج الرياضية للتفاعل الاستراتيجي بين أطراف تتخذ قراراتها وفق مصالحها. ولا يقتصر تطبيقها على الألعاب التقليدية، بل يمتد إلى الاقتصاد والسياسة والمنافسة الحيوية وحتى الأنظمة الاجتماعية المعقّدة.
في أي لعبة من هذا النوع، توجد عناصر أساسية:
- مجموعة من القواعد التي تنظّم التفاعل.
- لاعبون أو وكلاء يتخذون قرارات.
- استراتيجيات متاحة لكل لاعب.
- مقياس للعائد أو المنفعة يسعى كل طرف إلى تعظيمه.
أما في السياق التطوري، فإن هذا العائد لا يُقاس بالمال أو النقاط، بل بمفهوم اللياقة التطورية؛ أي قدرة الكائن أو صفاته الوراثية على الاستمرار والتمثّل في الجيل التالي. وكل صفة تزيد فرص البقاء والتكاثر ترفع من قيمة هذه اللياقة، وبالتالي تصبح أكثر قابلية للانتقال عبر الأجيال.
من هنا تنشأ نظرية الألعاب التطورية، التي تنقل مفاهيم الألعاب الاستراتيجية إلى عالم التطور البيولوجي. وهي تتيح لنا طرح أسئلة دقيقة مثل: أي استراتيجية ستسود؟ وهل يمكن لاستراتيجيات متعددة أن تتعايش؟ وإذا كان التعايش ممكناً، فما النسب التي تظهر عندها داخل المجتمع الحيوي؟
ما المقصود بالديناميكيات التكرارية؟
تعتمد نظرية الألعاب التطورية غالباً على ما يُعرف باسم Replicator Dynamics، أو الديناميكيات التكرارية. والفكرة ببساطة أن التفاعل بين الأفراد يؤثر في لياقتهم، ثم تأتي الأجيال اللاحقة بحيث يكون تمثيل الأفراد أو الاستراتيجيات فيها متناسباً مع اللياقة التي حققوها.
بمعنى آخر، الاستراتيجية التي تمنح أصحابها نتائج أفضل تميل إلى الانتشار أكثر مع الزمن. أما الاستراتيجية الأقل نجاحاً فتتراجع حصتها تدريجياً. وهذا ما يجعل النموذج مناسباً جداً لفهم كيفية نشوء التوازنات السلوكية في الطبيعة.
نموذج الصقر والحمامة: أشهر أمثلة نظرية الألعاب التطورية
يُعد نموذج Hawk-Dove من النماذج الكلاسيكية في هذا المجال، وقد اشتهر بفضل أعمال العالم John Maynard Smith في سبعينيات القرن الماضي. يفترض هذا النموذج وجود جماعة من الحيوانات تتنافس على مورد محدود، مثل الغذاء أو مساحة النفوذ. وكلما حصل الفرد على موارد أكثر، ارتفعت لياقته التطورية.
في هذا النموذج، يختار كل فرد إحدى استراتيجيتين:
- استراتيجية الصقر: سلوك عدواني يقوم على القتال للفوز بالمورد مهما كانت الكلفة.
- استراتيجية الحمامة: سلوك مسالم يتجنب القتال ويفضّل المشاركة أو الانسحاب.
المهم هنا أن الصقر والحمامة ليسا نوعين مختلفين من الحيوانات، بل اسمان رمزيان لنمطين سلوكيين داخل النوع نفسه.
الحالات الممكنة للمواجهة
1. صقر ضد صقر
عندما يلتقي فردان يتبعان استراتيجية hawk، يدخلان في قتال مباشر. احتمال الفوز متساوٍ تقريباً بينهما، لكن الخاسر يتحمل كلفة الإصابة. لذلك يكون العائد المتوقع مزيجاً من فرصة الحصول على المورد مقابل خطر التعرض لخسارة مؤلمة في اللياقة.
2. صقر ضد حمامة
إذا واجه hawk فرداً من نوع dove، فإن الحمامة تنسحب فوراً لتجنب الصدام. يحصل الصقر على المورد كاملاً، بينما لا تنال الحمامة شيئاً، لكنها أيضاً لا تتحمل كلفة الإصابة.
3. حمامة ضد حمامة
عندما يلتقي فردان مسالمان، لا يحدث قتال، بل يُقسَّم المورد بينهما بالتساوي. وبهذا يحصل كل واحد على نصف القيمة من دون كلفة إضافية.
الصياغة الرياضية للنموذج
لفهم النموذج بدقة، نعرّف المتغيرات التالية:
V: قيمة الفوز بالمورد.C: كلفة الإصابة الناتجة عن الخسارة في القتال.p: نسبة الأفراد الذين يتبعون استراتيجيةhawkفي الجماعة.1-p: نسبة الأفراد الذين يتبعون استراتيجيةdove.
بعد ذلك نعرّف دالتين تمثلان اللياقة المتوقعة لكل استراتيجية:
F(H): اللياقة المتوقعة عند اختيار استراتيجية الصقر.F(D): اللياقة المتوقعة عند اختيار استراتيجية الحمامة.
الفرد الذي يلعب كصقر سيواجه صقوراً أخرى بنسبة p، ويواجه حمائم بنسبة 1-p. أما الفرد الذي يلعب كحمامة فسيخسر أمام الصقر، لكنه سيتقاسم المورد مع الحمائم الأخرى عندما يلتقي بها.

أما اللياقة المتوقعة لاستراتيجية الحمامة فتأخذ في الاعتبار أنها لا تكسب شيئاً أمام الصقور، لكنها تحصل على نصف قيمة المورد عند مواجهة حمامة أخرى بنسبة 1-p.

كيف نحسب نقطة التوازن بين الاستراتيجيتين؟
للوصول إلى حالة التوازن، نساوي بين F(H) وF(D). هذا يعني أننا نبحث عن قيمة p التي لا تمنح عندها أي من الاستراتيجيتين أفضلية صافية على الأخرى. عند هذه النقطة يصبح من الممكن أن تتعايش الاستراتيجيتان داخل الجماعة.

وبعد بعض التبسيط الجبري نحصل على نسبة التوازن بين الصقور والحمائم:

وباستخراج قيمة p مباشرة، نصل إلى صيغة توضح نسبة الصقور داخل المجتمع عند التوازن:

ماذا تخبرنا المعادلة؟
تحليل هذا التعبير يقود إلى نتيجتين مهمتين:
- إذا كانت كلفة الخسارة
Cأقل من أو تساوي قيمة الفوزV، فإن استراتيجيةhawkتهيمن على الجماعة. في هذه الحالة لا يتحقق تعايش مستقر، لأن العدوان يصبح مجزياً أكثر من اللازم. - إذا كانت كلفة الإصابة
Cأكبر من قيمة الموردV، فإن الاستراتيجيتين يمكن أن تتعايشا عند نقطة توازن مستقرة.
على سبيل المثال، عند التعويض بالقيمتين V = 4 وC = 6، نجد أن التوازن يحدث عندما يتبع نحو 2/3 من الجماعة استراتيجية الصقر. وهذه نتيجة لافتة لأنها تعني أن السلوك العدواني قد يكون شائعاً، لكنه لا يسيطر بالكامل عندما تصبح كلفة الصراع مرتفعة.
محاكاة النموذج باستخدام بايثون
من أفضل الطرق لفهم هذا النوع من النماذج بناء محاكاة عملية. سنستخدم لغة Python لإنشاء أفراد افتراضيين يتنافسون، ثم نراقب كيف تتغير نسب الاستراتيجيات عبر الأجيال.
الملف الأول: bird.py
import random
class Bird:
def __init__(self, strategy):
"""
Each bird has a strategy type (hawk or dove)
And a small starting fitness
"""
self.strategy = strategy
self.fitness = 10
def contest(self, opponent, v, c):
"""
Simulate the outcomes depending on the strategies
"""
# both hawks --> 50:50 battle
if self.strategy == opponent.strategy == "hawk":
if random.randint(0, 1) == 1:
self.fitness = self.fitness + v
opponent.fitness = opponent.fitness - c
else:
self.fitness = self.fitness - c
opponent.fitness = opponent.fitness + v
# hawk meets dove
elif self.strategy == "hawk" != opponent.strategy:
self.fitness = self.fitness + v
opponent.fitness = opponent.fitness
elif self.strategy == "dove" != opponent.strategy:
self.fitness = self.fitness
opponent.fitness = opponent.fitness + v
# both doves --> share the resource
else:
self.fitness = self.fitness + v / 2
opponent.fitness = opponent.fitness + v / 2
def spawn(self):
"""
Allow a small chance of mutation to flip strategy
Otherwise, return offspring of the same type
"""
mutation = random.randint(0, 1000) > 999
if mutation:
if self.strategy == "dove":
return Bird("hawk")
else:
return Bird("dove")
else:
return Bird(self.strategy)
الملف الثاني: simulation.py
في هذا الملف نبدأ بجماعة تتكوّن بالكامل من حمائم، ثم ننفذ خطوة زمنية في كل دورة بحيث تتوزع المواجهات عشوائياً، وبعدها نُنشئ الجيل التالي اعتماداً على اللياقة النسبية لكل فرد. تتكرر العملية ألف مرة، ثم نحفظ النتائج في ملف ونرسمها بيانياً.
from bird import Bird
import random
import numpy as np
import pandas as pd
import matplotlib
def initialise():
"""
Create a population of birds - all dove to begin
"""
birds = []
for _ in range(1000):
birds.append(Bird("dove"))
return birds
def timestep(birds, value, cost):
"""
Pair up the birds, make them compete
Then produce next generation, weighted by fitness
"""
next_generation = []
random.shuffle(birds)
for _ in range(1000):
# pair up random birds to contest
a, b = random.sample(birds, 2)
a.contest(b, value, cost)
# generate next generation
fitnesses = [bird.fitness for bird in birds]
draw = random.choices(birds, k=1000, weights=fitnesses)
next_generation = [bird.spawn() for bird in draw]
return next_generation
def main():
birds = initialise()
rows = []
V = 4
C = 6
for _ in range(1000):
# add the counts to a new row
strategy = [bird.strategy for bird in birds]
n_hawks = strategy.count("hawk")
n_doves = strategy.count("dove")
row = {'n_hawks': n_hawks, 'n_doves': n_doves}
rows.append(row)
# run the timestep function
birds = timestep(birds, V, C)
# create dataframe and save output
df = pd.DataFrame(rows)
df.to_csv('simulation.csv')
fig = df.plot(y=["n_hawks", "n_doves"]).get_figure()
fig.savefig('simulation.pdf')
if __name__ == "__main__":
main()
كيف نفسّر هذه المحاكاة؟
تعكس هذه الشيفرة فكرة جوهرية في evolutionary dynamics: الأفراد لا يُختارون عشوائياً للجيل التالي، بل وفقاً لما حققوه من لياقة. وهذا يشكّل حلقة تغذية راجعة مستمرة:
- إذا كانت الحمائم كثيرة، يصبح سلوك الصقر مربحاً لأنه يحصل على المورد بسهولة.
- لكن إذا زاد عدد الصقور كثيراً، ترتفع كلفة المواجهات العنيفة، فتصير الحمامة أكثر جدوى نسبياً.
- مع مرور الوقت، يدفع هذا التفاعل المتبادل النظام نحو نقطة توازن مستقرة.
هذه الفكرة تفسّر لماذا لا تنتصر العدوانية دائماً، ولماذا لا يسود التعاون المطلق أيضاً. فالأمر يعتمد على الكلفة والعائد، وعلى توزّع السلوكيات في المجتمع نفسه.
نتيجة المحاكاة العملية
عند تشغيل النموذج باستخدام V = 4 وC = 6، تظهر النتائج متوافقة مع التحليل الرياضي: تزداد نسبة الصقور من مجتمع بدأ كله حمائماً، ثم تستقر النسب حول التوازن المتوقع نظرياً.

وهذا يبرز قيمة النماذج الرياضية البسيطة: فهي لا تقدم وصفاً نظرياً مجرداً فقط، بل تستطيع أيضاً التنبؤ بسلوك أنظمة ديناميكية معقدة بدرجة مدهشة من الدقة.
لماذا تُعد نظرية الألعاب التطورية مهمة؟
تكمن أهمية هذا المجال في أنه يقدّم تفسيراً رياضياً لسلوكيات نلاحظها في الطبيعة والمجتمعات البشرية معاً. فالكثير من الأنماط مثل التعاون، التنافس، الردع، وتقاسم الموارد يمكن فهمها بوصفها نتائج ناشئة عن تفاعل استراتيجيات متعددة تحت ضغوط الانتقاء.
كما أن توفر أدوات البرمجة والتحليل الإحصائي اليوم يجعل اختبار الفرضيات النظرية أسهل من أي وقت مضى. فمن خلال محاكاة قصيرة نسبياً بلغة مثل Python، يمكن مقارنة التوقعات الرياضية بالنتائج الفعلية ومراقبة تطور النظام خطوة بخطوة.
الخلاصة التقنية
تُظهر نظرية الألعاب التطورية أن السلوك الناجح ليس ثابتاً في جميع الظروف، بل يعتمد على البيئة ونِسَب الاستراتيجيات الموجودة داخل الجماعة. ويُعد نموذج Hawk-Dove مثالاً ممتازاً على ذلك، لأنه يكشف أن التوازن بين العدوان والتعاون ليس مسألة أخلاقية أو عشوائية، بل نتيجة مباشرة لحسابات الكلفة والعائد. ومن منظور تقني، فإن الجمع بين التحليل الرياضي والمحاكاة البرمجية يمنح فهماً أعمق للأنظمة المعقدة، ويؤكد أن النماذج البسيطة قد تكون شديدة الفعالية في تفسير الواقع والتنبؤ به.