اذهب إلى المحتوى
  • 0

اي هي الKnapsack Problem واي هي خورزمياتها؟

Ail Ahmed

السؤال

Recommended Posts

  • 0

وعليكم السلام،

مشكلة الحقيبة (Knapsack Problem) دي واحدة من المشاكل اللي بتقابل الناس اللي بيشتغلوا في علوم الحاسب، وهي من نوع المشاكل اللي بتدور على أحسن طريقة لتحميل حاجات بأوزان وقيم مختلفة جوه حقيبة أو صندوق بسعة محدودة، علشان نحاول نزود القيمة الكلية بتاعت اللي جوا الحقيبة دي. الفكرة منها ممكن تتستخدم في حاجات كتير زي تحميل البضايع أو توزيع الموارد.

الأنواع الرئيسية لمشكلة الحقيبة:
1. 0/1 Knapsack Problem: يا تاخد الحاجة كلها يا تسيبها خالص.
2. Fractional Knapsack Problem: تقدر تاخد جزء من الحاجة في الحقيبة.
3. Bounded Knapsack Problem: كل حاجة ليها عدد محدود تقدر تاخده.

خوارزميات لحل مشكلة الحقيبة:

1. الخوارزمية الجشعة (Greedy Algorithm):
   - بتستخدم لمشكلة الحقيبة الجزئية.
   - الفكرة هي إنك تاخد الحاجات حسب نسبة القيمة للوزن، من الأعلى للأقل، وتحطها في الحقيبة لحد ما تمتلئ.
   - بتكون سريعة بس مش دايماً بتجيب الحل الأمثل للأنواع التانية من المشكلة.

2. البرمجة الديناميكية (Dynamic Programming):
   - دي الطريقة المعتادة لحل مشكلة الحقيبة 0/1.
   - بتقسم المشكلة لمشاكل أصغر وتحفظ النتايج بتاعتها علشان متتحسبش كتير.
   - بتديك حل دقيق بس ممكن تكون غالية من ناحية الذاكرة والوقت لو السعة كبيرة.

3. Branch and Bound:
   - بتستخدم لما تكون عايز حل دقيق لمشكلة الحقيبة 0/1.
   - بتستخدم تقنيات لتقليم الأشجار علشان تتجنب الحالات اللي مش هتجيب حل أحسن من الحل الأحسن المعروف.

4. Approximation Algorithms:
   - لما تكون محتاج حل سريع أكتر من إنك تحصل على الحل الأمثل.
   - بتوفر حلول قريبة من الحل الأمثل وغالبًا تكون كفاية لكتير من الاستخدامات العملية.

يلا بينا نشوف مثال عملي على مشكلة

 الحقيبة باستخدام البرمجة الديناميكية لحل 0/1 Knapsack Problem. في المشكلة دي عندنا حاجات كل واحدة ليها وزن وقيمة، وعايزين نعرف إيه الحاجات اللي لازم نشيلها في الحقيبة علشان تكون الوزن تحت الحد والقيمة أعلى ما يمكن.

المشكلة:
- عندنا حقيبة سعتها 50 وحدة وزن.
- عندنا أربع حاجات بالمواصفات دي:
  - حاجة 1: وزن = 10 وحدة، قيمة = 60 وحدة.
  - حاجة 2: وزن = 20 وحدة، قيمة = 100 وحدة.
  - حاجة 3: وزن = 30 وحدة، قيمة = 120 وحدة.
  - حاجة 4: وزن = 40 وحدة، قيمة = 240 وحدة.

الحل بالبرمجة الديناميكية:
هنستخدم جدول الصفوف بيمثل القيم والأعمدة بتمثل الأوزان من صفر لحد الحد الأقصى للحقيبة. الهدف إن كل خلية في الجدول تعكس القيمة القصوى اللي ممكن تتحقق بالوزن ده باستخدام الحاجات لحد الصف ده.

هنبدأ نملأ الجدول ونحسب القيمة القصوى خطوة بخطوة:

def knapsack(W, weights, values, n):
    # إنشاء جدول K
    K = [[0 for x in range(W + 1)] for x in range(n + 1)]

    # بناء الجدول K[][]
    for i in range(n + 1):
        for w in range(W + 1):
            if i == 0 or w == 0:
                K[i][w] = 0
            elif weights[i-1] <= w:
                K[i][w] = max(values[i-1] + K[i-1][w-weights[i-1]], K[i-1][w])
            else:
                K[i][w] = K[i-1][w]

    return K[n][W]

# المعطيات
values = [60, 100, 120, 240]  # قائمة بالقيم
weights = [10, 20, 30, 40]    # قائمة بالأوزان
W = 50                        # الوزن الأقصى للحقيبة
n = len(values)               # عدد العناصر

# دعوة الدالة
result = knapsack(W, weights, values, n)
print("القيمة القصوى التي يمكن الحصول عليها هي", result)

في الكود ده:

- knapsack دي الدالة اللي بتبني الجدول الديناميكي علشان نحسب القيمة القصوى.
- الجدول K عبارة عن جدول ثنائي الأبعاد بيتم إنشاؤه بمقاس (n+1) x (W+1)، وهنا n هي عدد العناصر و W هو الوزن الأقصى.
- في الحلقات، بنفحص كل وزن ممكن من 0 لغاية W لكل عنصر. إذا كان العنصر يقدر يتحمل بالوزن الحالي، هنشوف هل من المفيد إضافته ولا لأ، وده بنقرره بالمقارنة بين قيمة الخلية الحالية وقيمة الخلية اللي قبلها مضاف إليها قيمة العنصر.
- في النهاية، K[n][W] هتحتوي على القيمة القصوى اللي يمكن تحقيقها بالوزن الأقصى W.

النتيجة اللي هتطلع في الآخر هتقول لنا إيه أكبر قيمة ممكن نحققها من العناصر دي لما نملا الحقيبة بالوزن الأقصى المسموح بيه. ودي طريقة ممتازة تساعدنا نعرف نختار الأحسن ونستغل المساحة المتاحة بشكل كويس.

يمكنك القراءه اكثر عن مسألة حقيبة الظهر المجزأة من هنا و عن مسألة حقيبة الظهر ‎0-1 من هنا

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 17 دقائق مضت قال Khaled Osama3:

وعليكم السلام،

مشكلة الحقيبة (Knapsack Problem) دي واحدة من المشاكل اللي بتقابل الناس اللي بيشتغلوا في علوم الحاسب، وهي من نوع المشاكل اللي بتدور على أحسن طريقة لتحميل حاجات بأوزان وقيم مختلفة جوه حقيبة أو صندوق بسعة محدودة، علشان نحاول نزود القيمة الكلية بتاعت اللي جوا الحقيبة دي. الفكرة منها ممكن تتستخدم في حاجات كتير زي تحميل البضايع أو توزيع الموارد.

الأنواع الرئيسية لمشكلة الحقيبة:
1. 0/1 Knapsack Problem: يا تاخد الحاجة كلها يا تسيبها خالص.
2. Fractional Knapsack Problem: تقدر تاخد جزء من الحاجة في الحقيبة.
3. Bounded Knapsack Problem: كل حاجة ليها عدد محدود تقدر تاخده.

خوارزميات لحل مشكلة الحقيبة:

1. الخوارزمية الجشعة (Greedy Algorithm):
   - بتستخدم لمشكلة الحقيبة الجزئية.
   - الفكرة هي إنك تاخد الحاجات حسب نسبة القيمة للوزن، من الأعلى للأقل، وتحطها في الحقيبة لحد ما تمتلئ.
   - بتكون سريعة بس مش دايماً بتجيب الحل الأمثل للأنواع التانية من المشكلة.

2. البرمجة الديناميكية (Dynamic Programming):
   - دي الطريقة المعتادة لحل مشكلة الحقيبة 0/1.
   - بتقسم المشكلة لمشاكل أصغر وتحفظ النتايج بتاعتها علشان متتحسبش كتير.
   - بتديك حل دقيق بس ممكن تكون غالية من ناحية الذاكرة والوقت لو السعة كبيرة.

3. Branch and Bound:
   - بتستخدم لما تكون عايز حل دقيق لمشكلة الحقيبة 0/1.
   - بتستخدم تقنيات لتقليم الأشجار علشان تتجنب الحالات اللي مش هتجيب حل أحسن من الحل الأحسن المعروف.

4. Approximation Algorithms:
   - لما تكون محتاج حل سريع أكتر من إنك تحصل على الحل الأمثل.
   - بتوفر حلول قريبة من الحل الأمثل وغالبًا تكون كفاية لكتير من الاستخدامات العملية.

يلا بينا نشوف مثال عملي على مشكلة

 الحقيبة باستخدام البرمجة الديناميكية لحل 0/1 Knapsack Problem. في المشكلة دي عندنا حاجات كل واحدة ليها وزن وقيمة، وعايزين نعرف إيه الحاجات اللي لازم نشيلها في الحقيبة علشان تكون الوزن تحت الحد والقيمة أعلى ما يمكن.

المشكلة:
- عندنا حقيبة سعتها 50 وحدة وزن.
- عندنا أربع حاجات بالمواصفات دي:
  - حاجة 1: وزن = 10 وحدة، قيمة = 60 وحدة.
  - حاجة 2: وزن = 20 وحدة، قيمة = 100 وحدة.
  - حاجة 3: وزن = 30 وحدة، قيمة = 120 وحدة.
  - حاجة 4: وزن = 40 وحدة، قيمة = 240 وحدة.

الحل بالبرمجة الديناميكية:
هنستخدم جدول الصفوف بيمثل القيم والأعمدة بتمثل الأوزان من صفر لحد الحد الأقصى للحقيبة. الهدف إن كل خلية في الجدول تعكس القيمة القصوى اللي ممكن تتحقق بالوزن ده باستخدام الحاجات لحد الصف ده.

هنبدأ نملأ الجدول ونحسب القيمة القصوى خطوة بخطوة:

def knapsack(W, weights, values, n):
    # إنشاء جدول K
    K = [[0 for x in range(W + 1)] for x in range(n + 1)]

    # بناء الجدول K[][]
    for i in range(n + 1):
        for w in range(W + 1):
            if i == 0 or w == 0:
                K[i][w] = 0
            elif weights[i-1] <= w:
                K[i][w] = max(values[i-1] + K[i-1][w-weights[i-1]], K[i-1][w])
            else:
                K[i][w] = K[i-1][w]

    return K[n][W]

# المعطيات
values = [60, 100, 120, 240]  # قائمة بالقيم
weights = [10, 20, 30, 40]    # قائمة بالأوزان
W = 50                        # الوزن الأقصى للحقيبة
n = len(values)               # عدد العناصر

# دعوة الدالة
result = knapsack(W, weights, values, n)
print("القيمة القصوى التي يمكن الحصول عليها هي", result)

في الكود ده:

- knapsack دي الدالة اللي بتبني الجدول الديناميكي علشان نحسب القيمة القصوى.
- الجدول K عبارة عن جدول ثنائي الأبعاد بيتم إنشاؤه بمقاس (n+1) x (W+1)، وهنا n هي عدد العناصر و W هو الوزن الأقصى.
- في الحلقات، بنفحص كل وزن ممكن من 0 لغاية W لكل عنصر. إذا كان العنصر يقدر يتحمل بالوزن الحالي، هنشوف هل من المفيد إضافته ولا لأ، وده بنقرره بالمقارنة بين قيمة الخلية الحالية وقيمة الخلية اللي قبلها مضاف إليها قيمة العنصر.
- في النهاية، K[n][W] هتحتوي على القيمة القصوى اللي يمكن تحقيقها بالوزن الأقصى W.

النتيجة اللي هتطلع في الآخر هتقول لنا إيه أكبر قيمة ممكن نحققها من العناصر دي لما نملا الحقيبة بالوزن الأقصى المسموح بيه. ودي طريقة ممتازة تساعدنا نعرف نختار الأحسن ونستغل المساحة المتاحة بشكل كويس.

يمكنك القراءه اكثر عن مسألة حقيبة الظهر المجزأة من هنا و عن مسألة حقيبة الظهر ‎0-1 من هنا

شكراا لحضرتك جدا 

بس سوال هل الخورزميات ده مهم في مجال الذكاء الاصطناعي بشكل عام

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

عفوًا، سعيد بمساعدتك!

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

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

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

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

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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 ساعة قال Khaled Osama3:

عفوًا، سعيد بمساعدتك!

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

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

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

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

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

تمام شكرااا لحضرتك

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ On 27‏/4‏/2024 at 15:44 قال Khaled Osama3:

2. البرمجة الديناميكية (Dynamic Programming):

بشمهندس خالد سوال لو سمحت

هي مش البرمجه الديناميكيه ده ممكن نستخدمها في خورزميات تاني اوحل حل مشاكل تاني

بتاريخ On 27‏/4‏/2024 at 16:39 قال Khaled Osama3:

زي البرمجة الديناميكية ممكن يساعد في تطوير حلول أكثر فعالية لمشكلات أصعب.

ايو صح

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ On 2‏/5‏/2024 at 18:32 قال Ail Ahmed:

بشمهندس خالد سوال لو سمحت

هي مش البرمجه الديناميكيه ده ممكن نستخدمها في خورزميات تاني اوحل حل مشاكل تاني

ايو صح

الفكرة هي أن البرمجة الديناميكية تعتمد على مبدأ تكسير المشكلة إلى مشكلات فرعية أصغر، وحلّ تلك المشكلات بشكل متكرر، وتخزين الحلول للاستفادة منها في حلّ المشكلة الأصلية.

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

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

بجانب أنها غير مناسبة في حال كانت الموارد (مثل الذاكرة أو وقت المعالجة) محدودة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 19 ساعة قال Mustafa Suleiman:

الفكرة هي أن البرمجة الديناميكية تعتمد على مبدأ تكسير المشكلة إلى مشكلات فرعية أصغر، وحلّ تلك المشكلات بشكل متكرر، وتخزين الحلول للاستفادة منها في حلّ المشكلة الأصلية.

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

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

بجانب أنها غير مناسبة في حال كانت الموارد (مثل الذاكرة أو وقت المعالجة) محدودة.

شكراا جدا لتوضيح حضرتك

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...