根据距离分配地点

时间:2013-02-20 15:30:48

标签: database math

作为一个过于简化的例子,我有一个最大出席率的事件列表:

 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数据库中的数据,但我愿意接受建议。

1 个答案:

答案 0 :(得分:0)

我目前了解您的问题如下:

  • 每个参加者应该被分配到一个事件
  • 每个事件都有一个限制,分配了多少参与者
  • 不完整甚至是空事件都没问题
  • 事件和参与者之间的每个分配对应于给定距离
  • 您希望最小化所有作业的总距离
  • 您可能希望打印结果而不是使用总和,而是使用方法

根据这种解释,我建议采用以下算法:

  1. 创建一个完整的二分图,分区 A 中的节点用于参与者和分区 B 中的节点,用于事件中的位置。因此,每个参与者对应于一个节点,并且每个事件对应于具有位置的节点。所有参与者都连接到所有事件节点,并将距离作为边缘成本。

    此时您的问题对应于general assignment problem,其中“代理”对应于您的活动地点,而“任务”对应于您的与会者。每个参加者都必须受到保护,但并非所有活动场所都必须使用。

  2. 添加假参与者以实现完美匹配。简单地总结所有的地方,减去实际的参与者的数量。为了区别,创建尽可能多的参与者节点,距离为零到所有事件节点。

    通过使两个分区的大小相等,您现在处于更常见的linear assignment problem域。

  3. 使用hungarian algorithm计算最低费用分配。也许你可以想到一些简化,这些简化利用了你有许多等价节点的事实,即同一事件和所有那些虚拟参与者的地方。

  4. 所有这一切都应该在应用程序代码中完成,而不是在数据库中完成。所以我宁愿标记这个。您需要从数据库中提取完整的成本矩阵,以便为您的边缘提供成本。