我有 20-80 个用户和 5-10 个活动,其最小和最大免费座位数(2-4、3-5、2-6...)的范围各不相同。例如,对于 3-5 的范围,可以接受仅将三个用户分配给事件。用户可以为 1-3 个事件选择加权偏好 (1,2,3)。问题是以最佳方式将尽可能多的用户分配给事件。
我正在使用匈牙利算法,JavaScript 实现是使用munkres-js完成的。如果没有解决方案,可以删除事件和最终用户,直到有解决方案。这会产生令人满意的非最优解。
我目前的问题是如何让用户在优化之前形成不同大小(2-8)的预定义组?如果最大座位数小于团体人数,则团体无法选择活动。这可以在算法执行之前处理。该组可以以与单个用户相同的方式选择三个加权偏好。例如,在 40 个用户中,有 4、5 和 6 人的三个预定义组,其余 25 个用户将被单独分配。
我最初的想法是将所有用户分配到预定义的组,然后将组分配给事件,但我不知道如何使用不同的组大小和事件席位来做到这一点。
不会过多改变范围的非最优近似值和约束也可以。有约 30 秒的时间限制。
有任何想法吗?
// 编辑
建议的约束:
- 将小组人数限制为两人。这是可行的,因为常见的场景是人们想和一个朋友一起参加一个活动。
// 编辑2
要求清单:
目标
- 目标是为事件分配尽可能多的用户。
- 必须尊重用户偏好。
活动
- 活动有最小和最大座位数(例如:3-5)。
- 如果活动没有收到最少的用户数,则必须取消该活动。
个人用户
- 用户可以为尽可能多的不同事件 (1-3) 选择最多三个 (1-3) 加权偏好 (1,2,3)。
- 用户只能被分配到他们选择的事件。
- 如果用户多于空闲席位,则必须公平地移除多余的用户。
- 如果用户无法与其偏好匹配,则必须将其删除。这应该是最后的措施。
团体
- 用户可以组成不同大小的组 (2-8)。
- 组可以像个人用户一样选择三个加权偏好。
- 如果最大座位数小于团体人数,则团体无法选择活动。这可以在算法执行之前处理。
其他
- 算法必须能够在 30 秒内执行。
- 非最佳近似值很好。
- 如果它们不会过多地改变范围,则可以引入新的约束。