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

cs.stackexchange https://cs.stackexchange.com/questions/127658

سؤال

مشكلتي هي:

دعنا نقول أن لدي قائمة تعسفية أعداد صحيحة A [2013، 54، 3، 32 1، 23 ...]

ما هي أفضل استراتيجية للعثور على أي من تلك الأرقام التي يجب أن أضيفها معا للحصول على مبلغ متساو أو الأقرب إلى رقم معين؟

من الواضح أن هناك طريقة القوة الغاشمة دائما، لكنني مهتم بمعرفة ما إذا كان هناك واحد أكثر حسما.

هل كانت مفيدة؟

المحلول

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

على سبيل المثال، إذا كانت المجموعة الخاصة بك هي $ \ {2،3،5،5،8،13،21، 34 \} $ وأنت هدف $ 32 $ ، ابدأ ب 21 دولارا $ (أكبر قيمة أقل من $ 32 $ )، ثم إضافة 8 دولارات $ (لأن هذه هي القيمة الكبيرة أقل من 32-21 دولار= 11 $ < / span>)، ثم أضف 3 دولارات $ .

خوارزمية جشعة سريعة وبسيطة، ولكن لن تعطيك دائما الحل الأفضل. على سبيل المثال، إذا كانت المجموعة الخاصة بك هي $ \ {1 و 5 و 23 و 26 $ وأنت هدف هو $ 30 $ ثم تعطي الخوارزمية الجشع 26 دولارا + 1= 27 دولارا ، في حين أن أفضل الحلول هو 23 دولارا + 5 + 1= 29 $ .

نصائح أخرى

المشكلة هي NP-Complete، ولكن كثير الحدود في قيمة الرقم المحدد، مع درجة متعددة الحدود منخفضة للغاية. من الصعب فقط إذا كانت الأرقام المعنية كبيرة.

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

الآن إذا كان لديك عناصر مع مجموع إغلاق إلى S، يمكنك محاولة تحسين هذا. على سبيل المثال، إذا كان مجموعك صغيرا جدا بنسبة 117، لكن أصغر عنصر غير مستخدم هو 317، فستحاول إذا كان لديك عنصر س في قائمتك، وعنصر Y ليس في القائمة، حيث Y حوالي 200 أصغر من x - مبادلة X ضد y، إضافة عنصر الحجم 317. حتى الخوارزمية البسيطة من المرجح أن تجد لك تحسينات جيدة.

طريقة مختلفة تماما: السماح للمجموع المرغوب فيه، مع حجم كبير جدا (مثل العديد من تريليونات). ثم يمكنك اختيار S 'يقول حوالي 1،000،000، اضرب جميع الأرقام المشتركة بين (S'S)، ابحث عن عناصر بمجموع مقرب من 1،000،000، ثم اختر العناصر الأصلية. محاولة لبضع مبالغ قريبة من 1،000،000.

بفضل تعليق Luval، كنت أدى إلى مشكلة الرنان التي هي بالضبط ما كنت أبحث عنه.

على الرغم من أنني لم أفهم الكثير من الحلول المقترحة لمشكلة NP كاملة في ويكيبيديا، فكرت في نهج سريع ولكنه غير موثوق به:

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

أعتقد أنه إذا لم تختلف جميع الاختلافات بين عضوين من مجموعة عدد صحيح، فمن المحتمل أن يعطي هذا النهج أفضل وحدولا فقط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى cs.stackexchange
scroll top