【问题标题】:Optimizing allocation algorithm needed需要优化分配算法
【发布时间】:2014-01-23 10:39:49
【问题描述】:

今天我在计算上一次和朋友旅行的旅行费用时遇到了一个有趣的问题。

假设我们有以下支出:

# expenditures in US-$
Peter= 117
Joe=    38
Bill=   15
Chris=   0
Alan=  209
Tim=   201
Ahmet= 124
Pati=   57
Steven= 74

现在我们决定每个人都应该支付相同的金额。鉴于平均支出为 92.77778 美元,余额如下所示:

# balances in US-$
Peter=  24.22 
Joe=   -54.78 
Bill=  -77.78
Chris= -92.78
Alan=  116.22
Tim=   108.22
Ahmet=  31.22
Pati=  -35.78
Steven=-18.78

所以现在我想找到一种优化方法,使我们的银行交易总数最少,并且在所有参与者中公平分配交易份额(因此有两个优化目标)

我查看了Stable Marriage Problem,但我认为它不适用于这种情况。

【问题讨论】:

    标签: algorithm optimization


    【解决方案1】:

    这似乎不是一个困难的问题 - 按支出升序对参与者进行排序,然后按此顺序,让每个参与者将其否定的(当前)余额转移给下一个参与者。 n-1 笔交易,每个参与者最多一笔交易。当然,一般来说,每一个都是你能做到的最好的。

    还是我缺少一些额外的约束?

    【讨论】:

    • 打败我 :)。 +1。我只想补充一点,这个解决方案没有考虑到,通常当你筹钱买东西时,你支付的金额是 10 或 5 的乘积。在这种特殊情况下,你可以获得比 n 更好的结果-1,因为例如来自其他 2 人的 2 笔交易可能同时涵盖他们的正余额和负余额。
    • 考虑有 2*5=10 人。其中 5 个每个具有 -1 余额,其中 5 个每个具有 +1 余额。最佳交易数量为 5。您的算法将如何工作?
    • 这就是我所说的“一般情况”。在给出的示例中,没有办法低于 n-1 个事务。不过,如果这就是 Joschi 所寻找的,我认为有一种非常简单的方法可以做到这一点。 (基本上,子集和的动态规划算法的一种变体。)
    • 完全有道理。谢谢!
    【解决方案2】:

    这种方法只解决了“总银行交易次数最少”的部分。

    人们分为两类,比如Giver(其余额为负数)和Receiver(其余额为正数)。

    关键观察 在最佳解决方案中,给予者应始终给予金钱,接受者应始终收到金钱。不可能 A 给 B 钱,然后 B 给 C 一些钱。

    现在解决方案来了。

    While (there is some giver or receiver) {
        Find the giver with the largest balance, say A.
        Find the receiver with the largest balance, say B.
        Let A gives as much money as B needs.
        Delete Person if his/her balance becomes 0.
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 2015-06-27
      • 2013-11-18
      • 2021-10-15
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      • 2014-06-24
      相关资源
      最近更新 更多