Szukam sposobu na utworzenie diagramu hasse z podanego fragmentu kolejność relacji binarnych. Relacja zostanie podana jawnie, na przykład: Hasse[{{1,2},{2,3},{1,3}}]
, a wynikiem będzie odpowiedni wykres.
Wyszukałem w Google rozwiązanie , i znalazłem jakieś rozwiązanie, ale nie udało mi się go użyć. tutaj ” to, co znalazłem.
Jeśli istnieje sposób na wygenerowanie diagramu Hassego dla warunkowego zbioru częściowego porządku i dla relacji nieskończonej (oczywiście, w tym przypadku interesuje mnie tylko diagram przybliżony), z przyjemnością o tym usłyszę też.
Komentarze
- Która część kodu, o której mowa, nie ' rozumiesz?
- Cóż, nie ' nie rozumiem, jak go używać do swoich celów. co oznacza, jak wyraźnie zdefiniować relację (jak w powyższym przykładzie). wydaje się, że tylko mi pozwala narysować wykres tylko dla relacji warunkowej… no cóż, mógłbym zdefiniować relację z warunkiem, ale czy nie ' czy jest coś prostszego? i jeszcze jeden problem, trochę się tym bawiłem i nie mogłem znaleźć sposobu na zmianę rozmiaru czcionki na etykietach .. Chcę skopiować wykres do słowa, a etykiety muszą być czytelne, a nie takie małe.
- Jeśli wyraźnie określisz relacje między węzłami, czy nie jest to ' czy to tylko wykres?
- I ' przepraszam, ' jestem nowy w Mathematica. Wszystko, co wyglądałoby jak wykres mojego opisu, byłoby w porządku. Nie ' nie muszę wykonywać na nim obliczeń. Ale mam dużo wykresów do narysowania i mam nadzieję, że istnieje funkcja dedykowana dla moich potrzeb. jeśli masz inne rozwiązanie, daj mi znać … ale pamiętaj, że ' jestem nowy w Mathematica, więc ' Nie znam wielu podstawowych metod programu.
- Witaj w Mathematica Stack Exchange RB14, wkrótce odpowiem (no … po obiedzie :-))
Odpowiedź
W wersjach 10+ możemy tworzyć TransitiveReductionGraph i RelationGraph , aby uzyskać funkcję diagramu Hassego, przy czym przyjmuje te same argumenty i opcje, co RelationGraph
:
ClearAll[hasseF] hasseF = TransitiveReductionGraph @* RelationGraph
Przykłady:
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"]
Odpowiedź
Myślę, że to, czego chcesz, jest w rzeczywistości bardzo proste (również odnotowane przez @ SjoerdC.deVries w swoim komentarzu):
Graph[{1 -> 2, 2 -> 3, 3 -> 1}, DirectedEdges -> False, GraphStyle -> "DiagramGold"]
Jeśli, z drugiej strony, chciałbyś poznać pełne funkcjonalne Diagramy Hasse, kod, do którego prowadzi łącze, to dobry start. Projekt demonstracyjny zawiera również kilka odpowiednich przykładów – to jest zawsze dobrym pomysłem, aby tam przeszukać.
Zagłębiając się głębiej, Mathematica wbudowana w pakiet Combinatorica ma pakiet HasseDiagram
. Spójrz na ten przykład z Dokumentacji wymaga
<< Combinatorica` ShowGraph[HasseDiagram[MakeGraph[Subsets[4], #2 \[Intersection] #1 === #1 && #1 != #2 &]]]
Aby uzyskać jeszcze bardziej szczegółowe informacje, skontaktuj się z nami autorzy tego artykułu:
„Pakiet Mathematica radzący sobie z częściowo uporządkowanymi zestawami” , P. Codara
lub pobierz tę książkę:
Komentarze
- Jeśli pytający chce prawdziwego diagramu Hassego, z pewnością chce automatycznego sposobu obliczania przechodnia redukcja skierowanego wykresu generowanego przez relację binarną. Myślę, że strzałki powinny być skierowane, a strzałka między 1 a 3 nie powinna ' nie tam być.
- @JOwen Czy wiesz, dlaczego w takim razie standardowa reprezentacja jest nie skierowany? alturl.com/jribp
- Nie ' nie mam pewności, ale myślę, że jest kierunek informacje na krawędziach.W zamieszczonym przez Ciebie linku jest napisane, że należy narysować " odcinek linii lub krzywą, która biegnie w górę [zapisana kursywą w oryginale] od x do y, ilekroć y obejmuje x (to znaczy zawsze, gdy x < y i nie ma takiego z, że x < z < y) "