PHP算法,计算将一个集合划分为另一个集合的所有可能组合

PHP算法,计算将一个集合划分为另一个集合的所有可能组合,php,algorithm,combinations,cartesian-product,divide,Php,Algorithm,Combinations,Cartesian Product,Divide,我正在寻找一种二维组合算法。。如果这是正确的措辞。我对PHP很有经验,但对算法和高等数学没有经验,所以请容忍我 我有一组元素,我想与另一组元素组合,并计算所有可能的组合,以便以后可以对其进行分析。集合中的元素数量从未改变,两个集合始终有五个元素: $set1= array('A', 'B', 'C', 'D', 'E'); $set2= array('One', 'Two', 'Three', 'Four', 'Five'); 不知道这是否是正确的措辞,但我希望看到集1项目的所有组合,在集2项

我正在寻找一种二维组合算法。。如果这是正确的措辞。我对PHP很有经验,但对算法和高等数学没有经验,所以请容忍我

我有一组元素,我想与另一组元素组合,并计算所有可能的组合,以便以后可以对其进行分析。集合中的元素数量从未改变,两个集合始终有五个元素:

$set1= array('A', 'B', 'C', 'D', 'E');
$set2= array('One', 'Two', 'Three', 'Four', 'Five');
不知道这是否是正确的措辞,但我希望看到集1项目的所有组合,在集2项目之间划分。两个集合中的所有元素在每个可能性中只能使用一次,集合1的元素可以在集合2的元素中组合在一起,因此我得到一个如下所示的结果数组(一些随机值作为示例):

等等。。这些价值观。欢迎就此提供任何反馈,特别是:

  • 如何在PHP中编写类似的代码?通过递归函数?我是否使用笛卡尔积算法
  • 有多少种组合是可能的?5^10
  • 取决于上一点:在web应用程序中实时处理这些数据是否可行?如果我有1000万个组合,我可能需要事先进行计算,保存结果分析并在实时应用程序执行期间使用它

  • 有一些限制(例如:集合2项“一”、“二”和“三”应始终具有集合1中的至少一项),但在随后的分析过程中,无用的组合将被删除,因此无需将其包含在组合算法中,除非它可以通过在该点构建这些项来减少计算时间
我的问题可能不是很清楚,所以问问我是否需要提供更多或更好的信息

提前谢谢


更新日期:2012年2月28日

我曾经尝试过在互联网上找到的powerset和Cartesian乘积函数的PHP实现(这种东西我自己都无法尝试编写)。因此,当我执行此代码时:

$powerset= powerSet(array('A', 'B', 'C'));
$cartesian = cartesian(array(
    'Set1' => $powerset,
    'Set2' => array('One', 'Two', 'Three')
));
这是powerSet函数在$powerSet中的内容:

Array (
      [0] => Array ()
      [1] => Array (
        [0] => A
      )
      [2] => Array (
        [0] => B
      )
      [3] => Array (
        [0] => B
        [1] => A
      )
      ...
这就是笛卡尔函数返回的结果:

Array (
      [0] => Array (
        [Set1] => Array ()
        [Set2] => One
      )
      [1] => Array (
        [Set1] => Array (
          [0] => A
        )
        [Set2] => One
      )
      [2] => Array (
        [Set1] => Array (
          [0] => B
        )
        [Set2] => One
      )
      [3] => Array (
        [Set1] => Array (
          [0] => B
          [1] => A
        )
        [Set2] => One
      )
      ...
所以它有点像我想要的,但不是最难的部分。它“单独”考虑组合,不在Set2中分配Set1,确保所有Set1项都用于所有三个Set2项

  • 我是否误解了这两个函数的使用?我想我对如何结合幂集和笛卡尔积来实现我的结果没有正确的理解。我是否应该调用笛卡尔()函数中的powerSet()函数
  • 也许那些特定的PHP函数并不完全符合我的目的?我在这里找到它们:
    • 动力装置:
    • 笛卡尔积:

另一个更新:在没有编程参考的情况下重新出现问题

这个问题与我为战略游戏创建的分析工具有关。每次使用该工具时,玩家可以从大量单位集合中选择5个不同的单位。这些单元可以通过多种方式与其他(静态)实体(让我们称之为“池”)组合。这些单位的特点可能会改善玩家的策略,也可能不会,如果他们与某些池相结合。例如:

  • 单位A喜欢在1号池,但不喜欢在2号池
  • B队不喜欢呆在1号池里,除非A队也在那里
  • 等等
该工具的目的是找到哪些单位进入哪个池的最佳组合。以下是规则:

  • 在大约50个单元的集合中,始终选择5个不同的单元。所有这些单位都有不同的特点
  • 总有相同的5个池。它们具有不同的特征,但池不是从更大的集合中选择的,它们总是相同的
  • 每个池可以包含多个单元,从0到5
  • 每个单元只能在一个池中
输入为:

  • 5个可变单位的列表:A、B、C、D、E
  • 5个静态池的列表:池1、池2、池3、池4、池5
根据上述规则,输出应为这两个列表之间的所有可能组合。一些例子:

组合1

  • 池1:A
  • 第2组:B组
  • 池3:C
  • 第4组:D
  • 池5:E
组合2

  • 第一组:A、B、C
  • 池2:D
  • 池3:E
  • 第4组:
  • 第5组:
组合3

  • 池1:C
  • 第二组:
  • 第三组:A组
  • 第4组:B组
  • 第5组:D、E
组合4

  • 第一组:
  • 第二组:
  • 第三组:A、B、C、D、E
  • 第4组:
  • 第5组:
等等

因此,我想做的是:

  • 考虑所有可能存在的单位和池的组合
  • 仔细检查,并根据单位和池之间的协同作用,为组合分配“战略价值”
  • 以“战略价值”最高的前10个组合为例
  • 步骤2和3没有问题我遇到的问题是生成池中所有可能的单元组合。


    希望这是对问题的一个更清晰的描述,好吧,现在我想我已经知道你想做什么了。单位集合不是单位集合幂集合的元素,它们是(几乎)单位集合的元素。我写“几乎”是因为,严格来说,空集不是集合的分区集的成员。现在我想你的问题是计算所有的
    Array (
          [0] => Array (
            [Set1] => Array ()
            [Set2] => One
          )
          [1] => Array (
            [Set1] => Array (
              [0] => A
            )
            [Set2] => One
          )
          [2] => Array (
            [Set1] => Array (
              [0] => B
            )
            [Set2] => One
          )
          [3] => Array (
            [Set1] => Array (
              [0] => B
              [1] => A
            )
            [Set2] => One
          )
          ...