Nie jestem pewien, czy byłoby rozważyć następujący wzór podejście oparte - ale to działa, a może conceivably zostać przedłużony do wielu wymiarach, chociaż z all3
zbioru danych, to prawdopodobnie KONK się dość wcześnie ...
Chodzi o to, aby rozpocząć z pustą krzyżówka:
blankCW={{_,_,_},{_,_,_},{_,_,_}};
a następnie rekursywnie wykonać następujące czynności: Dla danego wzoru spójrz na ro WS z kolei i (po wypełnieniu któregokolwiek z dokładnie jednym zakończeniu) rozwinąć wzór na wierszu z najmniejszą liczbę meczy:
(* Cache the number of matches for a given pattern *)
nmatch[patt_]:=nmatch[[email protected]][email protected][all3,patt]
(* A helper to fill single matches if needed *)
fixone[ml_,nl_]:=If[FreeQ[ml[[nl]],Verbatim[_]],ml,
ReplacePart[ml, nl->[email protected][all3,ml[[nl]]]]];
findCompletions[m_]:=Module[{nn,ur},
(* Pattern w/ filled single matches -> ur, ordering by # of matches -> nn *)
{ur,nn}=NestWhile[{fixone[#[[1]],[email protected]#[[2]]], [email protected]#[[2]]}&,
{m,Ordering[nmatch/@m]},
(Length[#[[2]]]>0&&[email protected]#[[1,#[[2,1]]]]==1)&];
(* Expand on the word with the fewest number og matches *)
If[Length[nn]==0,{ur},
With[{[email protected]},ReplacePart[ur,n-> #]&/@Cases[all3,ur[[n]]]]]];
Dla danego wzorca kandydującego, wypróbować zakończenie wzdłuż obu wymiarach i zachować jeden, że dają najmniejsza:
findCompletionsOriented[m_]:=Module[{osc},
osc=findCompletions/@Union[{m,[email protected]}];
osc[[[email protected][Length/@osc,1]]]]
zrobić szerokość rekurencji pierwszy, aby móc korzystać z Unią, ale głębokość najpierw może być konieczne dla większych problemów.Wydajność jest więc tak: 8 laptopów minut znaleźć 116568 mecze w przykładzie problemu:
Timing[crosswords=FixedPoint[Union[[email protected]@(findCompletionsOriented/@#)]&,{blankCW}];]
[email protected]
TableForm/@Take[crosswords,5]
Out[83]= {472.909,Null}
Out[84]= 116568
aah aah aah aah aah
Out[86]={ ace ace ace ace ace }
hem hen hep her hes
W zasadzie powinno być możliwe do recurse to do wyższych wymiarów, czyli z użyciem listy krzyżówki zamiast liście słów do Wymiar 3. Jeśli czas dopasowania wzoru do listy jest liniowy na liście, byłby dość powolny w przypadku listy słów o wielkości 100 000+ ...
@ Janus Nice! Czy istnieje łatwy sposób na odcięcie wielu rozwiązań do znalezienia? Chcę zrobić jazdę próbną dla wyższych wymiarów, ale chciałbym ocenić, jak długo może to potrwać pierwszy :) –
@belisarius: Być może najprostszym jest skrócenie listy słów tak, jak robi to Yaroslav? Zwróć też uwagę na rozmiar pamięci podręcznej nmatch: w pewnym momencie zabraknie miejsca :) – Janus
@Janus Problem z tym podejściem polega na tym, że nie będę miał łatwego pojęcia, co stanie się z pełnym zestawem. Ale spróbuję. Dzięki! –