Sto cercando un modo per creare un diagramma di Hasse da un dato parziale relazione binaria dellordine. La relazione verrà data esplicitamente, ad esempio: Hasse[{{1,2},{2,3},{1,3}}]
, e loutput sarà il grafico corrispondente.
Ho cercato su Google una soluzione e ho trovato una soluzione, ma non ho capito come usarla .. ecco cosa ho trovato.
Se cè un modo per generare un diagramma di Hasse per un insieme di ordini parziali condizionati e per una relazione non finita (ovviamente, per questo caso mi interessa solo un diagramma approssimativo), sarei felice di sentirlo anche.
Commenti
- Quale parte del codice a cui hai fatto riferimento non ' hai capito?
- Beh, non ' non ho capito come usarlo per il mio scopo. Cioè, come definisco esplicitamente la relazione (come nellesempio sopra). sembra che mi permetta solo per disegnare un grafico solo per la relazione condizionale .. beh potrei definire la relazione con condizione, ma ' non cè qualcosa di più semplice? e un altro problema, ci ho giocato un po e non sono riuscito a trovare un modo per cambiare la dimensione del carattere delle etichette .. Voglio copiare il grafico in parola, e le etichette devono essere leggibili, e non così piccole.
- Se si specifica esplicitamente che le relazioni tra i nodi non sono ' è solo un grafico, allora?
- I ' Mi dispiace, ' sono nuovo in Mathematica. Qualunque cosa assomigli a un grafico della mia descrizione andrebbe bene. Non ' non ho bisogno di calcolarlo. Ma ho molti grafici da disegnare e speravo ci fosse una funzione dedicata alle mie esigenze. se hai unaltra soluzione, non esitare a farmelo sapere .. ma tieni presente che ' sono nuovo di Mathematica, quindi ' Non ho familiarità con molti dei metodi di base del programma.
- Benvenuto in Mathematica Stack Exchange RB14, posterò una risposta a breve (beh … dopo pranzo :-))
Answer
Nelle versioni 10+, possiamo comporre TransitiveReductionGraph e RelationGraph per ottenere una funzione diagramma di Hasse con accetta gli stessi argomenti e opzioni di RelationGraph
:
ClearAll[hasseF] hasseF = TransitiveReductionGraph @* RelationGraph
Esempi:
hasseF[SubsetQ, Subsets[Range[4]], VertexShapeFunction -> "Name"]
substringQ[s1_, s2_] := UnsameQ[s1 , s2] && StringMatchQ[s1, ___ ~~ s2 ~~ ___] hasseF[substringQ, {"a", "b", "c","ab", "ac","abc", "abcd"}, VertexShapeFunction -> "Name"]
Risposta
Penso che quello che vuoi sia in realtà molto semplice (notato anche da @ SjoerdC.deVries nel suo commento):
Graph[{1 -> 2, 2 -> 3, 3 -> 1}, DirectedEdges -> False, GraphStyle -> "DiagramGold"]
Se, daltra parte, desideri esplorare i diagrammi di Hasse con funzionalità complete, il codice a cui ti sei collegato è un buon inizio. Anche il progetto Demonstrations ha alcuni esempi pertinenti – it è sempre una buona idea cercare lì.
Scavando più a fondo, Mathematica costruito nel pacchetto Combinatorica ha il pacchetto HasseDiagram
. Dai unocchiata a questo esempio da Documentazione richiede
<< Combinatorica` ShowGraph[HasseDiagram[MakeGraph[Subsets[4], #2 \[Intersection] #1 === #1 && #1 != #2 &]]]
Per funzionalità ancora più approfondite potresti contattare autori di questo articolo:
“Un pacchetto Mathematica per far fronte a insiemi parzialmente ordinati” , P. Codara
o scarica questo libro:
Commenti
- Se il richiedente vuole un vero diagramma di Hasse, sicuramente vuole un modo automatico per calcolare la riduzione transitiva del grafo diretto generato dalla relazione binaria. Le frecce dovrebbero essere dirette, credo, e la freccia tra 1 e 3 non dovrebbe ' essere lì.
- @JOwen Sai perché la rappresentazione standard è non diretto? alturl.com/jribp
- ' non ne sono sicuro ma penso che ci sia una direzione informazioni nei bordi.Nel link che hai pubblicato cè scritto che si dovrebbe disegnare " un segmento di linea o una curva che va verso lalto [corsivo nelloriginale] da x a y ogni volta che y copre x (cioè, ogni volta che x < y e non cè z tale che x < z < y) "