請求書の問題を一括して支払う


23

ありテーブルの人々が。番目の人が支払わなければならないドルを。nipi

一部の人々は正確にを支払うための適切な請求書を持っていないため、次のアルゴリズムを考え出します。pi

まず、誰もが自分のお金の一部をテーブルに置きます。その後、各個人は彼らが過払いしたお金を取り戻します。

法案には、金種の固定セットがあります(入力の一部ではありません)。

例:アリスとボブの2人がいるとします。アリスは負っている$ 5と5枚の持っている$ 1札を。ボブは負って$ 2と1つの持っている$ 5法案を。アリスとボブがすべてのお金をテーブルに置いた後、ボブは3 ドルを取り戻し、誰もが幸せです。

もちろん、お金をすべてテーブルに置く必要がない場合もあります。たとえば、アリスが1,000 ドルの請求書を持っている場合、彼女はそれらをすべてテーブルに置いてから、ほとんどを取り戻す必要はありません。

次のプロパティを持つアルゴリズムを見つけたい:

  1. 入力は、人数、各人が支払うべき金額、各人の各宗派の請求書を指定します。

  2. このアルゴリズムは、最初のラウンドでテーブルに置く請求書を各個人に伝えます。

  3. このアルゴリズムは、2回目のラウンドでテーブルから削除する請求書を各個人に伝えます。

  4. テーブルに置かれた請求書の数+テーブルから削除された請求書の数は最小化されます。

実行可能な解決策がない場合、アルゴリズムはエラーを返します。


9
予め固定法案の宗派(アメリカの宗派に言っている$、1 $、2 $、5 $、10 $、20 $ 50と$ 100)、または入力の一部は?言い換えれば、アルゴリズムは、メフィストフェレスが3 ドルの請求書、13 ドルの請求書、および15 ドルの 4件の請求書を持っている可能性を処理する必要がありますか?
-JeffE

1
請求書は修正されました。その場合、サブセットの合計を削減できず、NPハードであることを証明することはできません。編集します。
チャオシュウ

1
4/5を単一の最適化として表現する方法が必要です。これら2つの独立した条件に対して最適化することはできません。私はあなたが何を意図しているか知っています、私は以前に同様の問題を抱えていましたが、両方の条件に対して最適化することの意味を正確に定量化する必要があります。
edA-qa mort-ora-y

3
出発点として、誰もが正確に請求書を支払うか、アルゴリズムが単に失敗を報告することを前提とする方が良いと思います。
-JeffE

2
ここでの質問は正確には何ですか、複雑さの要件はありますか?素朴なアルゴリズムを書くのは簡単なように思えますか、それとも何かが足りませんか?
ステファンギメネス

回答:


6

わずかに異なる(ただし同等の)方法で問題を再度説明すると、アルゴリズムがより明確になります。

関係するパーティーがあります:n 1人、および1つのレストラン。してみましょうpが、私はお金のパーティーの量であれば、私が持っている必要があります、食事が終わると、ために支払われます。アリスが持っている場合たとえば、$ 36と負って$ 25、ボブはあり$ 12と負って$ 11、そしてカールが持つ$ 30と負って$ 25、我々はと言うのp 0はレストランで、持っています:nn1piip0

p=(61,11,1,5

つまり、食事が終わると、レストランは61 ドル、アリスは11 ドル、ボブは1 ドル、カールは5 ドルになるはずです。

次に、関連するm個の請求書すべてを列挙させます。例えば:bm

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

法案の額面は重要ではありませんが、この例ではおなじみなので、米国の紙幣の額面を選択しました。

私たちは、人との「コスト」を関連付けるので、法案その変更の手の数を最小限にしようとしている請求書を残しjを使用することにより、{ 0 1 }行列Cを。このマトリックスの0のエントリは、各パーティーがどの請求書で始まるかを示します(レストランは請求書なしで始まるため、すべてのjについてC 0 j = 0)。ij{0,1}CC0,j=0j

例の続き:

C=[0000000000000011111111110000111111111100]

Aliceは$ 1、$ 5、$ 10、$ 20で始まり、Bobは$ 1、$ 1、$ 5、$ 5で始まり、Carlは$ 10と$ 20で始まったことを示します。

繰り返しますが、目標は、手を変える請求書の数を最小限にすることです。言い換えると:

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

最初の制約では、ソリューションでは特定の請求書を1つの関係者にしか割り当てることができず、2番目の制約では、全員が適切な金額を支払うことが保証されます。

これは0,1 INTEGER PROGRAMMING問題であり、NP完全です([ Karp 1972 ]を参照)。線形計画法に関するウィキペディアのページには、これらのタイプの問題に使用できるさまざまなアルゴリズムに関する情報があります。

潜在的に複数の最適なソリューションがあります。手で私が思いついた例の最初の解決策は次のとおりでした:

x=[0101100111101000000000001000000000001000]

これは、アリスが正確支払い手段$ 5と$ 20は、ボブが正確に支払う$ 1 $ 5と$ 5、及びカールoverpays $ 10および$ 20、その後除去$テーブルから5。

また、さまざまなソルバーバックエンド(GLPKCOINCPLEX、またはGurobi)を使用できるSage MathシステムのMixed Integer Linear Programモジュールも使用しました。最初の解決策は

x=[0101010111101000000000001000000000000100]

これは、CarlがBobがテーブルに置いた「その他」の5ドルを受け取ったことを除いて、ほぼ同じです。

この方法で問題を定式化すると、リストしたすべてのプロパティが満たされます(どの請求書がどこから来るかを推定できます) C およびソリューションマトリックス バツ)。例外はおそらく質問のコメントで議論された#4です。線形方程式のセットに実行可能な解決策がないという状況で、あなたが何をしたいのかは明確ではありません:

削減された合計を支払うことができる人々のサブセットを特定しますか?またはおそらく、請求書全体を支払うことができる人々のサブセット、つまり、彼らは彼らの友人のために支払う。

あなたの最終的な声明は、あなたが法案の額面が固定されている場合に興味を持っているように見えますが、これは問題を変えません。

いずれにせよ、もあります O1 すべての人がクレジットカードで支払うソリューション。


この問題がIPとして表現できることは(ほぼ?)明らかでした。しかし、このソリューションはどれほど良いですか?作成されたフォームのIPは効率的に解決できますか?そうでない場合、より高速なアルゴリズムはありますか?
ラファエル

このIPには、0,1変数よりも特定の金種の請求書の数に変数があるため、より凝縮された形式が存在します。固定額面は複雑さを少し変更しますが、人数も固定されていれば、Lenstraのアルゴリズムは多項式時間でそれを解決できます。
チャオシュー

-2

確かに、いくつかの基本的な開始は、請求書全体の合計額に達するために利用可能な最小の請求書を含めることです。2 ドルの請求書を許可しない場合は、各人がプールから取ることができる最大の請求書を削除するだけで、比較的迅速に届きます。$それは、他の宗派の中でうまく細分せず、大幅に問題を複雑にして2法案はそのオフをスローします。ラウンド1で追加の資金を追加する必要性について観察するために実行できる他の最適化も確かにいくつかあります(たとえば、1 ドルの請求書の合計数が請求書をカバーするのに十分な場合、彼らはまだ彼らの請求書に十分に入れていない限り、入れを停止することができます)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.