如何在多个条件下选择项目

时间:2012-11-29 11:09:50

标签: algorithm set distance

我正在创建一小块软件并遇到了一个概念问题。我将尝试用一个小例子来解释这种情况:

  • 我有一个包含多个点的坐标系。
  • 每个点都是通过它在x和y轴上的位置来描述的(到目前为止很正常),可以是蓝色或红色。
  • 现在我想创建活动。
  • 每个事件都包含一个蓝色和一个红点,并且有几个条件可以选择它们。
    • 例如:蓝色(x)和红色(x)的总和(=蓝色和红色点的x值)必须是偶数。
    • 同时,可能存在y值的校验和不得为素数的情况。
  • 每个点都可以成为多个事件的一部分。
  • 在我的情况下,每个点都有特定的资源,这些资源在创建事件时被“使用”,并且只要具有所需的资源量,该点就可以成为新事件的一部分。

我需要的是创建尽可能多的事件(直到蓝色或红色组的资源耗尽)。我们假设我有2个红点和2个蓝点。是和否意味着它们满足给定的条件:

B1  R1  Yes
B1  R2  Yes
B2  R1  Yes
B2  R2  No

如果我匹配B1和R1(每个列表的顶部),我只得到一个事件,因为B2和R2不匹配。另一方面,如果我将B1与R2匹配,B2与R1匹配,则会收到2个事件。这就是我需要的。

此外,我的活动的平均距离(从蓝点到红点)应该尽可能低。

我想通过随机选择蓝点和红点来创建事件,只要它们符合条件,多次完成整个过程并保持结果具有最高事件量和最低平均距离。但我不喜欢它,因为我不能提供任何关于结果质量的陈述。结果也不是确定性的。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

如果有疑问,请从暴力开始(至少这样你可以检查其他解决方案的有效性) - 在非常小的测试数据集上*(例如4 + 3点=> n = 4 * 3可能的对):

  1. 从所有可能的对的乘积中创建一系列可能的事件(符合条件的蓝红色对列表,也预先计算此步骤中的距离)
    - 最差情况n = red_count * blue_count
  2. 将此数组复制到一组集合中,每个集合只有一个事件:{{(r1,b1)}, {(r1,b2)}, ...}
  3. 每套:

    • 更新积分上的资源(为每套课程单独存储)
    • 如果仍有资源需要匹配,可以通过添加另外一对来拆分当前设置(为可以添加的每一对执行此操作)并删除当前未完成的设置,如下所示:

      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
      
    • 重复,直到新配对无法改善设置(不再使用资源或所有配对)

  4. =>最坏情况 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

因此,此矩阵表示哪些点可与哪些点配对以制作事件。

接下来,让我们尝试使用此矩阵解决您的描述中的示例问题。这可以通过一些动态编程来完成:

  1. 假设所有R点都存在,但唯一可用的蓝点是B1。构建列出可能组合的解决方案向量。所以你会得到[(R1, B1)], [(R2, B1)]

  2. 现在我们逐步B2引入上一步构建的解决方案向量中。对于解决方案向量的第一个组件,请注意R1已在上一步中用完,R2无法与B2一起使用,因此无法改进此解决方案。但是,可以改进解决方案向量的第二个组成部分,因为(R1, B2)可以添加到其中。因此,我们得到最终解决方案向量[(R1, B1)],[(R2, B1), (R1, B2)]

  3. 现在,您可以计算解决方案向量的各个组件,并选择其中包含最多项目的组件(或者您的案例中的事件)。

  4. 我认为可以将此方法扩展到问题的完整版本,但它需要更多的内容管理(因为您还必须跟踪资源使用情况)。与您的示例不同,在第一步中将R1B1配对并不一定意味着R1已完成...它可能具有足够的资源以便可以重复使用。

    我希望这会给你一些见解。祝好运! :)