-6

我有一个问题,我有多个(几千)数量,我需要在一组数量的收件人之间拆分,以便每个数量必须拆分为整数并使用相同的比例。我需要找到一个可靠且有效地实现这一点的算法(我们都不是吗?:-))

这是为了解决金融市场(证券交易所订单)中的一个问题,其中订单可能会获得数千个“成交”,并且在一天结束时必须将其分发给几个客户,同时保持订单的平均价格。这是一个例子:

总订货量 37300

联交所填写的数量

执行 1. 16700 股以 75.84 的价格成交

执行 2. 5400 股以 75.85 的价格成交

执行 3. 4900 股以 75.86 的价格成交

执行 4. 10300 股以 75.87 的价格成交

以平均价格成交的总数为 37300 股 = (16700*75.84 + 5400*75.85 + 4900*75.86 + 10300*75.87) / 37300 = 75.85235925

假设我需要在 3 个客户之间分配这些数量,这样:

客户1:15000股

客户2:10000股

客户3:12300股

每次执行都必须单独拆分(我不能只将每个客户要求的数量按平均价格定价)

我的第一个想法是按比例拆分:

客户 1 得到 15000/37300=0.402144772

客户端 2 得到 10000/37300=0.268096515

客户 3 得到 12300/37300=0.329758713

这会导致

Client1 - 15000 Client2 - 10000 Client3 - 12300 比率:0.402144772 比率:0.268096515 比率:0.329758713

拆分(对不起格式 - 这是我在帖子编辑器中能做的最好的)

+-------------+-------------+-------------+
| Client 1    | Client 2    | Client 3    | 
+-------------+-------------+-------------+ 
| 6715.817694 | 4477.211796 | 5506.970509 | 
| 2171.581769 | 1447.72118  | 1780.697051 |
| 1970.509383 | 1313.672922 | 1615.817694 |
| 4142.091153 | 2761.394102 | 3396.514745 |
+-------------+-------------+-------------+
| Totals:     |             |             |
|       15000 |       10000 |       12300 | 
+-------------+-------------+-------------+

这样做的问题是我无法为客户分配小数,所以我需要一个智能算法来调整数量,使这些拆分的小数部分为 0。我知道这在许多情况下可能是不可能的,所以这个要求可以放松一点,以便某个客户获得更多(或更少)。

有谁知道我可以用作这个问题的起点的算法?

4

2 回答 2

1

您可以舍入除最后一个(可能是最小的)之外的所有数字 (ratio[n] * totalQuantity) 最后一个必须是 totalQuantity - 其他数字的总和。这将为您提供整数数量,同时获得与您选择的比率接近的正确总数。

于 2012-09-17T16:25:36.047 回答
0

试着从不同的角度来看待这个问题。您已经知道每个客户获得了多少份额。您想计算每个人必须支付的公平总金额,并在没有舍入误差的情况下执行此操作。

因此,您希望这个总美元金额没有四舍五入的问题,即精确到 0.01。

然后可以使用美元金额计算价格并以所需的精度显示。

相反(计算价格,然后得出金额)总是会产生美元金额的四舍五入问题。

假设价格是每 100 个单位,这是实现此目的的一种方法:

  1. 计算订单的总美元 (16,700*75.84/100 + 5,400*75.85/100 + 4,900*75.86/100 + 10,300*75.87/100) = $28,292.93

  2. 根据订购数量/填充数量的比率分配除 1 之外的所有客户:

客户 2 = $28,292.93 / 37,300 * 10,000 = $7,585,24 价格 = 7,585,24 / 10,000 * 100 = 75.8524。

客户 3 = 28,292.93 美元 / 37,300 * 12,300 = 9,329.84 美元 价格 = 9,329.84 美元 / 12,300 * 100 = 75.85235772

  1. 将最后一个客户计算为剩余的 $$$:

28,292.93 美元 - (7,585,24 美元 + 9,329.84 美元) = 11,377.85 美元。价格 = 11,377.85 美元 / 15,000 * 100 = 75.85233333

这里我随意选择了数量最大的Client 1作为余数计算的对象。

于 2012-09-17T16:39:07.887 回答