2015-07-28 147 views
1

我有一个问题,我需要解决,我敢肯定有这样做的方式,我只是不完全确定“要搜索什么”以及如何找到它。数据关系 - 寻找解决方案

我正在考虑在Excel中这样做,或者我可能会尝试做一个PHP脚本来做到这一点。

所以基本上,我有一套物质。每一对物质都与另一种物质兼容或不兼容。所以我所拥有的是一个有行和列的表,其中有0或1,即兼容/不兼容。

现在我想要做的是尝试找到一组物质,其中该组中的所有物质都是相互兼容的。目标是找到尽可能大的组,或者理想的情况下,找到最大的,次最大的等等,并将它们从最大到最小排序(因为可能会限制该组中元素的最小数量)。

我希望它是有道理的,问题是我不知道如何解决它,但我认为这应该是相对普遍的做法,所以我怀疑唯一的方法是写一个脚本/宏从从头开始用蛮力来做到这一点。这也可能不是很有效,因为我有一个超过30个元素的表格。

所以这只是为了更加明确,例如这里是一个什么我的数据看起来像一个简化表:

Substance    A B C D 
    A     0 1 1 1 
    B     1 0 0 1 
    C     1 0 0 0 
    D     1 0 0 0 
+0

这个问题有点短暂的信息。你可以分享你的尝试,以及你遇到了什么问题? –

+0

有些不对劲......表格显示** B **与** D **兼容,但** D **仅与** A兼容??? –

+0

嗨,对于这个例子,我只是为了说明的目的而做出来的 基本上我需要创建一组物质,其中特定组中的所有物质都是相互兼容的。我的目标是创建具有尽可能多元素的组 - 理想情况下,按照从最大到最小的顺序(给定该组中最少数量的元素)对它们进行排序。 – Jachym

回答

1

如果你只使用PHP没有数据库,你可以使用uasort通过总和的所有元素进行排序的相关数组。

<?php 
$substances = [ 
    'A' => [ 
     'A' => 0, 
     'B' => 1, 
     'C' => 1, 
     'D' => 0, 
    ], 
    'B' => [ 
     'A' => 1, 
     'B' => 0, 
     'C' => 1, 
     'D' => 1, 
    ], 
    'C' => [ 
     'A' => 0, 
     'B' => 1, 
     'C' => 0, 
     'D' => 0, 
    ] 
]; 
uasort ($substances, function ($a, $b) { 
    $a = array_sum($a); 
    $b = array_sum($b); 
    if ($a == $b) { 
     return 0; 
    } 
    return ($a > $b) ? -1 : 1; 
}); 
var_export($substances);