Php 算法是连续背包问题和变尺寸装箱问题的结合

Php 算法是连续背包问题和变尺寸装箱问题的结合,php,algorithm,optimization,knapsack-problem,bin-packing,Php,Algorithm,Optimization,Knapsack Problem,Bin Packing,我试图解决一个问题(用php,但编程语言并不重要)。 我有n个已经付款的人,我有m个将支付与n个已经付款的人的总和相同的金额。 我想计算一下这些人之间最短的汇款路线。可以拆分付款并支付给不同的人。 理想的情况是一个人只做一两笔交易。 有人能给我指出正确的方向或者帮我解决这个问题吗 例如: 一个人付了100美元 B个人支付了200美元 C个人支付了50美元 D个人将支付24美元 E个人将支付175美元 F个人将支付151美元 一个可能的解决办法是 E个人向A个人支付100美元 E向B支付75美元

我试图解决一个问题(用php,但编程语言并不重要)。 我有n个已经付款的人,我有m个将支付与n个已经付款的人的总和相同的金额。 我想计算一下这些人之间最短的汇款路线。可以拆分付款并支付给不同的人。 理想的情况是一个人只做一两笔交易。 有人能给我指出正确的方向或者帮我解决这个问题吗

例如: 一个人付了100美元

B个人支付了200美元

C个人支付了50美元

D个人将支付24美元

E个人将支付175美元

F个人将支付151美元

一个可能的解决办法是

E个人向A个人支付100美元

E向B支付75美元

F向B支付125美元

F向C支付26美元


D个人向C个人支付24美元

从理论上讲,这可能是一个优化问题:

基本上,我们将建立一组约束条件,列举问题的结构,确定初始值,并确保按照您的指示分配所有资金

初始条件约束:

A_paid = 100
B_paid = 200
C_paid = 50
D_out  = 24
E_out  = 175
F_out  = 151
支付的金额不能超过可用金额:(我们将
D\u-A
定义为持有从个人
D
支付给个人
A
的金额的变量)

支付给每个人的金额必须等于他们已经支付的金额:

A_paid = D_to_A + E_to_A + F_to_A
B_paid = D_to_B + E_to_B + F_to_B
C_paid = D_to_C + E_to_C + F_to_C
如果我们现在停下来,作为一个线性规划来解决这个问题,我们会找到跨越整个变量空间的任何解决方案,但你要最小化实际支付的数量。我们可以通过最小化所有
X_到Y
变量来实现这一点,同时满足上述约束条件

min: D_to_A + D_to_B + D_to_C + ...
你可以使用你最喜欢的优化技术来解决这个问题,我喜欢有很多可用的线性规划求解器


虽然这解决了您描述的具体示例,但很容易看出如何通过添加更多变量将其扩展到更大的问题……但随着您添加人员,问题的复杂性会大大增加。如果我没记错的话,背包问题是NP或NP难的,所以这并不意外。

这里面没有任何东西可以减少传输次数。我相信这是一个混合整数规划问题,而不是纯线性的。@Ben,我写这篇文章已经有一段时间了,但我相信,由于最小化是在实际付款上,满足约束条件的最佳解决方案会将唯一付款的数量推向0。也就是说,因为D已经支付了A和B,所以D也不支付C。事实上,由于A无法支付B或C,等式约束将修复目标函数,没有什么可以最小化的。@Ben,等式约束只强制A获得支付,最小化确保D尽可能少地支付A到C。在此设置中,A不能支付B。相等约束确保目标函数等同于
A_paid+B_paid+C_paid
,这是一个无法通过调整解决方案变量最小化的常数。“支付账单”算法:太酷了!
min: D_to_A + D_to_B + D_to_C + ...