不等式变量的排列

问题描述 投票:0回答:1

假设我有 3 个变量(x、y 和 z)和两个数字 -1 和 1,仅使用 = 和 < operands, is there a way to generate all unique permutations?

例如:

-1 = x = y = z < 1
-1 = x = y < z = 1
-1 = x < y = z = 1
-1 < x = y = z = 1
-1 < x < y < 1 < z
...

无效排列集 -1 = 1,例如:

-1 = x = y = 1 < z

副本如下:

-1 < x = y < z = 1
-1 < y = x < 1 = z

我在 Excel 中尝试了多种方法,但相当接近于手动执行,因为我无法弄清楚要包含哪些逻辑来防止 -1 等于 1,也无法弄清楚如何忽略重新排列的(但技术上等效的)重复项。非常感谢您的帮助!

python excel math combinations permutation
1个回答
0
投票

我不是数学家,所以不能保证我正确地阅读了您的语言!不过,我认为这将帮助你继续前进。我的方法:

  1. 仅生成参数的排列表 (1, -1, x, y, z)
  2. 仅生成运算符 (=, <; allow duplicates to get r=4)
  3. 使用PowerQuery对这两个表进行笛卡尔连接(交叉连接)。还可以使用 Power Query 对列顺序重新排序,以获得有意义的方程顺序。
  4. 处理该表以消除我们所知道的 (a) 不合逻辑的不平等和 (b) 不合逻辑的关系。

认为捕获了你需要消除的异常,给出了大约 1200 多种排列。无论如何,这应该为您提供前进所需的工具。

详情:

步骤 1 和 2:我承认我使用 numbergenerator.org 来获取这些。从您最初的帖子中,我了解到这部分不是您的主要问题,但如果您需要,我可以帮助想出一个解决方案来在 Excel 中生成此初始列表。然后,我将该数据 (Ctrl+T) 表化为表 OrigArgs 和 OrigOps。

第 3 步:交叉连接 使用 MS 站点的此方法。我用过:

let
    SrcArgs = Excel.CurrentWorkbook(){[Name="OrigArgs"]}[Content],
    SrcArgTypes = Table.TransformColumnTypes(SrcArgs,{{"aA", type any}, {"aB", type any}, {"aC", type any}, {"aD", type any}, {"aE", type any}}),
    SrcOps = Excel.CurrentWorkbook(){[Name="OrigOps"]}[Content],
    SrcOpTypes = Table.TransformColumnTypes(SrcOps, {{"oA", type any}, {"oB", type any}, {"oC", type any}, {"oD", type any}}),

    AddedCustomColumn = Table.AddColumn(SrcArgTypes, "SrcArgs", each SrcOps),
    ExpandedSrcArgs = Table.ExpandTableColumn(AddedCustomColumn, "SrcArgs", {"oA", "oB", "oC", "oD"}, {"oA", "oB", "oC", "oD"}),
    FinalTable = Table.ReorderColumns(ExpandedSrcArgs,{"aA", "oA", "aB", "oB", "aC", "oC", "aD", "oD", "aE"})
in
    FinalTable

第 4 步:让 PQ 将其输出加载到工作表中。然后添加列来标记看起来不合逻辑的方程。如果 Excel 有正则表达式,这会容易得多……但这需要 VBA。相反,我决定仅暴力嵌套

SUBSTITUTE
并寻找不合逻辑的字符串。需要两列:

  1. 不合逻辑的等式列:在不合逻辑的情况下设置 TRUE

    =LET( RemX, SUBSTITUTE([@Proposed], "x", ""), RemY, SUBSTITUTE(RemX, "y", ""), RemZ, SUBSTITUTE(RemY, "z", ""), RemWS, SUBSTITUTE(RemZ, " ", ""), Rem3eq, SUBSTITUTE(RemWS, "===", "="), Rem2eq, SUBSTITUTE(Rem3eq, "==", "="), MarkIllegal, IFERROR(FIND("1=-1", Rem2eq)>0, FALSE), MarkIllegal)

  2. 不合逻辑的关系列:不合逻辑的地方设置 TRUE

    =LET( RemX, SUBSTITUTE([@Proposed], "x", ""), RemY, SUBSTITUTE(RemX, "y", ""), RemZ, SUBSTITUTE(RemY, "z", ""), RemWS, SUBSTITUTE(RemZ, " ", ""), Rem3eq, SUBSTITUTE(RemWS, "===", "="), Rem2eq, SUBSTITUTE(Rem3eq, "==", "="), Rem3lt, SUBSTITUTE(Rem2eq, "<<<", "<"), Rem2lt, SUBSTITUTE(Rem3lt, "<<", "<"), MarkIllegal, IFERROR(FIND("1<-1", Rem2lt)>0, FALSE), MarkIllegal)

  3. 为了使最终过滤/提取变得容易,我添加了第三列,如果任何一个不合逻辑的列为真(仅或那些列),则该列为真。

为了输出最终列表,我使用了 FILTER。前 30 行作为示例:

| Final              |
| ------------------ |
| 1 = x < -1 = y = z |
| 1 = x < -1 = y < z |
| 1 = x < -1 < y = z |
| 1 = x < -1 < y < z |
| 1 < x = -1 = y = z |
| 1 < x = -1 = y < z |
| 1 < x = -1 < y = z |
| 1 < x = -1 < y < z |
| 1 = x < -1 = z = y |
| 1 = x < -1 = z < y |
| 1 = x < -1 < z = y |
| 1 = x < -1 < z < y |
© www.soinside.com 2019 - 2024. All rights reserved.