寻找最小的共同点

时间:2016-09-21 23:05:54

标签: python

我有以下问题。我有一个L二进制数组的数组。(如果感兴趣,L通常在2到8之间。)所有可能的组合确实存在。所以在一个实现中有2^L个数组。现在每个组合将随机获得指定的适合度值。适合度值也可以是10。现在举例来说,以下数组可能具有适应值0

1000
1010
1100
1001
1011

然后确实,所有带有10__的数组都为零且全部都带有1_00。这实际上是我的问题。我需要一种算法来找到这些相似之处并根据它们的等级对它们进行排序。 10__等级为21_00等级为3。大多数情况下,可以使用少量低等级或具有许多高等级来定义所有具有零适应度的阵列。所以我的输出必须订购,我需要知道每个等级有多少。我可以想象这是一个已知的问题,并且已经有了解决方案?我希望你能帮忙:)

2 个答案:

答案 0 :(得分:1)

假设这个fitness value可能取决于你的二进制条目中每个位的值,并且你正在搜索可以总结你的真值表的规则(我不确定我理解你的问题非常关于这一点,你可以使用像Karnaugh map

这样的东西

这些地图的工作方式如下:

列出你的因子(这里是第1位的值,第2位......)并将它们分成两个列表(一个用于行,一个用于列)。

使用Gray Code订购每个列表。

分别为表中的列和行使用每个列表的值集。

您知道有一个表格可以表示二进制条目的每种值的可能性。

然后,列出表格中每个条目的适合度值(1或0)。

然后你必须在你的表中制作一组Trues值(或假),这样你就可以找到这个组的规则(通过找到共同的特征)。您通常通过正方形或角落对这些进行分组(参见第一个维基百科链接)。

这是一个包含3位条目的(简单)示例:

假设您有以下真值表:

ABC|R
-----
000|0
001|0
010|1
011|1
100|1
101|0
110|1
111|1

您可以建立以下卡诺表:

        AB
  |     00 |     01 |     11 |     10   <-- AB
--------------------------------------
0 |      0 | (1)  1 | (1)  1 | (2)  1
--------------------------------------
1 |      0 | (1)  1 | (1)  1 |      0

^
|
C
  • 你可以将4组合在中间,这4个组合都是B True,但A和C可能是True或False,所以你可以这样总结:

    (1)B -> R

  • 你也有一个在右上角:

    (2)A and !B and !C -> R

所以你在这种情况下的规则是:

B or (A and !B and !C) -> R

正如我在评论中提到的,我不确定你真正希望实现的目标。但是如果你试图找到一些简单的规则来总结你的真值表,那么列出这一步骤中找到的规则就足够了吗?

我没有提供python实现,但你可能会在互联网上找到一些。 :)至少你现在可以用纸和铅笔做到这一点。 :)

随意询问是否有不清楚的事情!

以下是您可以在互联网上找到的众多教程之一:

http://www.facstaff.bucknell.edu/mastascu/eLessonsHTML/Logic/Logic3.html

PS:

B表示B为真,而!B表示它为假。

PS-2:

您也可以使用Boole代数来减少规则。

答案 1 :(得分:1)

如前所述,这是一个组合逻辑最小化问题。

通常使用的算法是Quine-Mccluskey,有人已经要求并发布了Python实现:

Quine-McCluskey algorithm in Python