| Frühere | Chronologischer Index | Spätere | ||
| Vorherige | Thematischer Index | Nächste |
Hallo allerseits,ordf[] wird effizient, wenn man die angesehene Ordnung als Argument übergibt und innert ordf[] einen Indexvergleich (Less[]) verwenden kann.
Clear[edgs]edgs[n_] := With[{r = Range[n], p1 = RandomPermutation[n], p2 = RandomPermutation[n]}, DeleteCases[Transpose[{PermutationReplace[r, p1], PermutationReplace[r, p2]}], {x_Integer, x_Integer}]
]
Clear[chainIt]
chainIt[l_List?MatrixQ] := l /; Length[l] == 1
chainIt[l_List?MatrixQ] := Block[{r = {l[[1]]}, l0 = Rest[l], x},
While[Length[l0] > 0,
x = Select[l0, #[[1]] == r[[-1, 2]] &];
If[Length[x] == 0,
(* l has a subcycle *)
r = Join[r, chainIt[l0]];
l0 = {}, (* else *)
r = Join[r, x];
l0 = Complement[l0, x]
]
];
r
] /; Length[l] > 1 && (Complement @@ Transpose[l]) === {} &&
Length[Union[Flatten[l]]] == Length[l] && FreeQ[Dot[{1, -1},
Transpose[l]], 0]
chainIt[last_List?VectorQ, l_List?MatrixQ] := Block[{cIt = chainIt[l]},
RotateRight[cIt, Length[l] - Position[cIt, last][[1, 1]]]
] /; MemberQ[l, last] && (Complement @@ Transpose[l]) === {} &&
Length[Union[Flatten[l]]] == Length[l] && FreeQ[Dot[{1, -1},
Transpose[l]], 0]
Clear[ordf](* ordf is only efficient if the ordered list is an argument to it. That goes for rather short finite lists. *)
ordf[ordl_List?MatrixQ, l1_List?VectorQ, l2_List?VectorQ] :=
Block[{idx1, idx2},
idx1 = Position[ordl, l1];
idx2 = Position[ordl, l2];
If[idx1 === {} || idx2 === {},
False, (* else *)
idx1[[1, 1]] < idx2[[1, 1]]
]
] /; Cases[Partition[ordl, 2, 1, -1], #[[1, 2]] != #[[2, 1]] &] ===
{} && Dimensions[{l1, l2}] == {2, 2}
In[67]:= ed60 = edgs[60]
Out[67]= {{50, 58}, {24, 17}, {35, 15}, {55, 34}, {51, 36}, {42,
8}, {5, 37}, {7, 26}, {15, 59}, {56, 27}, {54, 20}, {26, 9}, {3,
31}, {9, 44}, {32, 14}, {40, 38}, {37, 52}, {36, 5}, {27, 46}, {58,
23}, {11, 33}, {49, 54}, {48, 1}, {53, 39}, {12, 51}, {29, 22}, {57,
2}, {59, 43}, {46, 21}, {45, 28}, {21, 53}, {60, 56}, {14,
18}, {31, 29}, {38, 50}, {13, 60}, {44, 48}, {47, 12}, {22, 42}, {8,
24}, {52, 55}, {10, 16}, {30, 57}, {20, 30}, {41, 49}, {28,
47}, {39, 11}, {2, 45}, {33, 10}, {16, 7}, {34, 13}, {1, 32}, {23,
25}, {25, 3}, {18, 40}, {17, 41}, {43, 35}}
In[75]:= ed60[[31]]
Out[75]= {21, 53}
In[77]:= chainIt[ed60[[31]], ed60] == SortBy[ed60, Identity,
ordf[chainIt[ed60[[31]], ed60], #1, #2] &]
Out[77]= Trueein Fall, in dem der Vorteil der funktionalen Schreibweise wg. der Eigenheiten einer Ordnungsfunktion nicht ins Auge fällt. Man kann nun dieselben Bildchen fertigen, nur grösser;
With[{ed = ed60,
edo = chainIt[ed60[[31]], ed60]},
MatrixPlot[Outer[ordf[edo, #1, #2] &, ed, ed, 1],
ColorRules -> {False -> Pink, True -> Green},
Frame -> True, Mesh -> True,
FrameTicks -> {Transpose[{Range[Length[ed]], ed}],
Transpose[{Range[Length[ed]], ed}]},
FrameLabel -> {{None, "#2"}, {None, "#1"}},
PlotLabel -> "Last = " <> ToString[Last[edo]]
]
]
gibt ordg-21-51.jpg und
With[{ed = Transpose[ed60][[1]],
edo = Sort[Transpose[ed60][[1]]]},
MatrixPlot[Outer[Less, ed, ed, 1],
ColorRules -> {False -> Pink, True -> Green},
Frame -> True, Mesh -> True,
FrameTicks -> {Transpose[{Range[Length[ed]], ed}],
Transpose[{Range[Length[ed]], ed}]},
FrameLabel -> {{None, "#2"}, {None, "#1"}},
PlotLabel -> "Last = " <> ToString[Last[edo]]
]
]
gibt less-60.jpg, die Ordnungsfunktion Less[] auf einem gemischten
Range[60]. Beide Matrizen sind miteinander äquivalent.
Grüsse Udo. Am 17.11.2019 um 14:21 schrieb Susanne & Udo Krause:
ordf[x_Integer, ed_List?MatrixQ, l1_List, l2_List] := Block[{bRes = False, l3 }, If[(l1[[2]] == l2[[1]]) && (l1[[2]] != x), bRes = True,(* else "*) If[l1[[2]] != x, l3 = Select[ed, #[[1]] == l1[[2]] &][[1]]; While[l3 != l2 && Length[l3] > 0, If[(l3[[2]] == l2[[1]]) && (l3[[2]] != x), bRes = True; Break[], (* else *) If[l3[[2]] == x, Break[], (* else *) l3 = Select[ed, #[[1]] == l3[[2]] &][[1]] ] ] ] ] ]; bRes ] zuf[x_Integer, l1_List, l2_List] := If[(l1[[2]] != x) && RandomInteger[{0, 1}] == 1, True, False]Fazit: mit einer Ordnungsrelation funktioniert SortBy[m, Identity, ordf], jedoch ist das prozedurale Vorgehen (ohne Vorauswahl eines letzten Elements) wesentlich effizienter, da es das Ergebnis direkt herstellt, solange man nicht bei ordf[] eine bessere Idee hat als die hier verwendete.
ordf-21-53.jpg
Description: JPEG image
less-60.jpg
Description: JPEG image
_______________________________________________ DMUG Deutschsprachiges Mathematica-Forum demug@XXXXXXX.ch http://www.mathematica.ch/mailman/listinfo/demug Archiv: http://www.mathematica.ch/archiv.html
| Frühere | Chronologischer Index | Spätere | ||
| Vorherige | Thematischer Index | Nächste |
DMUG-Archiv, http://www.mathematica.ch/archiv.html