我正在创建一小块软件并遇到了一个概念问题。我将尝试用一个小例子来解释这种情况:
我需要的是创建尽可能多的事件(直到蓝色或红色组的资源耗尽)。我们假设我有2个红点和2个蓝点。是和否意味着它们满足给定的条件:
B1 R1 Yes B1 R2 Yes B2 R1 Yes B2 R2 No
如果我匹配B1和R1(每个列表的顶部),我只得到一个事件,因为B2和R2不匹配。另一方面,如果我将B1与R2匹配,B2与R1匹配,则会收到2个事件。这就是我需要的。
此外,我的活动的平均距离(从蓝点到红点)应该尽可能低。
我想通过随机选择蓝点和红点来创建事件,只要它们符合条件,多次完成整个过程并保持结果具有最高事件量和最低平均距离。但我不喜欢它,因为我不能提供任何关于结果质量的陈述。结果也不是确定性的。
非常感谢任何帮助。
答案 0 :(得分:0)
如果有疑问,请从暴力开始(至少这样你可以检查其他解决方案的有效性) - 在非常小的测试数据集上*(例如4 + 3点=> n = 4 * 3可能的对):
n = red_count * blue_count
{{(r1,b1)}, {(r1,b2)}, ...}
每套:
如果仍有资源需要匹配,可以通过添加另外一对来拆分当前设置(为可以添加的每一对执行此操作)并删除当前未完成的设置,如下所示:
4 sets of 1 event 10 sets of 2 events
e1 e2 e3 e4 e1 e2 e3 e4
x x x x e1 x x x x
-> e2 x x x
e3 x x
e4 x
重复,直到新配对无法改善设置(不再使用资源或所有配对)
=>最坏情况 O(n 2k ) (n = r * b =所有可能的红/蓝对,k =最大集合中的事件数)
然后受到global optimization技术的启发,不确定如何在没有更详细的规范的情况下将您的需求组合起来,想到......
步骤1和2是O(n)=> 5000*300 = 1.5m
对可能接受
我会尝试按距离排序事件数组 - O(nlogn) - 并且仅使用x
个最短事件作为开始点用于我的启发式算法(测试1-10最短以查看性能/准确性权衡)+在分割后仅保留x
个最短集...
答案 1 :(得分:0)
这是一个有趣的问题,但似乎有很多参数需要考虑。
作为第一步,我尝试使用兼容性矩阵简化问题/参数的表示。矩阵的行将对应于蓝点,矩阵的列将表示红点。对于您的样本问题,矩阵将如下所示:
R1 R2
B1 1 1
B2 1 0
因此,此矩阵表示哪些点可与哪些点配对以制作事件。
接下来,让我们尝试使用此矩阵解决您的描述中的示例问题。这可以通过一些动态编程来完成:
假设所有R
点都存在,但唯一可用的蓝点是B1
。构建列出可能组合的解决方案向量。所以你会得到[(R1, B1)], [(R2, B1)]
。
现在我们逐步将B2
引入上一步构建的解决方案向量中。对于解决方案向量的第一个组件,请注意R1
已在上一步中用完,R2
无法与B2
一起使用,因此无法改进此解决方案。但是,可以改进解决方案向量的第二个组成部分,因为(R1, B2)
可以添加到其中。因此,我们得到最终解决方案向量[(R1, B1)],[(R2, B1), (R1, B2)]
。
现在,您可以计算解决方案向量的各个组件,并选择其中包含最多项目的组件(或者您的案例中的事件)。
我认为可以将此方法扩展到问题的完整版本,但它需要更多的内容管理(因为您还必须跟踪资源使用情况)。与您的示例不同,在第一步中将R1
与B1
配对并不一定意味着R1
已完成...它可能具有足够的资源以便可以重复使用。
我希望这会给你一些见解。祝好运! :)