Toplu olarak fatura problemini ödeyin


23

Masada insanlar var . İ inci kişi ödeme zorundadır p i dolar.nipi

Bazı insanlar tam olarak ödeme hakkı faturaları yok aşağıdaki algoritma ile gelip bu nedenle,.pi

İlk olarak, herkes parasının bir kısmını masaya yatırıyor. Sonra her birey ödediği parayı geri alır.

Faturalar sabit bir dizi isme sahiptir (girişin bir parçası değil).

Örnek: Diyelim ki iki kişi var, Alice ve Bob. Alice borçludur $ 5 ve beş sahiptir $ 1 faturaları. Bob'un 2 dolar borcu var ve 5 dolarlık bir borcu var . Alice ve Bob tüm paralarını masaya yatırdıktan sonra, Bob 3 doları geri alır ve herkes mutlu olur.

Elbette, bütün parasını masaya yatırmak zorunda kalmayan zamanlar vardır . Örneğin, Alice'in bin dolarlık faturası varsa, hepsini masaya koyması ve çoğunu geri alması gerekli değildir.

Aşağıdaki özelliklere sahip bir algoritma bulmak istiyorum:

  1. Girdi, kişi sayısını, her bir kişinin ne kadar borcu olduğunu ve her bir bireyin ne kadarının faturalarını belirtir.

  2. Algoritma, her bir kişiye ilk turda masaya hangi faturayı koyacağını söyler.

  3. Algoritma, her bir kişiye ikinci turdaki tablodan çıkarmaları gereken faturaları söyler.

  4. Masaya konan faturaların sayısı + masadan kaldırılan faturaların sayısı en aza indirilir.

Uygulanabilir bir çözüm yoksa, algoritma sadece bir hata döndürür.


9
Önceden sabit faturaları mezhepleri Are (Amerikan mezhepler söylemek $ 1, $ 2, $ 5, $ 10, $, 20 $, 50 $ ve 100 ) veya girdinin bir parçası mı? Başka bir deyişle, algoritma Mephistopheles sahip olma olasılığını işlemek zorunda mı üç $ 7 faturaları, bir $ 13 bill ve onbeş $ 4 faturaları ?
JeffE

1
Faturalar sabittir. Sanırım bu durumda alt küme toplamını azaltamıyorum ve NP-Hard olduğunu kanıtlayamıyorum. Düzenleyeceğim.
Chao Xu,

1
4/5'i tek bir optimizasyon olarak ifade etmenin bir yoluna ihtiyacınız var. Bu iki bağımsız koşul için optimizasyon yapmak mümkün değildir. Neyi düşündüğünüzü biliyorum, daha önce de benzer bir sorun yaşadım, ancak her iki koşul için de optimize etmenin ne demek olduğunu tam olarak ölçmeniz gerekiyor.
edA-qa mort-ora-y

3
Bence, başlangıç ​​noktası olarak, herkesin faturayı tam olarak ödediğini veya algoritmanın sadece başarısızlığı rapor ettiğini varsaymanın daha iyi olacağını düşünüyorum .
JeffE

2
Burada tam olarak soru nedir, karmaşıklık gereksinimleri var mı? Saf bir algoritma yazmak önemsiz görünüyor, yoksa bir şey mi eksik?
Stéphane Gimenez

Yanıtlar:


6

Sorunu biraz farklı (ancak eşdeğeri) bir şekilde yeniden ifade ederseniz, bir algoritma daha belirgin hale gelir:

Dahil olan parti var : n - 1 kişi ve bir restauarant. Let s ı para partinin miktarı i olmalıdır sonra yemek bitmiş ve ödenir. Örneğin, eğer Alice 36 dolar ve 25 dolar borçluysa , Bob 12 dolar ve borçludur.nn1pii 11 dolar ise , Carl 30 dolar ve 25 dolar borçluysa , 'nın restoran olduğunu ve şunu söylediğini söyleriz :p0

p=(61,11,1,5)

Yani, yemek bittiğinde restoran 61 dolara , Alice 11 dolara , Bob 1 dolara ve Carl 5 dolara sahip olmalıydı .

bm

b=(1,5,10,20,1,1,5,5,10,20)

Faturaların mezhepleri önemli değil, ama tanıdık oldukları için bu örnek ABD kağıt para cinsinden banknotlarını seçtim.

ij{0,1}CC0,j=0j

Örneğimize devam:

C=[0000000000000011111111110000111111111100]

Alice ile başladı gösterir $ 1, $ 5, $ 10, $ 20, Bob ile başlayan $ 1, $ 1, $ 5, $ 5, Carl ile başladı $ 10 ve $ 20.

Yine amaç, el değiştiren faturaların sayısını en aza indirmektir. Diğer bir deyişle:

Minimize:i=0n1j=0m1Ci,jxi,jsubject to:i=0n1xi,j=1 for 0j<m,j=0m1xi,jbj=pi for 0i<n,andxi,j0

İlk kısıtlama, çözümün yalnızca bir tarafa belirli bir faturayı atayabileceğini ve ikincisi de herkesin uygun miktarda ödeme yapmasını sağladığını söylüyor.

Bu 0,1 INTEGER PROGRAMLAMA problemi ve NP tamamlandı (bkz. [ Karp 1972 ]). Doğrusal programlama hakkındaki Wikipedia sayfası , bu tür problemlerde kullanılabilecek farklı algoritmalar hakkında bilgi içerir.

Potansiyel olarak çoklu optimal çözümler vardır; elde ettiğim örneğin ilk çözümü elimden aldı:

x=[0101100111101000000000001000000000001000]

hangi Alice tam olarak öder demektir $ 5 ve $ 20, Bob tam öder $ 1, $ 5 ve $ 5, Carl fazla ödeme $ 10 ve $ 20 ve daha sonra bir kaldırır $ tablo 5.

Ayrıca, farklı çözücü arka uçlarını ( GLPK , COIN , CPLEX veya Gurobi'yi kullanma yeteneğine sahip olan Sage Math sisteminin Karışık Tamsayılı Doğrusal Program modülünü kullandım. ) . Verdiği ilk çözüm

x=[0101010111101000000000001000000000000100]

bu da Carl’ın Bob’un masaya koyduğu “öteki” 5 doları alması dışında neredeyse aynı.

Cx

Azalan toplamı ödeyebilecek bir grup insanı tanımlayın? Ya da belki hala tüm faturayı ödeyebilecek bir grup insan, yani arkadaşlarının parasını öderler.

Nihai ifadeniz, faturaların isimlerinin sabit olması durumunda ilgilendiğiniz görülmesine neden oluyor, ancak bu sorunu değiştirmiyor.

O(1)


Bu sorunun IP'nin (neredeyse?) Açık olduğu şeklinde ifade edilebilir; ama bu çözüm ne kadar iyi? Oluşturulan formun IP'leri verimli bir şekilde çözülebilir mi? Eğer değilse, daha hızlı bir algoritma var mı?
Raphael

Bu IP'nin daha yoğun bir formu vardır, bir 0,1 değişkeni yerine, belirli bir cinsinden faturaların sayısı için bir değişkene sahiptir. Sabit mezhepler karmaşıklığı az da olsa değiştirir, eğer kişi sayısı da sabitse Lenstra'nın algoritması polinom sürede çözebilir.
Chao Xu,

-2

Elbette bazı temel başlangıçlar, toplam faturanın toplam tutarına ulaşmak için mevcut en küçük faturaları dahil etmek olabilir. 2 $ 'lık faturalara izin vermek istemiyorsanız , her kişi havuzdan alabilecekleri en yüksek faturayı kaldırabilir ve oraya nispeten hızlı bir şekilde ulaşabilir. $ 2 fatura atar o Diğer mezheplere değil alt bölme güzel yapar ve problemi büyük ölçüde zorlaştırmaktadır olarak kapatır. Ayrıca, 1. tur boyunca ilave fonların eklenmesi gerekliliği hakkında gözlemler yapmak için yapılabilecek bir takım başka optimizasyonlar da vardır (örneğin, toplam 1 dolarlık faturaların toplamı faturayı karşılamak için yeterliyse, o zaman herkes Faturaları için henüz yeterince ödeme yapmadılarsa takmayı bırakabilirler).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.