Je « cherche un moyen de créer un Diagramme Hasse à partir dun partiel donné order relation binaire. La relation sera donnée explicitement, par exemple: Hasse[{{1,2},{2,3},{1,3}}]
, et le résultat sera le graphique correspondant.
Jai cherché une solution sur Google , et jai trouvé une solution, mais je nai pas compris comment lutiliser. voici ce que jai trouvé.
Sil existe un moyen de générer un diagramme de Hasse pour un ensemble dordre partiel conditionnel, et pour une relation non finie (bien sûr, pour ce cas je ne suis intéressé que par un diagramme approximatif), je serais heureux den entendre parler
Commentaires
- À quelle partie du code vous avez fait référence ' navez-vous pas compris?
- Eh bien, je nai ' pas compris comment lutiliser dans mon but. ce qui signifie, comment définir la relation explicitement (comme dans lexemple ci-dessus). semble que ça me permet seulement tracer un graphe uniquement pour la relation conditionnelle .. eh bien je pourrais définir la relation avec la condition, mais nest-ce pas ' quelque chose de plus simple? et un autre problème, jai joué un peu avec, et je nai pas trouvé un moyen de changer la taille de la police des étiquettes .. Je veux copier le graphique en mot, et les étiquettes doivent être lisibles, et pas si petites.
- Si vous spécifiez explicitement les relations entre les nœuds nest ' quun graphe alors?
- I ' je suis désolé, ' je suis nouveau dans Mathematica. Tout ce qui ressemblerait à un graphique de ma description conviendrait. Je nai ' pas besoin de faire des calculs là-dessus. Mais jai beaucoup de graphiques à dessiner, et jespérais quil y avait une fonction dédiée à mes besoins. si vous avez une autre solution, nhésitez pas à me le faire savoir .. mais gardez à lesprit que je ' suis nouveau dans Mathematica, donc je ' Je ne connais pas beaucoup de méthodes de base du programme.
- Bienvenue dans Mathematica Stack Exchange RB14, je publierai une réponse sous peu (enfin … après le déjeuner :-))
Réponse
Dans les versions 10+, nous pouvons composer TransitiveReductionGraph et RelationGraph pour obtenir une fonction de diagramme de Hasse avec prend les mêmes arguments et options que RelationGraph
:
ClearAll[hasseF] hasseF = TransitiveReductionGraph @* RelationGraph
Exemples:
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"]
Réponse
Je pense que ce que vous voulez est en fait très simple (également noté par @ SjoerdC.deVries dans son commentaire):
Graph[{1 -> 2, 2 -> 3, 3 -> 1}, DirectedEdges -> False, GraphStyle -> "DiagramGold"]
Si, par contre, vous « souhaitez explorer les diagrammes Hasse complets, le code auquel vous avez lié est un bon début. Le projet de démonstration contient également quelques exemples pertinents – il est toujours une bonne idée de chercher là-bas.
En creusant plus profondément, Mathematica construit dans le package Combinatorica a le package HasseDiagram
. Jetez un œil à cet exemple de la documentation nécessite
<< Combinatorica` ShowGraph[HasseDiagram[MakeGraph[Subsets[4], #2 \[Intersection] #1 === #1 && #1 != #2 &]]]
Pour des fonctionnalités encore plus approfondies, vous pouvez contacter auteurs de cet article:
« Un package Mathematica pour faire face à des ensembles partiellement ordonnés » , P. Codara
ou procurez-vous ce livre:
Commentaires
- Si le demandeur veut un vrai diagramme de Hasse, il veut sûrement un moyen automatique de calculer la réduction transitive du graphe orienté généré par la relation binaire. Les flèches devraient être dirigées, je pense, et la flèche entre 1 et 3 ne devrait pas ' être là.
- @JOwen Savez-vous pourquoi la représentation standard est alors pas dirigé? alturl.com/jribp
- Je ' je ne suis pas certain mais je pense quil y a une direction informations dans les bords.Il indique dans le lien que vous avez posté quil faut dessiner " un segment de ligne ou une courbe qui monte [en italique dans loriginal] de x à y chaque fois que y couvre x (cest-à-dire chaque fois x < y et il ny a pas de z tel que x < z < y) "