O'zgarishlar bilan bog'liq muammo - Change-making problem

The o'zgarishlarni amalga oshirish muammosi ma'lum miqdordagi pulni qo'shadigan minimal miqdordagi tangalarni (ma'lum qiymatdagi) topish masalasini hal qiladi. Bu maxsus ish butun son xalta muammosi va faqat valyutadan kengroq dasturlarga ega.

Bundan tashqari, ning eng keng tarqalgan o'zgarishi tanga almashtirish muammosi, ning umumiy holati bo'lim unda cheksiz tangalar to'plamining mavjud nominallarini hisobga olgan holda, tanga tartibini hisobga olmagan holda, ma'lum miqdordagi pul uchun o'zgarishlarni amalga oshirishning sonini aniqlashdan maqsad.

Bu kuchsiz NP-qattiq, lekin optimal tarzda hal qilinishi mumkin psevdo-polinom vaqt tomonidan dinamik dasturlash.[1][2]

Matematik ta'rif

Tangalar qiymatlari to'plami bilan modellashtirilishi mumkin n aniq ijobiy tamsayı ortib boruvchi tartibda joylashtirilgan qiymatlar (butun sonlar) w1 orqali wn. Muammo shundaki: miqdori berilgan V, shuningdek, musbat butun son, manfiy bo'lmagan (musbat yoki nol) sonlar to'plamini topish uchun {x1, x2, ..., xn}, har biri bilan xj tanga qiymati qanchalik tez-tez aks ettirilgan wj tangalarning umumiy sonini minimallashtiradigan ishlatiladi f(V)

uchun mavzu

Valyutadan tashqari misollar

O'zgarishlarni amalga oshirish muammosini qo'llash usullarini hisoblashda topish mumkin to'qqiz marotaba tugatish dart o'yinida.

Boshqa dastur massa spektrometriyasida ma'lum massa / zaryad pikining mumkin bo'lgan atomik (yoki izotopik) tarkibini hisoblashdir.

Yechish usullari

Oddiy dinamik dasturlash

Klassik dinamik dasturlash strategiya joriy chegaraga yig'iladigan barcha kichik qiymatlarning kombinatsiyalarini topish orqali yuqoriga qarab ishlaydi.[3] Shunday qilib, har bir ostonada, avvalgi barcha chegara maqsadga qadar yuqoriga qarab ishlaydi V. Shu sababli, ushbu dinamik dasturlash yondashuvi O (nW), qayerda n tangalar turlarining soni.

Amalga oshirish

Quyida quyi muammolarni eng maqbul echimlarini kuzatib borish uchun matritsadan foydalanadigan va minimal miqdordagi tanga sonini qaytaradigan yoki "Infinity" dasturini o'zgartiradigan (Python 3 bilan) dinamik dasturlash amalga oshiriladi. berilgan tangalar. Optimal echim uchun tangalar to'plamini olish uchun ikkinchi matritsadan foydalanish mumkin.

def _get_change_making_matrix(set_of_coins, r: int):    m = [[0 uchun _ yilda oralig'i(r + 1)] uchun _ yilda oralig'i(len(set_of_coins) + 1)]    uchun men yilda oralig'i(1, r + 1):        m[0][men] = suzmoq("inf")  # Odatiy bo'lib, o'zgarishlarni amalga oshirishning iloji yo'q    qaytish mdef o'zgarishlarni amalga oshirish(tangalar, n: int):    "" "Ushbu funktsiya barcha tangalar cheksiz mavjudligini nazarda tutadi.    n - eng kam tanga bilan olinadigan raqam.    tangalar - bu mavjud nominallarga ega bo'lgan ro'yxat yoki kassa.    """    m = _get_change_making_matrix(tangalar, n)    uchun v yilda oralig'i(1, len(tangalar) + 1):        uchun r yilda oralig'i(1, n + 1):            # Faqat tanga tangalaridan foydalaning [c - 1].            agar tangalar[v - 1] == r:                m[v][r] = 1            # tangalarni [c - 1] qo'shib bo'lmaydi.            # Qilish uchun avvalgi echimdan foydalaning,            # tangalarni hisobga olmaganda [c - 1].            elif tangalar[v - 1] > r:                m[v][r] = m[v - 1][r]            # tangadan [c - 1] foydalanish mumkin.            # Quyidagi echimlardan qaysi biri eng yaxshi ekanligiga qaror qiling:            # 1. R hosil qilish uchun oldingi echimdan foydalanish (tangalarni ishlatmasdan [c - 1]).            # 2. r - tangalarni tayyorlash uchun oldingi echimdan foydalanish [c - 1] (holda            # tangalar yordamida [c - 1]) plyus va ushbu 1 qo'shimcha tanga.            boshqa:                m[v][r] = min(m[v - 1][r], 1 + m[v][r - tangalar[v - 1]])    qaytish m[-1][-1]

Ehtimoliy konvolutsiya daraxti bilan dinamik dasturlash

Ehtimoliy konvolyatsiya daraxti[4] yanada samarali dinamik dasturlash usuli sifatida ham foydalanish mumkin. Ehtimoliy konvolutsiya daraxti juft tangalarni birlashtirib, ushbu tangalar juftligi tomonidan yaratilishi mumkin bo'lgan barcha miqdorlarni ishlab chiqaradi (ikkala tanga ham mavjud emas, faqat birinchi tanga mavjud, faqat ikkinchi tanga mavjud va ikkala tanga ham mavjud), so'ngra keyinchalik birlashuvchi juftliklar xuddi shu tarzda birlashtirilgan natijalardan. Ushbu jarayon natijalarning so'nggi ikkita to'plami birlashtirilgunga qadar takrorlanadi va bu muvozanatli binar daraxtga olib keladi. W log (W) bunday birlashtirish operatsiyalari. Bundan tashqari, tanga qiymatlarini diskretizatsiya qilish orqali ushbu birlashtirish operatsiyalarining har biri konvolyutsiya yordamida amalga oshirilishi mumkin, bu ko'pincha tez Fourier konvertatsiyasi (FFT). Shu tarzda, ehtimollik konvolyutsiyasi daraxti subkvadratik qadamlar sonida echimga erishish uchun ishlatilishi mumkin: har bir konvolyutsiya quyidagicha bajarilishi mumkin: n log (n)va boshlang'ich (ko'proq) birlashma operatsiyalari kichikroqdan foydalanadi n, keyinchalik (kamroq sonli) operatsiyalar talab etiladi n tartibida V.

Ehtimollik konvolyutsiyasi daraxtga asoslangan dinamik dasturlash usuli, shuningdek maqsadni belgilashda noaniqlik yoki noaniqlik bo'lgan o'zgarishlarni amalga oshirish muammosini ehtimollik bilan umumlashtirishni samarali hal qiladi. V har bir tanga qiymatining loyqa bo'lishiga yo'l qo'yiladigan (masalan, valyuta kursi hisobga olingan holda) va turli xil tangalar ma'lum chastotalarda ishlatilishi mumkin bo'lgan joyda, belgilangan miqdor emas, balki alohida taqsimotga aylantiradi.

Ochko'zlik usuli

AQSh va boshqa ko'plab mamlakatlarda ishlatilgan singari kanonik tanga tizimlari uchun a ochko'zlik algoritmi Tanganing qolgan miqdoridan katta bo'lmagan eng katta tanga nominatsiyasini tanlash eng yaxshi natijani beradi.[5] Biroq, bu o'zboshimchalik bilan tanga tizimlari uchun emas. Masalan, agar tanga qiymatlari 1, 3 va 4 bo'lsa, unda oltitani ochish uchun ochko'z algoritm uchta tanga (4,1,1) tanlaydi, eng maqbul echim esa ikkita tanga (3,3).

Bilan bog'liq muammolar

"Maqbul nominal muammo "[6] butunlay yangi valyutalarni ishlab chiqaradigan odamlar uchun muammo. O'zgarishlar kiritish uchun o'rtacha xarajatlarni minimallashtirish uchun tangalar uchun qanday nominallarni tanlash kerakligi, ya'ni o'zgarishlarni amalga oshirish uchun zarur bo'lgan o'rtacha tangalar sonini so'raydi. Ushbu muammoning versiyasi, o'zgarishlarni amalga oshiradigan odamlar minimal miqdordagi tangalarni ishlatishini taxmin qildilar (mavjud bo'lgan nominallardan). Ushbu muammoning bir xil o'zgarishi, o'zgarishlarni amalga oshiradigan odamlar "ochko'zlik algoritmidan", hatto minimal miqdordagi tanga miqdoridan ko'proq narsani talab qilganda ham, o'zgartirish uchun foydalanadilar. Amaldagi valyutalarning aksariyati a dan foydalanadi 1-2-5 seriyalar, ammo boshqa bir qator nominallar o'zgarishni yoki ikkalasini ham amalga oshirish uchun kamroq tanga qiymatini yoki tangalarning o'rtacha sonini talab qiladi.

Shuningdek qarang

Adabiyotlar

  1. ^ Kormen, Tomas H.; Leyzerson, Charlz E.; Rivest, Ronald L.; Stein, Clifford (2009). Algoritmlarga kirish. MIT Press. Muammo 16-1, p. 446.
  2. ^ Gudrix, Maykl T.; Tamassiya, Roberto (2015). Algoritm dizayni va qo'llanilishi. Vili. A-12.1-mashq, b. 349.
  3. ^ Rayt, J. V. (1975). "O'zgarishlar bilan bog'liq muammo". Hisoblash texnikasi assotsiatsiyasi jurnali. 22 (1): 125–128. doi:10.1145/321864.321874.
  4. ^ Serang, O. (2012). "Ehtimolning konvolyutsiyasi daraxti: LC-MS / MS oqsillarini tezroq chiqarish uchun Bayesning aniq xulosasi". PLOS ONE. 9 (3): e91507. Bibcode:2014PLoSO ... 991507S. doi:10.1371 / journal.pone.0091507. PMC  3953406. PMID  24626234.CS1 maint: ref = harv (havola)
  5. ^ Xuan Cai (2009). "O'zgarishlarni amalga oshirish muammolari uchun kanonik tanga tizimlari". Gibrid aqlli tizimlar bo'yicha to'qqizinchi xalqaro konferentsiya materiallari. 1: 499–504. arXiv:0809.0400. doi:10.1109 / HIS.2009.103.
  6. ^ J. Shallit (2003). "Bu mamlakatga 18-qism kerak" (PDF). Matematik razvedka. 25 (2): 20–23. doi:10.1007 / BF02984830.

Qo'shimcha o'qish