Pagar coletivamente o problema da fatura

23

n pessoas em uma mesa. O ª pessoa tem que pagar dólares.EupEu

Algumas pessoas não têm as contas certas para pagar exatamente , portanto, apresentam o seguinte algoritmo.pEu

Primeiro, todo mundo coloca um pouco de seu dinheiro na mesa. Então, cada indivíduo recebe de volta o dinheiro pago em excesso.

As notas têm um conjunto fixo de denominações (não faz parte da entrada).

Um exemplo: suponha que haja duas pessoas, Alice e Bob. Alice deve US $ 5 e tem cinco notas de US $ 1. Bob deve US $ 2 e tem uma nota de US $ 5. Depois que Alice e Bob colocam todo o seu dinheiro na mesa, Bob recebe US $ 3 e todo mundo fica feliz.

Claro, há momentos em que não é preciso colocar todo o dinheiro na mesa. Por exemplo, se Alice tinha mil notas de US $ 1, não é necessário que ela as coloque sobre a mesa e depois retire a maioria delas.

Quero encontrar um algoritmo com as seguintes propriedades:

  1. A entrada especifica o número de pessoas, quanto cada pessoa deve e quantas notas de cada denominação cada pessoa possui.

  2. O algoritmo diz a cada pessoa quais contas colocar na mesa na primeira rodada.

  3. O algoritmo informa a cada pessoa quais contas remover da tabela na segunda rodada.

  4. O número de notas colocadas na mesa + o número de notas removidas da mesa é minimizado.

Se não houver solução viável, o algoritmo retornará um erro.

Chao Xu
fonte
9
As denominações das notas são fixadas antecipadamente (digamos, nas denominações americanas $ 1, $ 2, $ 5, $ 10, $ 20, $ 50 e $ 100) ou parte da entrada? Em outras palavras, o algoritmo precisa lidar com a possibilidade de Mefistófeles ter três notas de US $ 7, uma nota de US $ 13 e quinze de US $ 4 ?
Jeffe
1
As contas são fixas. Acho que nesse caso não posso reduzir a soma de subconjuntos e provar que é NP-Hard. Eu devo editá-lo.
Chao Xu
1
Você precisa de uma maneira de expressar 4/5 como uma única otimização. Não é possível otimizar para essas duas condições independentes. Sei o que você pretende, tive um problema semelhante antes, mas você precisa quantificar exatamente o que significa otimizar para ambas as condições.
edA-qa mort-ora-y
3
Eu acho que seria melhor, como ponto de partida, assumir que todos pagam a conta exatamente ou o algoritmo simplesmente relata falha.
9118 JeffE
2
Qual é exatamente a questão aqui, existem requisitos de complexidade? Escrever um algoritmo ingênuo parece trivial, ou estou faltando alguma coisa?
Stéphane Gimenez

Respostas:

6

Se você reafirmar o problema de uma maneira um pouco diferente (mas equivalente), um algoritmo se tornará mais óbvio:

Não há partes envolvidas: n - 1 pessoas e um restaurante. Deixe p i ser a quantidade de partido dinheiro i deve ter após a refeição é concluído e pago. Por exemplo, se Alice tem $ 36 e deve $ 25, Bob tem $ 12 e deve $ 11, e Carl tem $ 30 e deve $ 25, dizemos que p 0 é o restaurante e temos:nn1piEup0

p=(61,11,1,5)

Ou seja, quando a refeição termina, o restaurante deve ter US $ 61, Alice, US $ 11, Bob, US $ 1 e Carl, US $ 5.

bm

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

As denominações das notas não importam, mas eu escolhi denominações da moeda americana em papel para este exemplo, porque elas são familiares.

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

Continuando nosso exemplo:

C=[0000000000000011111111110000111111111100]

indica que Alice começou com $ 1, $ 5, $ 10, $ 20, Bob começou com $ 1, $ 1, $ 5, $ 5 e Carl começou com $ 10 e $ 20.

Novamente, o objetivo é minimizar o número de notas que mudam de mãos. Em outras palavras:

Minimize:i=0n1j=0m1Ci,jxEu,jsujeito a:Eu=0 0n-1xEu,j=1 para 0 0j<m,j=0 0m-1xEu,jbj=pEu para 0 0Eu<n,exEu,j0 0

A primeira restrição diz que a solução pode atribuir apenas uma fatura específica a uma parte e a segunda garante que todos paguem o valor apropriado.

Esse é o problema de 0,1 INTEGER PROGRAMMING e está completo em NP (consulte [ Karp 1972 ]). A página da Wikipedia sobre programação linear possui informações sobre diferentes algoritmos que podem ser usados ​​para esses tipos de problemas.

Existem potencialmente várias soluções ideais; manualmente, a primeira solução para o exemplo que surgiu foi:

x=[0 010 0110 00 011110 010 00 00 00 00 00 00 00 00 00 00 010 00 00 00 00 00 00 00 00 00 00 010 00 00 0]

o que significa que Alice paga exatamente US $ 5 e US $ 20, Bob paga exatamente US $ 1, US $ 5 e US $ 5, e Carl paga US $ 10 e US $ 20 e depois remove US $ 5 da mesa.

Também usei o módulo Programa Linear Inteiro Misto do sistema Sage Math , que tem a capacidade de usar diferentes back- end do solucionador ( GLPK , COIN , CPLEX ou Gurobi ). A primeira solução que deu foi

x=[0 010 010 010 011110 010 00 00 00 00 00 00 00 00 00 00 010 00 00 00 00 00 00 00 00 00 00 00 010 00 0]

que é quase o mesmo, exceto que Carl levou os "outros" US $ 5 que Bob colocou na mesa.

Cx

Identifica um subconjunto de pessoas que podem pagar o total reduzido? Ou talvez um subconjunto de pessoas que ainda possam pagar a conta inteira, ou seja, paguem pelo amigo.

Seu extrato final faz parecer que você está interessado no caso de as denominações das notas serem fixas, mas isso não muda o problema.

O(1)

David
fonte
Que esse problema pode ser expresso como IP foi (quase?) Claro; mas quão boa é essa solução? Os IPs do formulário criado podem ser resolvidos com eficiência? Caso contrário, existe um algoritmo mais rápido?
Raphael
Existe uma forma mais condensada desse PI, possuindo uma variável para o número de notas de uma denominação específica do que uma variável 0,1. As denominações fixas alteram um pouco a complexidade; se o número de pessoas também é fixo, o algoritmo de Lenstra pode resolvê-lo em tempo polinomial.
Chao Xu
-2

Certamente, algumas etapas básicas podem incluir as menores faturas disponíveis para atingir o valor total da fatura geral. Se você não quiser permitir contas de US $ 2, cada pessoa pode simplesmente remover a maior conta que pode receber da piscina e chegar lá com relativa rapidez. A nota de US $ 2 joga isso fora, pois não se subdivide muito bem nas outras denominações e complica muito o problema. Certamente, também existem várias outras otimizações que podem ser feitas para fazer observações sobre a necessidade de adicionar mais fundos durante a primeira rodada (por exemplo, se o número total de notas de US $ 1 for suficiente para cobrir a conta, então todos pode parar de incluir, a menos que ainda não tenham investido o suficiente para pagar sua conta).

AJ Henderson
fonte