【问题标题】:How to generate all possible (10x10) matrices containing only 0s and 1s, along with other restrictions, for a Graph Theory application如何为图论应用程序生成仅包含 0 和 1 以及其他限制的所有可能 (10x10) 矩阵
【发布时间】:2019-08-06 12:06:22
【问题描述】:

编辑要求 6 并添加新要求
6) 正好 4 列/行的度数必须为 3。
7) 没有两个度数为 3 的顶点彼此相邻。

我的目标:
生成并保存满足特定要求的所有矩阵。然后将每个矩阵与之前手动输入的其他矩阵进行比较,以检查特定的相似性。如果有人认为这会有所帮助,我可以添加更多细节。我相信我已经整理出了代码的比较方面,所以我正在等待矩阵生成部分。我需要为多种尺寸执行此操作,但我将把这个问题集中在 10x10 的情况上。

具体要求:
1) 必须是 10x10 矩阵(表示 10 个顶点上的图)。
2) 必须是对称的(表示邻接矩阵)。
3) 对角线为 0(无循环)。
4) 只有 1 和 0(简单图)。
5) 整个矩阵必须正好有 48 个 1(图有 24 条边)。
6) 每列/行必须有 3 个或 6 个 1(每个节点为 3 或 6 级)。

应用:
我正在调查一个猜想,并相信我已经提出了一个可能的解决方案,可以将猜想分解成更小的部分,并可能证明某些方面。我想用蛮力来证明我的想法是否适用于一个小的特定案例。还具有适当的基本代码可以允许将来修改以测试其他可能的案例或想法。 想法和思考过程:

  • 我使用图表的边缘来手动输入我的比较集。例如:

G9=graph([1 1 1 2 2 3 4 4 4 5 5 6 6 6 6 3 3 9 2 2 2 7 7 8],[2 3 4 3 4 4 5 6 7 6 7 7 3 9 10 9 10 10 7 8 9 8 9 9]);

  • 我认为这是唯一一个符合前面列出的要求的图,直到同构。
  • 我最初的想法是创建满足给定条件的可能矩阵,然后将它们与我的比较集进行比较。我仍然认为这是最好的方法。
  • 我愚蠢地尝试生成随机矩阵,完全忽略了大量的可能性。使用 while 循环,我首先生成了一个满足前四个要求的随机矩阵。然后在单独的嵌套 for 语句中,我使用 numedes() 检查了要求 5,使用 all(mod(degree())) 检查了要求 6。出于几个相当明显的原因,这是一种糟糕的方法,但我在这个过程中学到了很多东西,这让我找到了应该进行最终比较的代码。
  • 这是我第一次使用 Matlab,所以我边走边学。我已经在这个代码上工作了将近 2 周,不知道我想出的是否“好”,但我为自己能够做到的事情感到自豪。我已经到了需要一些外部建议的地步。我愿意接受任何建议和任何程度的帮助。引用源、功能建议、另一种方法或具有“即插即用”代码的完整解决方案将不胜感激。我不回避为实现我的目标而付出的努力。 我很感激任何反馈。

【问题讨论】:

  • 我不是数学家,我不确定您所说的要求 2 是什么意思,但也许可以利用它来减少问题...
  • 我仍在努力缩短计算时间,但与此同时,我认为我至少有 一个 解决方案可以满足您的限制并且不是与您的同构:([1 1 1 2 2 5 3 5 6 3 5 6 7 4 5 6 7 8 4 5 6 7 8 9],[2 3 4 5 6 6 7 7 7 8 8 8 8 9 9 9 9 9 1 0 1 0 1 0 1 0 1 0 1 0]).
  • 如果您有 24 条边,并且所有节点的度数为 3 或 6,则唯一有效的配置是具有 4 个度数为 3 的节点和 6 个度数为 6 的节点。(这是方法之一我加快了我的功能。)但是,您可以在来自 3 级节点的 K_4 子图中有节点。只是不是所有的,除非你被允许有断开的子图。
  • 这让我意识到我并没有限制我的函数只生成连接图。 :)
  • 我基本上是在使用蛮力/回溯来仅生成有效的图形并进行了一些优化。首先,我们知道对于 10 个节点的情况,我们需要 4 个度数为 3 的节点和 6 个度数为 4 的节点。我将节点 1-4 的度数固定为 3,将节点 5-10 的度数固定为 4,因为任何具有不同分布的图都与我的图同构。其次,我认为与下面的@peterfranciscook's answer 类似,在为行/列p 选择组合后,问题将简化为n-p 节点的较小图。

标签: matlab matrix while-loop graph-theory adjacency-matrix


【解决方案1】:

如果您想暴力破解它,您有 3773655750150 种可能的配置来测试 3 或 6 连接。我认为您可能需要更强大的数学(波利亚枚举定理?或我可能忘记的其他组合定理)来解决这个问题。

edit:这种递归解决方案受到更多限制,很可能在下个世纪完成。

E = containers.Map('KeyType', 'int32', 'ValueType', 'any');
for k = 0:9
    E(k) = [];
end

foo(E, 3, 0);
foo(E, 6, 0);

function E = foo(E, D, n)
    % E : graph edges (map)
    % D : degree (3 or 6)
    % n : current node

    if (n == 9)
        e_degree = cellfun(@length,E.values);
        if all(e_degree) && all(~mod(e_degree,3))
            print_E(E)
        end
        return
    end

    e = E(n); % existing edges
    m = setdiff((n+1:9), e); % candidate new edges
    K = D - length(e);
    % if too many edges, return early
    if (K < 0)
        return
    end
    C = combnk(m, K);

    N = size(C, 1);
    for k = 1:N


        c = C(k,:);
        E(n) = unique([e, c]);

        for kv = 1:K
            v = c(kv);
            E(v) = unique([E(v), n]);
        end

        % down the rabbit hole
        E = foo(E, D, n + 1);

        for D = 3:3:6
            E = foo(E, D, n + 1);
        end

        % remove edges added in this loop
        E(n) = setdiff(E(n), c);
        for kv = 1:K
            v = c(kv);
            E(v) = setdiff(E(v), n);
        end

    end

end

function print_E(E)
    for k = 0:9
        fprintf('%i: ',k);
        fprintf('%i ', E(k));
        fprintf('\n');
    end
    fprintf('\n');
end

【讨论】:

  • 3773655750150 可能的配置是 (nC2)Cm。这考虑了 n 个顶点和 m 个边上的所有标记连接图。我的限制大大减少了可能性的数量。由于每个矩阵都是对称且简单的,我只需要考虑一个三角形减去对角线。度数约束进一步降低了可能性。此外,我可以将我的图限制为同构类,这减少了可能性,因为我可以专注于未标记的图。这个数字仍然很大,但更现实。我将编辑我的问题以解决更多信息。
  • @James 我已经将 3773655750150 写为 45C24 假设组合仅在上三角矩阵上。我昨晚想了想,想出了这个递归解决方案,它应该运行得更快,但可能会返回旋转/平移/对称图形。最坏情况(9C3 + 9C6) * (8C3 + 8C6) * (7C3 + 7C6) * (6C3 + 1) * (5C3) * (4C3) 评估,这是对我之前的阶乘算法的改进。
  • 我一直在玩这个,我似乎无法改进它。它打印每个顶点的度数 mod 3 的每个边集,即使它没有正好 24 条边。它还多次打印相同的边缘集。如何将边集限制为正好 24 个边,并且在打印/存储边集之前检查同构?我有一个上面列出的有效边集,如果我可以在代码将新边集标记为有效之前使用 isisomorphic() 会有所帮助。
  • @James 我会再玩一些。发布最后一次更新后,我得到了一个稍微快一点的方法。有趣的问题
  • 确实如此。这实际上只是值 4 的问题的一种情况。我已经概括了这个问题,并且确切地知道有多少顶点是可能的、边、具有特定总和的列的确切数量、图中有多少分离顶点,以及每个大于 3 的值都有几个其他属性。在工作代码中应用这些信息与概括问题一样困难。
猜你喜欢
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多