假设我们有3个人,Alice,Bob和Charlie。
让我们说每个人都有资源,Aplles,Bannanas和Coconuts。
每个人都有3个这样的资源。
该算法的目标是进行1-1交易,使得每个交易最终得到我们3个资源中的每个资源中的1个。这些交易的清单是我想要获得的。
理想情况下,我想知道如何解决这个问题。但是我愿意接受这种问题的名称,或者类似于我可以研究并从中得到想法的问题。
我正在处理的问题将包含大约600个对象,每个对象有大约1000个随机数量/类型的起始资源,(假设有足够的资源来满足我们的最终结果)所以理想情况下任何解决方案提供这样的规模是可行的。但我会采取我能得到的任何东西,我只需要某种起点。
答案 0 :(得分:1)
假设您拥有类型1,...,xn资源类型n的x1资源总数。
假设你有k个人,他们每个人都有(或者需要分别以y1,y2,...,yk资源结束。
现在,选择一个人并为他分配最普遍的资源。完成赋值后,递减相应的xj s(即,如果将资源j分配给i,则递减xj)。
不断重复,直到分配完所有资源。
这是最均匀分配内容的方法。它假设你不关心交易的顺序,但最终结果本身。
答案 1 :(得分:1)
ElKamina和Tyler Durden的答案是不错的,但他们似乎没有考虑到Kuriso想要进行1-1交易,人们可能有多种商品和多种商品单位。我有一个天真的解决方案。
我认为最初的例子有点过于简单,所以让我们再看一个:
c1 c2 c3 c4
A 5 0 1 0
B 0 1 0 1
C 0 6 2 0
A,B,C是人,c1,c2,c3,c4是商品。
首先,让我们计算理想的分布,这很容易做到:对于每种商品,将东西的总和除以人数,向下舍入,每个人都得到:
c1 c2 c3 c4
A 1 2 1 0
B 1 2 1 0
C 1 2 1 0
现在让我们定义一个WANT函数,表示人X需要多少东西进入理想位置:WANT(X,c)= IDEAL(c) - Xc。
c1 c2 c3 c4 sum
A -4 2 0 0 -2
B 1 1 1 0 3
C 1 -4 -1 0 -4
让我们按照他们想要的总和列出一个人的清单。让我们来看看最富有的人,即想要最低的人,在这种情况下是C,让我们尝试通过将他与最能提供他最想要的商品的人匹配来满足他的需求。如果他们可以进行交易,那么很好,如果没有,继续直到我们找到匹配(最终保证匹配)。在这个例子中,C需要c1;提供最多c1的那个是A,迭代商品,我们发现A需要c2而C确实有剩余的c2,所以他们交换它们。更新他们在列表中的位置,或者在他们不再需要时删除它们。迭代这个直到没有人有任何需要。这不会产生适当的平均分配,但是等于1可以达到1次交易。
这确实是一个天真的解决方案,通过启发式方法,最富有的人最有机会提供东西以换取他所需的商品。复杂性很高,但对于有序列表,它应该可以管理您指定的数字。
答案 2 :(得分:0)
重申这一点,假设你有这样的一组列表:
{1,1,1}
{2,2,2}
{3,3,3}
并且您想要交换不同集合中的元素,直到您拥有这样的集合:
{1,2,3} {1,2,3} {1,2,3}
现在,您可能会注意到,如果我们将这些列表视为单个矩阵,则一个矩阵与另一个矩阵相反。您可以通过交换1-2-3对角线来执行此反转。
因此,列表1中的项目2与行2中的项目2交换,列表1中的项目3与列表3中的项目1交换,最后列表2中的项目3与列表3中的项目2交换。
总结一下:通过交换对角线进行矩阵求逆。