作为一个过于简化的例子,我有一个最大出席率的事件列表:
event | places
===================
event_A | 1
event_B | 2
event_C | 1
与参加活动距离的与会者名单:
attendee | event_A dist | event_B dist | event_C dist
==========================================================
attendee_1 | 12 | 15 | 12
attendee_2 | 11 | 15 | 11
attendee_3 | 10 | 11 | 12
有人能建议一种简单的方法来生成一组选项,根据最短的总距离和最短的平均距离提供最佳的案例分配吗?
我目前拥有Oracle Spatial数据库中的数据,但我愿意接受建议。
答案 0 :(得分:0)
我目前了解您的问题如下:
根据这种解释,我建议采用以下算法:
创建一个完整的二分图,分区 A 中的节点用于参与者和分区 B 中的节点,用于事件中的位置。因此,每个参与者对应于一个节点,并且每个事件对应于具有位置的节点。所有参与者都连接到所有事件节点,并将距离作为边缘成本。
此时您的问题对应于general assignment problem,其中“代理”对应于您的活动地点,而“任务”对应于您的与会者。每个参加者都必须受到保护,但并非所有活动场所都必须使用。
添加假参与者以实现完美匹配。简单地总结所有的地方,减去实际的参与者的数量。为了区别,创建尽可能多的参与者节点,距离为零到所有事件节点。
通过使两个分区的大小相等,您现在处于更常见的linear assignment problem域。
使用hungarian algorithm计算最低费用分配。也许你可以想到一些简化,这些简化利用了你有许多等价节点的事实,即同一事件和所有那些虚拟参与者的地方。
所有这一切都应该在应用程序代码中完成,而不是在数据库中完成。所以我宁愿标记这个algorithm。您需要从数据库中提取完整的成本矩阵,以便为您的边缘提供成本。