خوارزمية تسلق الجبل هي واحدة من أقدم وأبسط خوارزميات التحسين في مجال الذكاء الاصطناعي وعلوم الكمبيوتر. تنتمي إلى فئة تسمى خوارزميات البحث المحلي، التي تجد الحلول من خلال تحسينات تدريجية.
يأتي اسم الخوارزمية من تشبيه مفيد: تخيل متسلق جبال معصوب العينين يحاول الوصول إلى قمة الجبل. نظرًا لعدم قدرتهم على رؤية المناظر الطبيعية بأكملها، يمكنهم فقط الشعور بالأرض المحيطة بهم مباشرة. في كل خطوة، يتحركون في أي اتجاه يؤدي إلى الأعلى. هذا يعكس كيفية عمل الخوارزمية – حيث يقوم بتقييم الحلول القريبة والتحرك تدريجيًا نحو الأفضل، في محاولة للعثور على الحل الأمثل (قمة الجبل).
في هذا المقال، سنستكشف خوارزمية تسلق التل في عمق، ومتغيراتها، وكيف يمكنك تنفيذها باستخدام لغة Python. إذا كنت جديدًا على الذكاء الاصطناعي، تأكد من الاطلاع على مسار المهارات الأساسية في الذكاء الاصطناعي لتغطية الأساسيات.
ما هي خوارزمية تسلق التل في الذكاء الاصطناعي؟
تسلق التل هو طريقة بسيطة يستخدمها الكمبيوتر لحل المشاكل عن طريق العثور على أفضل إجابة ممكنة، تمامًا كما يفعل المتسلقون الذين يحاولون الوصول إلى قمة الجبل. في مجال الذكاء الاصطناعي، نحتاج غالبًا إلى العثور على أفضل حل بين العديد من الخيارات الممكنة. ويُطلق على هذا التحسين.
فكر في محاولة العثور على أعلى نقطة أثناء لعبة “ساخن وبارد”. في هذه اللعبة، يمكنك فقط التحقق مما إذا كنت تصبح “أدفأ” (أفضل) أو “أبرد” (أسوأ) أثناء التنقل. يعمل تسلق الجبل بنفس الطريقة – حيث ينظر إلى الحلول القريبة ويتحرك نحو الأفضل.
إليك كيف يعمل ذلك في خطوات بسيطة:
- ابدأ بأي حل ممكن
- انظر إلى الحلول القريبة
- إذا كان الحل القريب أفضل، انتقل إليه
- كرر الخطوات 2-3 حتى لا يمكن العثور على حلول أفضل
على سبيل المثال، إذا كنت تحاول تعليم روبوت كيفية المشي، فإن تقنية تسلق التلة قد:
- تبدأ بحركات عشوائية للأرجل
- تجرب حركات مختلفة قليلاً
- تحتفظ بتلك التي تساعد الروبوت على المشي بشكل أفضل
- تكرار هذه العملية حتى يجد أفضل نمط للمشي
على الرغم من أن تسلق التلال ليس دائمًا الطريقة الأكثر تقدمًا في الذكاء الاصطناعي، إلا أنه يعتبر كتلة بناء مهمة تساعدنا على فهم كيف يمكن للكمبيوتر حل المشاكل بمفرده، على غرار خوارزمية الحد الأدنى.
أنواع خوارزميات تسلق التلال
هناك ثلاثة أنواع رئيسية من خوارزميات تسلق التلال، كلٌّ منها له طريقته الخاصة في البحث عن أفضل حل:
١. تسلق التلال البسيط
تسلق التلال البسيط يشبه اتخاذ الخطوة الجيدة الأولى التي تجدها. في هذا الإصدار:
- الخوارزمية تنظر إلى الحلول القريبة واحدة تلو الأخرى
- فور العثور على حل أفضل، تأخذه
- لا تفحص الخيارات الأخرى
- هذا سريع ولكن قد يفوت حلولًا أفضل كانت قريبة قليلاً
2. تسلق الهضبة الأشد ارتفاعًا
هذا الإصدار أكثر دقة من التسلق البسيط:
- إنه ينظر إلى جميع الحلول القريبة قبل اتخاذ خطوة
- يختار أفضل خيار من كل ما وجده
- يستغرق وقتًا أطول ولكنه عادة ما يجد حلولًا أفضل
- إنه مثل التحقق بعناية من كل مسار قبل خطوة
3. تسلق التل المتعشي
يضيف هذا النوع بعض العشوائية لجعل البحث أكثر إثارة:
- بدلاً من دائماً اختيار أفضل حل، يختار عشوائيًا من بين الخيارات الأفضل
- الحلول الأفضل لديها فرصة أعلى لتكون مختارة
- تساعد هذه العبثية في تجنب الوقوع في أماكن سيئة
- إنه مثل أحيانًا اتخاذ مسار مختلف فقط لمعرفة إلى أين يؤدي
كل نوع له قواه الخاصة ويعمل بشكل أفضل لأنواع مختلفة من المشاكل. تسلق التل المبسط سريع ولكن أساسي، والصعود الأشد هو دقيق ولكن أبطأ، والعشوائي يضيف عبثيًا مفيدًا لتجنب الاحتباس.
كيف يعمل خوارزمية تسلق التل
تعمل خوارزمية تسلق التل عن طريق إجراء تحسينات صغيرة خطوة بخطوة حتى تجد أفضل حل ممكن يمكنها الوصول إليه. دعنا نقسم كيف تعمل إلى أجزائها الرئيسية.
1. البدء
كل خوارزمية تسلق تلال تحتاج نقطة بداية. فكر في الأمر كما لو كنت تختار من أين تبدأ التسلق على الجبل. يمكنك أن تبدأ عشوائياً، أو يمكنك استخدام ما تعرفه عن المشكلة لتختار نقطة بداية جيدة.
مكان بدايتك مهم حقاً – اختر مكاناً جيداً وقد تجد أفضل الحلول بسرعة. اختر مكاناً سيئاً وقد تعلق على تل صغير بدلاً من أن تجد قمة الجبل.
على سبيل المثال، في تدريب الشبكات العصبية، يعني نقطة البداية اختيار الأوزان الابتدائية للاتصالات بين الخلايا العصبية. يمكنك تهيئة هذه الأوزان عشوائيًا، مما يشبه بدء مغامرتك في نقطة عشوائية على الجبل. أو يمكنك استخدام تقنيات مثل التهيئة زافيير التي تختار أوزان بداية ذكية بناءً على هيكل الشبكة.
تساعد التهيئة الجيدة الشبكة على التعلم بشكل أسرع والعثور على حلول أفضل، بينما قد تترك التهيئة السيئة الشبكة عالقة بدقة منخفضة لا تتحسن أبدًا.
2. النظر إلى الحلول القريبة
عندما يبدأ الخوارزمية بالبحث، يقوم بتقييم الحلول المجاورة التي تشابه الوضع الحالي. فكر في ذلك كما لو كنت تستكشف الجوانب القريبة بخطوات صغيرة. على سبيل المثال، إذا كنت تحاول تحسين مسار التسليم بين المدن، وكان المسار الحالي الخاص بك هو [A -> B -> C -> D]
، ستقوم الخوارزمية بدراسة مسارات مشابهة مثل [A -> B -> D -> C]
أو [A -> C -> B -> D]
لمعرفة ما إذا كانت تقلل من المسافة الإجمالية المقطوعة. كل تغيير صغير في المسار يمثل “حلاً مجاورًا” قد يكون بالإمكان أن يكون أفضل من الحالي.
لإجراء هذه المقارنات، تعتمد الخوارزمية على ما يُسمى بوظيفة هدف — وهي صيغة رياضية تعين درجة أو قيمة لكل حلاٍ محتمل.
تعمل هذه الوظيفة مثل بوصلة، تساعد الخوارزمية على فهم الاتجاهات التي تقود “صعودا” نحو حلول أفضل والتي تقود “هبوطا” نحو حلول أسوأ. بالنسبة لمسار التسليم، ستقوم الوظيفة الهدفية بحساب المسافة الإجمالية المقطوعة – حيث تعني مسافة إجمالية أقصر حلاً أفضل.
إذا كان المسار X يستغرق 100 ميلاً والمسار Z يستغرق 90 ميلاً، فإن المسار Z سيحصل على درجة أفضل (أقل). ستعرف الخوارزمية بعد ذلك كيف تتجه نحو الحلول المماثلة للمسار Z. تقوم الوظيفة الهدفية في الأساس بتحويل المشكلة المعقدة لتحسين المسار إلى رقم بسيط يمكن مقارنته وتقليله.
3. اختيار الخطوة التالية
بعد النظر إلى الحلول القريبة، تحتاج الخوارزمية إلى تحديد الاتجاه الذي ستتحرك فيه بعد ذلك. تقوم الخوارزمية بمقارنة درجات الحلول القريبة بالحل الحالي. إذا وجدت حلاً أفضل، فإنها تتحرك إليه. تجعل النسخ المختلفة من تسلق التل هذا الاختيار بطرق مختلفة:
- النسخة البسيطة تأخذ أول حلاً أفضل يجده
- النسخة الدقيقة تفحص جميع الحلول القريبة قبل اختيار الأفضل منها
- النسخة العشوائية تختار أحيانًا حلولًا ليست الأفضل تمامًا، مما يمكنها من تجنب العلق
4. معرفة متى تتوقف
يحتاج الخوارزم إلى معرفة متى يتوقف عن البحث عن حلول أفضل. عادةً ما يتوقف عند حدوث أحد هذه الأمور:
- لا يمكنه العثور على حلول أفضل في الجوار
- لقد كان يعمل لفترة زمنية طويلة جدًا
- تم العثور على حلا كافياً
كما يعمل الخوارزمية، فإنها عادة ما تتبع نمطاً. في البداية، تجد حلاً أفضل بسرعة، مثل اتخاذ خطوات كبيرة صعوداً على تل شديد الانحدار. ثم، تبطئ مع اقترابها من القمة، مما يجعل تحسينات أصغر حتى تتوقف في النهاية.
أحياناً، يكون المسار سهلاً ومباشراً، ولكن في بعض الأحيان قد يكون صعباً مع العديد من التقلبات.
مزايا وقيود تقنية تسلق التل في الذكاء الاصطناعي
لنلق نظرة على ما يجعل تقنية تسلق التل مفيدة والمشاكل التي قد تواجهها عند استخدامها.
المزايا
التسلق على الهضبة هو أحد أبسط خوارزميات الأمثلة لفهمها وبرمجتها. إنها مثل اتباع قاعدة بسيطة: “إذا كان شيئًا أفضل، فاتجه إليه.” هذا يجعله نقطة بداية رائعة لحل العديد من المشاكل.
عندما يكون المشكلة بسيطة، يمكن للتسلق على الهضبة أن يجد حلول جيدة بسرعة. إنه لا يهدر الوقت في استكشاف كل حل محتمل – بل يتبع المسار نحو الأعلى فقط.
الخوارزمية لا تحتاج إلى الكثير من ذاكرة الكمبيوتر أو قوة المعالجة. إنها تحتاج فقط إلى تذكر مكانها والنظر إلى الحلول القريبة، مما يجعلها عملية لحل العديد من المشاكل الحقيقية.
القيود
بالطبع، كما هو الحال مع أي طريقة، هناك بعض النواحي السلبية المحتملة:
1. العالقة على التلال الصغيرة
أكبر مشكلة مع تسلق الجبال هي أنه قد يعلق عند ما نسميه “القمم المحلية” – وهذه تشبه التلال الصغيرة عندما يكون هناك جبل بالقرب منها. بمجرد أن يصل الخوارزمية إلى قمة تلة صغيرة، تتوقف لأن كل شيء حولها أقل ارتفاعًا، على الرغم من وجود حلول أفضل بكثير في أماكن أخرى.
2. مشكلة الأرض المسطحة
أحيانًا تجد الخوارزمية نفسها على أرض مسطحة (تسمى هضبة)، حيث تكون جميع الحلول القريبة متساوية الجودة. تخيل محاولة العثور على أعلى نقطة أثناء سيرك على ملعب كرة قدم مسطح – من الصعب معرفة الطريق الصحيح!
3. مشكلة السلسلة
فكر في محاولة المشي على قمة سلسلة جبلية ضيقة. قد تضيع الخوارزمية الوقت في التمايل من جانب إلى آخر عبر السلسلة بدلاً من التقدم نحو الذروة. يحدث هذا لأن كل خطوة جانبية تبدو مثل البقاء على المسار.
4. نقطة البداية تهم كثيرًا
مكان بدايتك يمكن أن يحدث فارقًا كبيرًا في كيفية عمل الخوارزمية. إنه مثل بدء رحلة – ابدأ من المكان الخطأ، وقد لا تجد قمة الجبل الأعلى أبدًا.
هذه القيود لا تعني أن تسلق التل هو خيار سيء – فهي تعني فقط أننا بحاجة لأن نكون حذرين في متى وكيفية استخدامه. في بعض الأحيان، يمكننا دمجه مع تقنيات أخرى للتغلب على هذه المشاكل، والتي سنناقشها في القسم التالي.
استراتيجيات للتغلب على القيود
عند استخدام تسلق التل، يمكننا استخدام العديد من الاستراتيجيات الذكية لحل المشاكل التي ناقشناها سابقًا. دعونا استكشاف نهجين رئيسيين يساعدان في جعل تسلق التل يعمل بشكل أفضل.
إعادة بدء تسلق التل عشوائيًا
أحد أفضل الطرق لتجنب العلق على التلال الصغيرة هو محاولة التسلق من نقاط بداية مختلفة. يُطلق على هذا النهج تسلق التل مع إعادة البدء العشوائي، ويعمل تمامًا كما يبدو – إذا علقت، ابدأ من جديد في مكان جديد.
فكر في محاولة العثور على أعلى جبل في سلسلة ضبابية. إذا بدأت بالتسلق على أول تلة تجدها ووصلت إلى قمتها، قد تفوت جبلًا أعلى بكثير قريبًا. لكن إذا كنت تستطيع النقل الفوري إلى نقاط مختلفة وبدأت بالتسلق مرة أخرى، فسيكون لديك فرصة أفضل بكثير للعثور على القمة الأعلى في النهاية.
ها هي كيفية عملها: أولاً، قم بتشغيل خوارزمية التسلق على التلة العادية حتى تتوقف. بدلاً من الاستسلام، احفظ أفضل حل وجدته ثم ابدأ من جديد في نقطة عشوائية جديدة. استمر في القيام بذلك لعدة محاولات، وفي النهاية، اختر أفضل حل من جميع محاولاتك.
جمال الإعادة العشوائية هو أنها بسيطة ولكن فعالة. كل إعادة تمنحك فرصة جديدة للعثور على القمة الأعلى. على الرغم من أنه يستغرق وقتًا أطول من التسلق العادي، إلا أنه من المرجح بكثير العثور على أفضل حل.
التبريد المحاكاة
على الرغم من أنها ليست تقنية صعود التل، إلا أن التبريد المحاكي هو تغيير ذكي يساعد في حل العديد من مشاكل صعود التل. إنها مستوحاة من كيفية تبريد المعادن وتقويتها في الأعمال المعدنية. عندما تبرد المعدن ببطء، تجد ذراته مواقع أفضل، مما يجعل المعدن أقوى.
في هذا النهج، يقبل الخوارزمية أحيانًا الحلول الأسوأ عمدًا، خصوصًا في البداية. مع مرور الوقت، تصبح أكثر انتقائية في قبول الحلول. إنها كالكرة ترتد على سطح متموج — في البداية، لديها ما يكفي من الطاقة للارتداد فوق التلال، لكن مع فقدان الطاقة، تستقر في مكان جيد.
ها هي كيفية عملها: في البداية، قد يقبل الخوارزمية حلاً يكون أسوأ من الحالي بمعدل احتمالية عالٍ. تعتمد هذه الاحتمالية على شيئين: مدى سوء الحل الجديد ومدى تشغيل الخوارزمية. مع مرور الوقت، تصبح الخوارزمية أقل احتمالًا لقبول الحلول الأسوأ، وتتصرف في النهاية بشكل أكثر تشابهًا لـ تسلق التلال العادي.
القوة الحقيقية للتبريد المحاكي هي أنه يمكنه الهروب من التلال الصغيرة والمناطق المستوية، خاصة في بداية البحث. من خلال قبول الحلول الأسوأ أحيانًا، يمكن له:
- الخروج من القمم المحلية (التلال الصغيرة)
- عبور الهضاب (المناطق المستوية)
- تجاوز التلال (قمم ضيقة)
- استكشاف المزيد من مساحة الحل
على سبيل المثال، تخيل أنك تحاول ترتيب الأثاث في غرفة لتعظيم المساحة. قد يؤدي نقل كرسي إلى ازدحام مؤقت في الغرفة، ولكن يمكن أن يتيح لك نقل قطع أخرى إلى مواقع أفضل بكثير بعد ذلك. يمكن لعملية التبريد المحاكاة أن تكون على استعداد لتجربة هذه الترتيبات الأسوأ مؤقتًا، خاصة في بداية العملية، للعثور على الترتيب الأفضل بشكل عام.
تظهر لنا هذه الاستراتيجيات أن الطريقة الأفضل لحل مشكلة ليست دائمًا باتخاذ الخطوة الواضحة دائمًا. من خلال إضافة عناصر العشوائية والفوضى المُسيطر عليها، يمكننا في كثير من الأحيان العثور على حلول أفضل مما كنا سنجدها عند اتباع المسار المباشر دائمًا.
تنفيذ خوارزمية تسلق التلة البسيطة باستخدام لغة البرمجة Python
الآن بعد فهمنا كيفية تحسين تسلق الهضبة باستراتيجيات مثل الإعادة العشوائية والتبريد المحاكاة، دعونا نطبقها على مشكلة مالية حقيقية: تحسين المحفظة.
يساعد تحسين المحفظة المستثمرين في اتخاذ قرارات بشأن كيفية توزيع أموالهم عبر استثمارات مختلفة. عندما يقوم المستثمرون ببناء محفظة، يرغبون في تحقيق أعلى عوائد ممكنة مع الحفاظ على مخاطرهم منخفضة. إيجاد هذا التوازن أمر صعب – إنه مثل محاولة العثور على الوصفة المثالية مع العديد من المكونات.
في عام 1952، وجد الاقتصادي هاري ماركويتز طريقة ذكية لحل هذه المشكلة. أظهر أن المستثمرين يمكنهم تقليل مخاطرهم عن طريق مزج الاستثمارات التي لا تتحرك معًا صعودًا وهبوطًا. يُسمى هذا التنويع – إنه مشابه لعدم وضع جميع البيض في سلة واحدة.
عند بناء محفظة استثمارية، نحتاج إلى تحديد ثلاثة أمور رئيسية:
- كمية الأموال التي نتوقع كسبها (العائد المتوقع)
- مدى المخاطرة في الاستثمارات (مخاطر المحفظة)
- ما إذا كانت الأرباح المحتملة تستحق المخاطرة (العائد المعدل بالنسبة للمخاطر)
تعمل تقنية تسلق الجبال جيدًا لهذه المشكلة لأن التغييرات الصغيرة في كيفية توزيع أموالنا عادة ما تؤدي إلى تغييرات صغيرة في أداء المحفظة. تخيل تلًا ناعمًا حيث يمثل كل نقطة طريقة مختلفة لاستثمار أموالك. تُظهر النقاط العالية اختيارات استثمارية أفضل.
للعثور على محفظة جيدة باستخدام تقنية “صعود التل”، سنقوم بما يلي:
- نبدأ بمزيج عشوائي من الاستثمارات
- نجرب مزيجات مختلفة قليلاً لنرى ما إذا كانت تعمل بشكل أفضل
- نواصل إجراء تحسينات صغيرة حتى لا نتمكن من العثور على خيارات أفضل
- نستخدم أفضل مزيج وجدناه
عن طريق استخدام صعود التل بهذه الطريقة، يمكننا مساعدة المستثمرين في العثور على محافظ استثمارية أفضل بين الملايين من التركيبات المحتملة. إنها كما لو كان لديك مساعد ذكي يمكنه اختبار بسرعة العديد من مزيجات الاستثمار المختلفة للعثور على تلك التي تحقق توازنًا جيدًا بين المخاطر والعوائد.
أولاً، دعونا نحدد وظيفتنا الهدفية، والتي تعتبر مقياسًا لأداء المحفظة الذي يتوازن بين العوائد المتوقعة والمخاطر. تأخذ قائمة بأوزان المحفظة كإدخال وتعيد نتيجة، حيث تشير النتائج الأعلى إلى محافظ أفضل.
def objective_function(state): """ Portfolio optimization objective function that maximizes expected returns while minimizing risk. The state represents portfolio weights for different assets. Args: state (list): List of portfolio weights for different assets (should sum to 1) Returns: float: Portfolio score combining returns and risk """ # العوائد السنوية المتوقعة للأصول (قيم أمثلة) expected_returns = [0.1, 0.12, 0.18, 0.1, 0.15] # 8%، 12%، إلخ. # المخاطر (التقلب) لكل أصل volatilities = [0.1, 0.2, 0.3, 0.2, 0.2] # 10%، 20%، إلخ. # التحقق من تطابق طول الإدخال مع العوائد/التقلبات المتوقعة if len(state) != len(expected_returns): return float("-inf") # إرجاع أسوأ نتيجة ممكنة للحالات غير الصحيحة # حساب عائد المحفظة المتوقع portfolio_return = sum(w * r for w, r in zip(state, expected_returns)) # حساب مخاطر المحفظة (مبسط، دون استخدام مصفوفة التباين) portfolio_risk = sum(w * v for w, v in zip(state, volatilities)) # عقوبة إذا لم تكن الأوزان تجمع إلى 1 (محفظة غير صالحة) weight_sum_penalty = abs(sum(state) - 1) * 100 # عقوبة الأوزان السالبة (عدم البيع القصير) negative_weight_penalty = sum(abs(min(0, w)) for w in state) * 100 # دمج العائد والمخاطر مع عامل الرفض من المخاطر بمعدل 2 # نقاط أعلى تعني أفضل: تعظيم العائد، تقليل المخاطر والعقوبات score = ( portfolio_return - 2 * portfolio_risk - weight_sum_penalty - negative_weight_penalty ) return score
الدالة objective_function
أعلاه تساعدنا على تقييم مدى جودة محفظة الاستثمار الخاصة بنا. دعنا نفصل كيف تعمل:
أولاً، تأخذ قائمة من الأرقام التي تمثل نسبة المال الذي نريد استثماره في أصول مختلفة (مثل الأسهم أو السندات). على سبيل المثال، إذا كان لدينا خمسة أصول، قد نستثمر 20% في كل منها.
تستخدم الدالة قطعتي معلومات مهمتين:
- العوائد المتوقعة: كم من المال نتوقع أن نربحه من كل نشاط (مثل 8% أو 12% سنويًا)
- التقلبات: مدى مخاطرة كل نشاط — أرقام أعلى تعني أن قيمة النشاط تتغير بشكل أكثر عدم تنبؤًا (مثل العملات الرقمية)
ثم تقوم الدالة بالتالي:
- تحسب العائد المتوقع الإجمالي لمحفظتنا عن طريق ضرب العائد المتوقع لكل نشاط بالمبلغ الذي استثمرناه فيه
- تحدد المخاطرة الإجمالية عن طريق النظر إلى تقلب كل نشاط
- تتحقق مما إذا كانت نسب الاستثمار لدينا تضيف إلى 100% (يجب أن تكون كذلك!)
- تتأكد من أننا لا نحاول بيع أصول ليس لدينا ملكية بها (لا توجد نسب سالبة)
وأخيرًا، تجمع كل هذه المعلومات في نقطة واحدة. تعني نقطة أعلى محفظة أفضل. تزداد النقاط مع زيادة العوائد وتنخفض مع زيادة المخاطر. كما تصبح سيئة جدًا إذا لم تكن نسبنا تضيف إلى 100% أو إذا حاولنا استخدام نسب سالبة.
هذه الوظيفة ستساعدنا في العثور على أفضل مزيج من الاستثمارات باستخدام خوارزمية تسلق التل القادمة. إذا لم تفهم الوظيفة الهدف بشكل كامل، لا تقلق – الفكرة الرئيسية هي أنها تخبرنا مدى جودة خليط الاستثمار الخاص بنا، وسنستخدمها للعثور على مزيجات أفضل وأفضل.
الآن، دعنا نحدد وظيفة جديدة لإنشاء حالات محفظة مجاورة من خلال إجراء تعديلات صغيرة على الأوزان.
def get_neighbors(state): """ Generates neighboring states by making small adjustments to portfolio weights Args: state (list): Current portfolio weights Returns: list: List of neighboring portfolio weight configurations """ neighbors = [] step_size = 0.01 # تعديل صغير على الأوزان (1٪) for i in range(len(state)): for j in range(len(state)): if i != j: # نقل الوزن من الأصل i إلى الأصل j neighbor = state.copy() if neighbor[i] >= step_size: # نقل الوزن فقط إذا كان هناك وزن كافٍ متاح neighbor[i] -= step_size neighbor[j] += step_size neighbors.append(neighbor) return neighbors
تعتبر وظيفة get_neighbors جزءًا حاسمًا من خوارزمية تسلق التل الخاصة بنا التي تولد تخصيصات محفظة مماثلة من خلال إجراء تعديلات صغيرة على أوزان محفظتنا الحالية. إليك كيف تعمل:
بالنسبة لكل زوج من الأصول في محفظتنا، تقوم بإنشاء تخصيص محفظة جديد عن طريق نقل كمية صغيرة (1٪) من أحد الأصول إلى الأخرى. على سبيل المثال، إذا كان لدينا خمسة أصول، ستحاول:
- نقل 1٪ من الأصل 1 إلى الأصل 2
- نقل 1٪ من الأصل 1 إلى الأصل 3
- نقل 1٪ من الأصل 1 إلى الأصل 4
- نقل 1٪ من الأصل 1 إلى الأصل 5
- نقل 1٪ من الأصل 2 إلى الأصل 1 وهكذا لجميع الأزواج الممكنة.
تتضمن الوظيفة فحصًا للتأكد من أننا نقوم بنقل الوزن فقط إذا كان لدى الأصل المصدر تخصيص كافٍ (على الأقل 1٪). يمنع هذا الوزن السالب، الذي لن يكون منطقيًا في محفظة حقيقية.
كل تعديل صغير من هذه التعديلات ينشئ “جار” – توزيع محفظة يُشبه تمامًا توزيعنا الحالي ولكن بشكل طفيف مختلف. ثم يقوم خوارزمية تسلق التلال بتقييم هذه الجيران للعثور على توزيعات محفظة أفضل.
حجم الخطوة البالغ 1٪ يوفر توازنًا جيدًا بين استكشاف توزيعات مختلفة وإجراء تغييرات مُراقبة. يمكن أن يفوت حجم الخطوة الأكبر الحلول الأمثل، بينما سيجعل الحجم الأصغر البحث بطيئًا جدًا.
الآن، دعنا نقوم أخيرًا بتنفيذ خوارزمية تسلق التلال البسيطة:
def simple_hill_climbing(initial_state, max_iterations=1000): """ Implements Simple Hill Climbing algorithm Args: initial_state (list): Starting point for the algorithm max_iterations (int): Maximum number of iterations to prevent infinite loops Returns: tuple: (best_state, best_value) found by the algorithm """ current_state = initial_state current_value = objective_function(current_state) for _ in range(max_iterations): # احصل على الحالات المجاورة neighbors = get_neighbors(current_state) # علم للتحقق مما إذا كنا وجدنا جارًا أفضل found_better = False # تحقق من الجيران واحدًا تلو الآخر (تسلق التلال البسيط) for neighbor in neighbors: neighbor_value = objective_function(neighbor) # إذا وجدنا جارًا أفضل، انتقل إليه على الفور if neighbor_value > current_value: current_state = neighbor current_value = neighbor_value found_better = True break # إذا لم يتم العثور على جار أفضل، فقد وصلنا إلى قمة if not found_better: break return current_state, current_value
يبدأ الدالة من حالة ابتدائية وينتقل تدريجيًا إلى حالات جارية أفضل حتى يصل إلى الحد الأقصى المحلي أو العدد الأقصى لعدد التكرارات.
الدالة تأخذ معها معلمتين:
initial_state
: نقطة البدء للتحسين، ممثلة كقائمة من القيمmax_iterations
: معلمة أمان لمنع الحلقات اللانهائية، تبدأ افتراضيًا من 1000 عملية تكرار
يعمل الخوارزمية على النحو التالي:
- تبدأ عند
initial_state
وتحسب قيمة وظيفتها الهدفية - في كل عملية تكرار، تقوم بما يلي:
- تولد الحالات المجاورة باستخدام
get_neighbors()
- تقيم كل جار بشكل فردي
- بمجرد أن يجد جارًا أفضل (قيمة هدف أعلى)، ينتقل إلى تلك الحالة
- إذا لم يُعثر على جار أفضل، فقد وصل إلى الحد الأقصى المحلي وينتهي
تقوم الدالة بإرجاع tuple تحتوي على:
- أفضل حالة تم العثور عليها (قائمة القيم)
- قيمة الدالة الهدف لتلك الحالة
هذا النوع “البسيط” من تسلق التل هو جشاش — حيث ينتقل إلى أول جار أفضل يجده بدلاً من تقييم جميع الجيران للعثور على الأفضل. على الرغم من أن هذا يجعله أسرع، إلا أنه قد يفوت حلولًا أفضل يمكن العثور عليها من خلال الكفاءة أكثر.
الخوارزمية مفيدة للعثور على القمم المحلية ولكن قد تتوقف عند هذه القمم المحلية، مما قد يؤدي إلى تفويت القمة العظمى. على الرغم من هذه القيود، إلا أنها لا تزال شائعة بسبب بساطتها وكفاءتها.
لنقم باختباره على محفظة عينية:
# استخدام مثالي initial_state = [0.15, 0.25, 0.1, 0.3, 0.2] best_state, best_value = simple_hill_climbing(initial_state) print(f"Initial State: {initial_state}") print(f"Best State Found: {best_state}") print(f"Best Value: {best_value}") [OUT]: Initial State: [0.15, 0.25, 0.1, 0.3, 0.2] Best State Found: [0.9700000000000006, 0.009999999999999913, 1.0408340855860843e-17, 0.009999999999999858, 0.009999999999999969] Best Value: -0.1053000000000444
تُظهر النتائج إخراج خوارزمية تسلق التلال الخاصة بنا عند تحسين محفظة. ابتداءً من أوزان عشوائية لخمسة أصول، وجدت مجموعة جديدة من الأوزان التي ساهمت في تحسين قيمة الدالة الهدف. بينما قد حسنت هذه الحلول المحفظة الأولية، إلا أنها قد تكون مجرد قمة محلية حيث يتوقف الخوارزم عند أول قمة يجدها.
تطبيقات تسلق التلال في الذكاء الاصطناعي
تجد خوارزميات تسلق التلال تطبيقات عملية عبر العديد من مجالات الذكاء الاصطناعي وتعلم الآلة. دعونا نستكشف بعض التطبيقات الرئيسية:
1. تحسين نموذج تعلم الآلة
تساعد تقنية “صعود التل” في ضبط نماذج التعلم الآلي بعدة طرق:
- اختيار الميزات: البحث عن أفضل مجموعة من الميزات للنموذج
- ضبط المعلمات الفوقية: تحسين معلمات النموذج مثل معدل التعلم أو عمق الشجرة
- تدريب الشبكات العصبية: ضبط أوزان الشبكة والبنية
- ضغط النموذج: تقليل حجم النموذج مع الحفاظ على الأداء
على سبيل المثال، عند اختيار الميزات لنموذج تنبؤي، قد يبدأ تسلق التلة مع جميع الميزات ويقوم تدريجيًا بإزالتها أو إضافتها استنادًا إلى أداء النموذج. يساعد هذا في العثور على مجموعة ميزات مثلى تحقق توازنًا بين دقة النموذج وتعقيده.
2. الروبوتيات وتخطيط المسار
في مجال الروبوتيات، يساعد تسلق التلة في:
- تخطيط الحركة: العثور على مسارات فعالة من خلال الفضاء الفيزيائي
- تحسين زاوية المفصل: تحديد المواقع الأمثل لأذرع الروبوت
- توضيب الاستشعار: تحسين توضيب الاستشعار لتحقيق أقصى تغطية
- إدارة البطارية: تحسين أنماط استهلاك الطاقة
يمكن أن يستخدم مكنسة كهربائية ذكية تقنية تسلق التلال للعثور على مسارات تنظيف فعالة، مع تعديل مستمر لمسارها بناءً على تغطية الغرفة وعمر البطارية.
3. معالجة اللغة الطبيعية
NLP تشمل التطبيقات:
- تلخيص النصوص: تحسين اختيار محتوى الملخص
- تضمين الكلمات: ضبط تمثيلات الناقل الكلماتي بدقة
- تجميع الوثائق: تنظيم الوثائق في مجموعات مثلى
- تحسين محرك البحث: تحسين تصنيف نتائج البحث
على سبيل المثال، في تلخيص النصوص، يمكن لتقنية Hill Climbing مساعدة في اختيار الجمل التي تزيد من محتوى المعلومات مع الحد الأدنى من التكرار.
4. رؤية الحاسوب في معالجة الصور ورؤية الحاسوب
- تقسيم الصور: العثور على الحدود المثلى بين الأشياء
- معايرة الكاميرا:ضبط معلمات الكاميرا لجودة صورة أفضل
- كشف الكائنات: تحسين مواقع صناديق التحديد
- مطابقة الميزات: العثور على نقاط مقابلة بين الصور
يمكن أن يستخدم نظام التعرف على الوجه نظام التعرف على الوجه تسلق التل لتحسين توجيه ملامح الوجه أثناء المعالجة المسبقة.
5. الذكاء الاصطناعي في الألعاب واتخاذ القرارات
يساعد التسلق على التل في:
- تحسين استراتيجية اللعبة: العثور على الحركات الفائزة في ألعاب اللوح
- تخصيص الموارد: تحسين توزيع الموارد في ألعاب الاستراتيجية
- سلوك الشخصيات غير القابلة للتحكم: تحسين اتخاذ القرارات للشخصيات غير القابلة للتحكم
- إنشاء المستويات: إنشاء مستويات اللعب المتوازنة والمثيرة
غالباً ما تستخدم محركات الشطرنج متغيرات تسلق التل لتقييم وتحسين تسلسل الحركات أثناء اللعب.
6. الأعمال والعمليات
تشمل التطبيقات التجارية العملية:
- تحسين سلسلة التوريد: البحث عن طرق توصيل فعالة
- جدولة الموارد: تحسين جداول العمل الخاصة بالموظفين أو استخدام الآلات
- إدارة المحافظ: تحقيق توازن في محافظ الاستثمار
- إدارة المخزون: تحسين مستويات المخزون
قد تستخدم شركة توصيل تقنية “صعود الجبل” لتحسين باستمرار مسارات التوصيل بناءً على أنماط حركة المرور وأولويات الطرود.
على الرغم من أن تقنية “صعود الجبل” قد لا تجد دائمًا أفضل حلاً، إلا أن بساطتها وكفاءتها تجعلها قيمة لهذه التطبيقات العملية. إنها مفيدة بشكل خاص عندما:
- يتطلب الأمر حلولًا سريعة
- المساحة المشكلة كبيرة جدًا للبحث التفصيلي
- الحلول التقريبية مقبولة
- مساحة الحل نسبيًا سلسة
- يمكن دمج الخوارزمية مع تقنيات أخرى للحصول على نتائج أفضل
الختام
تقف تقنية “صعود الجبل” كخوارزمية أساسية في مجال الذكاء الاصطناعي، تقدم نهجًا سهلاً وفعالًا لمشاكل التحسين.
من خلال استكشافنا، رأينا كيف يمكن تطبيق هذه الفكرة البسيطة للتحرك تدريجيا نحو حلول أفضل في تحديات معقدة عبر تعلم الآلة والروبوتات ومعالجة اللغة الطبيعية وعمليات الأعمال.
على الرغم من أن الخوارزمية لها قيودها، مثل التعلق في نقاط محلية، فإن استراتيجيات مثل إعادة التشغيل العشوائية والتلدين المحاكي قد تطورت لمعالجة هذه التحديات بفعالية.
مع استمرار تقدم الذكاء الاصطناعي، يظل تسلق الجبال ذو أهمية ليس فقط كأداة عملية، ولكن كحجر الزاوية لفهم خوارزميات التحسين الأكثر تعقيدًا. طبيعته البديهية تجعله نقطة بداية ممتازة لأولئك الذين يدخلون مجال الذكاء الاصطناعي، بينما تضمن تنوعه استمرار استخدامه في التطبيقات العملية.
سواء كنت تقوم بتحسين أوزان الشبكة العصبية، أو تخطيط مسارات الروبوت، أو إدارة محافظ الاستثمار، فإن مبادئ تسلق الجبال توفر رؤى قيمة حول كيف يمكن للحواسيب إيجاد حلول أفضل بشكل منهجي لمشاكل صعبة.
إذا كنت تبحث عن معرفة المزيد حول الذكاء الاصطناعي والخوارزميات الخلفية له، تفضل بزيارة مواردنا:
Source:
https://www.datacamp.com/tutorial/hill-climbing-algorithm-for-ai-in-python