php - PHP算法,用于计算将一组划分为另一组的所有可能组合

标签 php algorithm combinations cartesian-product divide

我在找一种二维组合算法如果这是正确的措辞。我对PHP很有经验,但对算法和高级数学没有经验,所以请容忍我。
我有一组元素要与另一组元素组合,并计算所有可能的组合,以便以后可以对其进行分析集合中元素的数量从不改变,两个集合始终有五个元素:

$set1= array('A', 'B', 'C', 'D', 'E');
$set2= array('One', 'Two', 'Three', 'Four', 'Five');

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

等。。那种价值观欢迎对此提出任何反馈意见,特别是:
如何在php中编写这样的代码?通过递归函数?我使用笛卡尔积算法吗?
有多少种组合是可能的5^10英镑?
取决于前一点:在web应用程序中实时处理这些数据是否可行?如果我有1000万个组合,我想我可能需要提前做计算,保存结果分析,并在live应用程序执行期间使用它?
有一些限制(例如:集合2中的“一”、“二”和“三”应该始终至少有集合1中的一个项目),但是在之后的分析过程中,无用的组合将被丢弃,因此不需要将其包含在组合算法中,除非它可以通过在该点构建这些组合来减少计算时间?
我的问题可能不是很清楚,所以只要问我是否需要提供更多或更好的信息。
提前谢谢
更新日期:2012年2月28日
我试过在互联网上找到的power set&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项使用的。
我是不是误解了这两种功能的使用?我想这是我对如何结合幂集和笛卡尔积来达到我的结果的理解不正确。我应该在cartesian()函数中调用powerset()函数吗?
也许那些特定的PHP函数并不完全符合我的目的我在这里找到的:
功率设置:http://bohuco.net/blog/2008/11/php-arrays-power-set-and-all-permutations/
笛卡尔积:Finding cartesian product with PHP associative arrays
另一个更新:在没有编程参考的情况下重新启动问题
这个问题与我为战略游戏创建的分析工具有关每次使用该工具时,玩家可以从大量的单位集合中选择5个不同的单位。这些单元可以通过多种方式与其他(静态)实体(我们称之为“池”)组合这些单位的特点,可能会或可能不会改善球员的策略,如果他们结合某些池。例如:
A组喜欢在1号池但讨厌在2号池
B组不喜欢待在1号池,除非A组也在
等。。
该工具的目的是找到哪个单元在哪个池中的最佳组合。规则如下:
总有5个不同的单位从大约50个集合中选择所有这些单位都有不同的特点。
总有相同的5个游泳池。它们有不同的特性,但池不是从较大的集合中选择的,它们总是相同的。
每个池可以包含多个单元,从0到5。
每个单元只能在一个池中。
输入是:
5个可变单位的列表:A、B、C、D、E
5个静态池的列表:Pool1、Pool2、Pool3、Pool4、Pool5
输出应该是,基于上述规则,这两个列表之间的所有可能组合一些例子:
组合1
游泳池1:A
游泳池2:B
泳池3:C
池4:d
泳池5:E
组合2
游泳池1:A、B、C
游泳池2:d
泳池3:E
游泳池4:
泳池5:
组合3
池1:C
游泳池2:
泳池3:A
游泳池4:B
泳池5:D,E
组合4
游泳池1:
游泳池2:
泳池3:A、B、C、D、E
游泳池4:
泳池5:
等。。。
所以我想做的是:
采取所有可能组合的单位和池存在。
仔细检查它们,根据单元和池之间的协同作用为组合分配一个“战略值”。
以“战略价值”最高的前10个组合为例
第二步和第三步没问题。我遇到的问题是生成池中所有可能的单元组合。
希望这是对问题的更清楚的描述

最佳答案

好吧,现在我想我已经知道你想做什么了单位集合不是单位集合的幂集元素,它们几乎是单位集合的partitions元素我写“几乎”是因为,严格地说,空集不是集的分区集的成员。现在我认为您的问题是计算一组5个单元的所有分区;该分区最多有5个元素(每个元素包含一个单元)。对于您的问题,单元集本身没有5个成员的任何分区都应该填充空集的出现次数。
现在必须将这些分区映射到池的顺序。第一个组合将池映射到单元集分区的元素,因此:{1->{A}, 2->{B}, 3->{C}, 4->{D}, 5->{E}}。如果您还希望其他组合将池映射到单元集的同一分区(如{2->{A}, 3->{B}, 4->{C}, 5->{D}, 1->{E}}),则必须计算池的所有permutations,并将每个池映射到单元集的同一分区。
重复直到完成。

关于php - PHP算法,用于计算将一组划分为另一组的所有可能组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9464451/

相关文章:

c++ - 打印 3D vector 的所有组合

php - 有没有办法将 Hyperledger Fabric Composer 命令从 'composer' 重命名为其他名称?

javascript - 我的网页显示“而不是”

algorithm - For循环按变量递增,时间复杂度

algorithm - 大 O 表示法 - O(nlog(n)) 与 O(log(n^2))

logic - 评估 OCaml 中所有可能的解释

algorithm - 笛卡尔/组合算法(同时保持顺序)

php - 使用 Laravel 从 json 数组获取数据库表

PHP curl : "Unknown cipher in list"

减少比较次数以计算直方图之间的卡方距离的算法?