Jag letar efter ett sätt att skapa ett Hasse-diagram från en given partiell beställ binär relation. Relationen ges uttryckligen, till exempel: Hasse[{{1,2},{2,3},{1,3}}]
, och utdata kommer att vara motsvarande diagram.
Jag har googlat för en lösning , och jag hittade någon lösning, men jag fick inte hur jag skulle använda den. här s vad jag hittade.
Om det finns ett sätt att generera ett Hasse-diagram för en villkorlig partiell orderuppsättning och för en icke-begränsad relation (för det här fallet är jag naturligtvis bara intresserad av ett ungefärligt diagram) skulle jag gärna höra om det också.
Kommentarer
- Vilken del av koden du hänvisade till förstod du inte '?
- Tja, jag förstod inte ' hur jag skulle använda den för mitt syfte. vilket betyder, hur definierar jag förhållandet uttryckligen (som exemplet ovan). verkar det bara tillåter mig att rita en graf endast för villkorlig relation .. ja, jag kunde definiera förhållandet med villkor, men finns det inte ' t något enklare? och ett problem till, jag lekte med det lite, och jag kunde inte hitta ett sätt att ändra etikettstorleken på etiketterna. Jag vill kopiera grafen till ord, och etiketterna måste vara läsbara och inte så små.
- Om du specifikt anger förhållandet mellan noderna ' t är det bara ett diagram då?
- I ' Jag är ledsen, jag ' är ny i Mathematica. Allt som skulle se ut som ett diagram i min beskrivning skulle vara bra. Jag behöver inte ' göra beräkningar på det. Men jag har många grafer att rita, och jag hoppades att det finns en dedikerad funktion för mina behov. om du har en annan lösning är du välkommen att meddela mig .. men kom ihåg att jag ' är ny i Mathematica, så jag ' Jag känner inte till många av de grundläggande metoderna i programmet.
- Välkommen till Mathematica Stack Exchange RB14, jag skickar ett svar inom kort (ja … efter lunch :-))
Svar
I version 10+ kan vi komponera TransitiveReductionGraph och RelationGraph för att få en Hasse-diagramfunktion med tar samma argument och alternativ som RelationGraph
:
ClearAll[hasseF] hasseF = TransitiveReductionGraph @* RelationGraph
Exempel:
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"]
Svara
Jag tycker att det du vill är faktiskt väldigt enkelt (noteras också av @ SjoerdC.deVries i sin kommentar):
Graph[{1 -> 2, 2 -> 3, 3 -> 1}, DirectedEdges -> False, GraphStyle -> "DiagramGold"]
Om du å andra sidan vill utforska fullständiga Hasse-diagram är koden du länkade till en bra start. Demonstrations Project har också några relevanta exempel – det det är alltid en bra idé att söka där.
Gräva djupare, Mathematica inbyggt Combinatorica paket har HasseDiagram
paket. Ta en titt på detta exempel från Documentation kräver
<< Combinatorica` ShowGraph[HasseDiagram[MakeGraph[Subsets[4], #2 \[Intersection] #1 === #1 && #1 != #2 &]]]
För ännu djupare funktionalitet kan du kontakta författare till denna uppsats:
”Ett Mathematica-paket för att klara delvis beställda uppsättningar” , P. Codara
eller hämta den här boken:
Kommentarer
- Om frågaren vill ha ett riktigt Hasse-diagram, vill han säkert ha ett automatiskt sätt att beräkna transitiv reduktion av den riktade grafen som genereras av den binära relationen. Pilarna borde riktas, tror jag, och pilen mellan 1 och 3 borde inte ' inte vara där.
- @JOwen Vet du varför standardrepresentation då är inte riktad? alturl.com/jribp
- Jag ' är inte säker men jag tror att det finns riktad information i kanterna.Det står i länken du skrev att man ska rita " ett linjesegment eller kurva som går uppåt [kursiv i originalet] från x till y när y täcker x (det vill säga när x < y och det finns inget z sådant att x < z < y) "