Estou procurando uma maneira de criar um Diagrama de Hasse a partir de uma determinada parcial relação binária de ordem. A relação será dada explicitamente, por exemplo: Hasse[{{1,2},{2,3},{1,3}}], e a saída será o gráfico correspondente.

Eu pesquisei uma solução , e encontrei alguma solução, mas não entendi como usá-la .. aqui “está o que encontrei.

Se houver uma maneira de gerar um diagrama de Hasse para um conjunto condicional de ordem parcial e para uma relação não finita (claro, neste caso estou apenas interessado em um diagrama aproximado), ficaria feliz em ouvir sobre isso também.

Comentários

  • Qual parte do código a que você se referiu não ' você entendeu?
  • Bem, eu não ' não entendi como usá-lo para meu propósito. ou seja, como faço para definir a relação explicitamente (como o exemplo acima). parece que só me permite desenhar um gráfico apenas para relação condicional … bem, eu poderia definir a relação com condição, mas não ' há algo mais simples? e mais um problema, brinquei um pouco com isso e não consegui encontrar uma maneira de mudar o tamanho da fonte dos rótulos .. Quero copiar o gráfico para o word, e os rótulos devem ser legíveis, e não tão pequenos.
  • Se você especificar as relações entre os nós explicitamente não ' é apenas um gráfico, então?
  • I ' desculpe, ' sou novo no Mathematica. Qualquer coisa que se pareça com um gráfico da minha descrição seria adequado. Eu não ' não preciso fazer cálculos nele. Mas tenho muitos gráficos para desenhar e espero que haja uma função dedicada às minhas necessidades. se você tiver outra solução, sinta-se à vontade para me avisar … mas lembre-se de que eu ' sou novo no Mathematica, então ' Não estou familiarizado com muitos dos métodos básicos do programa.
  • Bem-vindo ao Mathematica Stack Exchange RB14, postarei uma resposta em breve (bem … depois do almoço :-))

Resposta

Nas versões 10+, podemos compor TransitiveReductionGraph e RelationGraph para obter uma função de diagrama de Hasse usa os mesmos argumentos e opções de RelationGraph:

ClearAll[hasseF] hasseF = TransitiveReductionGraph @* RelationGraph 

Exemplos:

hasseF[SubsetQ, Subsets[Range[4]], VertexShapeFunction -> "Name"] 

insira a descrição da imagem aqui

substringQ[s1_, s2_] := UnsameQ[s1 , s2] && StringMatchQ[s1, ___ ~~ s2 ~~ ___] hasseF[substringQ, {"a", "b", "c","ab", "ac","abc", "abcd"}, VertexShapeFunction -> "Name"] 

insira a descrição da imagem aqui

Resposta

Eu acho que o que você quer é realmente muito simples (também observado por @ SjoerdC.deVries em seu comentário):

Graph[{1 -> 2, 2 -> 3, 3 -> 1}, DirectedEdges -> False, GraphStyle -> "DiagramGold"] 

insira a descrição da imagem aqui

Se, por outro lado, você “quiser explorar os diagramas de Hasse completos, o código ao qual vinculou é um bom começo. Além disso, o Projeto de Demonstrações tem alguns exemplos relevantes – ele é sempre uma boa ideia pesquisar lá.

Indo mais fundo, o pacote embutido do Mathematica Combinatorica possui o pacote HasseDiagram. Dê uma olhada em este exemplo da Documentação requer

<< Combinatorica` ShowGraph[HasseDiagram[MakeGraph[Subsets[4], #2 \[Intersection] #1 === #1 && #1 != #2 &]]] 

insira a descrição da imagem aqui

Para uma funcionalidade ainda mais detalhada, você pode entrar em contato autores deste artigo:

“Um pacote do Mathematica para lidar com conjuntos parcialmente ordenados” , P. Codara

ou obtenha este livro:

“Computational Discrete Mathematics: Combinatorics and Graph Theory with Mathematica” , Sriram Pemmaraju, Steven Skiena

Comentários

  • Se o autor da pergunta deseja um diagrama de Hasse verdadeiro, certamente deseja uma forma automática de calcular a redução transitiva do gráfico direcionado gerado pela relação binária. As setas devem ser direcionadas, eu acho, e a seta entre 1 e 3 não deve ' estar lá.
  • @JOwen Você sabe por que a representação padrão então é não dirigido? alturl.com/jribp
  • Eu ' não tenho certeza, mas acho que há direcional informações nas bordas.Diz no link que você postou que deve-se desenhar " um segmento de linha ou curva que vai para cima [itálico no original] de x para y sempre que y cobrir x (ou seja, sempre x < y e não há z tal que x < z < y) "

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *