今天,在考虑我与朋友的最后一次旅行的旅行费用时遇到了一个有趣的问题。
我们假设我们有以下支出:
# 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但我认为它不适用于这种情况。
答案 0 :(得分:2)
这似乎不是一个难题 - 通过提升支出对参与者进行排序,然后按顺序让每个参与者将其否定(当前)余额转移给下一个参与者。 n-1个交易,每个参与者最多一个交易。当然,每一项都是你能做的最好的。
或者是否有一些额外的约束我错过了?
答案 1 :(得分:0)
此方法仅解决“最低银行交易总数”部分。
人们分为两类,例如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.
}