quarta-feira, 29 de junho de 2022

Como criar gráficos regulares (planares)? A ideia é simples Interligação...

Como criar gráficos regulares (planares) ?

tag: plottinggraphs-and-networkscomputational-geometry

Como criar programaticamente e plotar gráficos planares regulares comk=3,4k=3,4 ou 66 (não hipercubos) e gráficos não planares regulares dek=8k=8 (veja a figura)? Observe que o que importa é a conectividade média, já que nós nas bordas e cantos têm menorkk valores. Existe algum método fácil de fazer isso, ou é preciso escrever sua própria VertexCoordinates função e o método para gerar o gráfico apropriado?

gráficos planares e não planares

Além disso, como criar e plotar gráficos planares aleatórios , onde apenas a conectividade média é fornecida e os nós possivelmente têm conectividade variável. Observe que o Pacote de Geometria Computacional tem alguns meios para lidar com gráficos planares, mas, por exemplo, PlanarGraphPlot só pode fornecer a triangulação de Delaunay do conjunto de dados fornecido. Assim, as arestas não podem ser especificadas para, por exemplo, gráficos superior direito e inferior esquerdo na figura



Meu amigo CP e eu descobrimos essas soluções. O primeiro é CPs 'Aqui vamos nós. Primeiras coisas a saber:

1) A funcionalidade nova Graph[] e relacionada na v8.0.4 é poderosa no sentido de que não apenas cria uma imagem, mas também armazena todas as informações, incluindo as coordenadas do vértice, naquele Graph[] objeto.

2) Há uma GridGraph[...] função que faz exatamente o que foi nomeado

Agora, começando com GridGraph[...] você pode simplesmente adicionar ou remover arestas para obter seus diagramas.

g[m_, n_] :=   GridGraph[{m, n}, VertexSize -> 0.3, VertexStyle -> White,    EdgeStyle -> Black]  edges[m_, n_] :=   Flatten[Table[    If[Mod[j, m] != 0 && (j + m + 1 <= n*m),      UndirectedEdge[j + m + 1, j], {}], {j, 1, n*m}]]  altg[m_, n_] := EdgeAdd[g[m, n], edges[m, n]]  altg[7, 5] 

insira a descrição da imagem aqui

O resto de seus diagramas pode seguir da mesma maneira. Outra forma seria descobrir a fórmula para construção da matriz de adjacência de seus diagramas. Depois é só usar AdjacencyGraph[...].

Mas provavelmente a maneira mais fácil de resolver isso (não necessariamente eficiente) é entender a conexão visual entre seus vértices. Em seguida, conecte os elementos de uma matriz exatamente dessa maneira e nivele a matriz. Você deve ser criativo com as coordenadas do vértice.

mat[m_, n_] := Flatten@Table[{     If[i < m, a[i, j] \[UndirectedEdge] a[i + 1, j], {}],     If[j < n, a[i, j] \[UndirectedEdge] a[i, j + 1], {}],     If[i < m && j < n, a[i, j] \[UndirectedEdge] a[i + 1, j + 1], {}]     }, {i, m}, {j, n}]  g[m_, n_] :=   Graph[mat[m, n],    VertexCoordinates ->     Thread[Sort[VertexList[Graph[mat[m, n]]]] ->       Flatten[Table[{i, j}, {i, m}, {j, n}], 1]], VertexSize -> 0.4,    VertexStyle -> White]  g[7, 5] 

insira a descrição da imagem aqui

===================== ATUALIZAÇÃO ===================

Acabei de perceber que temos alguns dados lindos embutidos para esse tipo de coisas.

SetProperty[GraphData[{"KingsTour", {10, 10}}], {VertexSize -> 0.4,  VertexStyle -> White, EdgeStyle -> Black}] 

insira a descrição da imagem aqui

SetProperty[GraphData[{"KnightsTour", {10, 10}}], {VertexSize -> 0.4,  VertexStyle -> White, EdgeStyle -> Black}] 

insira a descrição da imagem aqui

Ref.: https://pt.answacode.com/mathematica/43/como-criar-graficos-regulares-planares