组合拍卖的冲突图的优化实施是什么?

时间:2013-07-11 09:16:59

标签: java optimization graph

如果m个出价可以共享n个项目的子集,我想找到在出价之间存储冲突的最佳方式,并检查两个出价是否相互冲突(即,它们共享至少一个项目)。到目前为止,我已经尝试了一个尺寸为m x m的矩阵,这不是最优的。我的问题可能有数以千计的出价,因此当我使用方矩阵实现时,我经常会收到错误“Java内存空间不足”。然后,我尝试使用三角矩阵(因为原始冲突矩阵是对称的)但没有摆脱内存问题!

有更好的主意吗?

最好的代码方式?

感谢。

1 个答案:

答案 0 :(得分:0)

一种解决方案是使用番石榴Table并将其与包含所有出价的List<Bid>结合使用。注意:下面的代码使用了很多番石榴的好处:

final List<Bid> allBids = Lists.newArrayList();
final Table<Bid, Bid, Void> conflicts = HashBasedTable.create();

当您存储新的出价时,您会这样做(这假设bid.items()方法返回Set<Item>):

for (final Bid bid: allBids)
    if (!Sets.intersection(newBid.items(), bid.items()).isEmpty())
        conflicts.put(newBid, bid, null);
allBids.add(newBid);

然后,当您想要检测两个出价之间的冲突时:

return table.contains(bid1, bid2) || table.contains(bid2, bid1);

您甚至可以通过将Void值替换为Set<Item>来存储有冲突的项目,并将Sets.intersection()的结果放入其中:

// Table becomes Table<Bid, Bid, Set<Item>>
Sets.SetView<Item> set;
for (final Bid bid: allBids) {
    set = Sets.intersection(newBid.items(), bid.items())
    if (!set.isEmpty())
        conflicts.put(newBid, bid, set.immutableCopy());
}
allBids.add(newBid);