AlgoVerse

مجموع زیرمجموعه (طرح تقریب کاملاً چندجمله‌ای)

بزرگ‌ترین جمع زیرمجموعه‌ای را که از t بیشتر نشود تقریب می‌زند؛ با هرس جمع‌های نزدیک به هم، فهرست کوتاه می‌ماند و جواب حداکثر (1 + ε) برابر کمتر از بهینه است.

مجموع زیرمجموعه: از مجموعه‌ی S، زیرمجموعه‌ای با بزرگ‌ترین جمعی که از t بیشتر نشود. حل دقیق NP-سخت است: فهرست همه‌ی جمع‌های ممکن می‌تواند 2ⁿ عضو داشته باشد.

ادامه‌ی توضیح ↓
ورودی:
n=4 · target=308خروجی PDF

S = {104, 102, 201, 101}، t = 308 و ε = 0.4؛ جواب تقریبی ۳۰۲ و جواب بهینه ۳۰۷ (= ۱۰۴ + ۱۰۲ + ۱۰۱)، در محدوده‌ی ۴۰٪.

  1. def approx_subset_sum(items, target):
  2. eps = 0.4
  3. delta = eps / (2 * len(items))
  4. sums = [0]
  5. rows = []
  6. for x in items:
  7. merged = sorted(set(sums + [s + x for s in sums]))
  8. # Trim: drop a sum that is within a factor (1 + delta) of the last one kept.
  9. kept = [merged[0]]
  10. for s in merged[1:]:
  11. if s > kept[-1] * (1 + delta):
  12. kept.append(s)
  13. sums = [s for s in kept if s <= target]
  14. rows.append([x] + sums)
  15. return max(sums)

ناوردا: برای هر جمعِ ممکن y ≤ t از عضوهای دیده‌شده، عضوی z در فهرست هست که y / (1 + δ)ⁱ ≤ z ≤ y؛ پس خطا در پایان حداکثر 1 + ε است.

شروع اجرا

x—
sums—

جدول هنوز خالی است.

متغیرهای محلی

target308

نارنجی = در همین گام عوض شد

items list

104102201101

Call stack

  1. approx_subset_sum()خط 1
گام ۱ از ۷۴
خط سیاه = trim · خط نارنجی = گام کلیدیmerge: 0/4 · trim: 0/4 · best: 0/1
    توضیح

    ایده

    مجموع زیرمجموعه: از مجموعه‌ی S، زیرمجموعه‌ای با بزرگ‌ترین جمعی که از t بیشتر نشود. حل دقیق NP-سخت است: فهرست همه‌ی جمع‌های ممکن می‌تواند 2ⁿ عضو داشته باشد.

    هرس کردن

    اگر دو جمع خیلی نزدیک‌اند (یکی حداکثر (1 + δ) برابر دیگری)، نگه داشتن یکی کافی است؛ خطای هر هرس کوچک است و روی هم حداکثر (1 + ε) می‌شود. با δ = ε / 2n فهرست همیشه کوتاه می‌ماند.

    نتیجه یک طرح تقریب کاملاً چندجمله‌ای (FPTAS) است: زمان بر حسب n و 1/ε چندجمله‌ای است و با ε کوچک‌تر، جواب دقیق‌تر ولی کندتر.

    در trace به چه چیزی نگاه کنی

    • هر سطر جدول عضو تازه و فهرست جمع‌های نگه‌داشته بعد از هرس است. در ورودی «مثال به سبک کتاب» ببین چرا ۳۰۷ از دست می‌رود.