Autor Beitrag
Fiete
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 484
Erhaltene Danke: 183

W7
Delphi 6 pro
BeitragVerfasst: Di 31.05.16 14:12 
Das Programm generiert Eulerquadrate ungerader Ordnung(3 - 29), die Ansicht erfolgt in Textform oder grafisch.
EulerScreen
Ein eulersches Quadrat oder griechisch-lateinisches Quadrat der Ordnung n besteht aus der Superposition zweier orthogonaler lateinischer Quadrate der Ordnung n.
Der Begriff griechisch-lateinisches Quadrat stammt aus früheren Zeiten, als die Elemente der einen Matrix mit griechischen, die der anderen mit lateinischen Buchstaben bezeichnet wurden.
In meiner Version habe ich Groß- und Kleinbuchstaben gewählt.
Zwei lateinische Quadrate werden als orthogonal bezeichnet, wenn jedes der in entsprechenden Zellen auftretende geordnete
Paar genau einmal auftritt.
Beispiel für orthogonale Quadrate der Ordnung 3:

ABC acb Aa Bc Cb
BCA bac Bb Ca Ac
CAB cba Cc Ab Ba

Algorithmus:
Die Großbuchstaben werden zyklisch zeilenweise nach links verschoben,
die Kleinbuchstaben werden zyklisch spaltenweise nach unten verschoben.

Solche Quadrate spielen in der statistischen Versuchsplanung (design of experiments, DOE) eine Rolle.
Bei einem Versuchsplan hat man eine bestimmte Anzahl von Faktoren, die unabhangigen Variablen.
Diese liegen in verschiedenen Stufungen vor, die sich i. Allg. in Abhängigkeit vom jeweiligen
Faktor unterscheiden können. Interessiert ist man an einer abhängigen Variablen, welche
in Abhängigkeit von den Faktoren gemessen bzw. bestimmt wird. Hierbei kann es
sich z. B. um die Konzentrationsfähigkeit von Versuchspersonen in Abhängigkeit ihrer
Ernährung oder ihrer körperlichen Aktivitäten handeln oder die Arbeitsleistung
in Abhängigkeit von Umweltvariaben (z. B. Lärm, Temperatur, Beleuchtung und Luftfeuchtigkeit).
Einloggen, um Attachments anzusehen!
_________________
Fietes Gesetz: use your brain (THINK)
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1620
Erhaltene Danke: 225

WIN7,PuppyLinux
FreePascal,Lazarus,TurboDelphi
BeitragVerfasst: Mi 01.06.16 18:29 
Hallo,

der Zufall war mir dann nicht zufällig genug ;-)
Ich nehme das erzeugte Standard Lateinquadrat und bei Bedarf mische ich alle Zeilen und darauf alle Spalten von Matrix-G/L und setzte sie dann erst zu MatrixE zusammen.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
function TEulerQU.Zufall(L, Art: integer): string;
// Mischt erst alle Zeilen und anschliessend alle Spalten
var
  K, WO: integer;
  tmp, Idx: integer;
  Mix: array[1..29of integer;
  TmpChar: UnicodeChar;
begin
  for K := 1 to L do
    Mix[k] := k;
  for k := L downto 2 do
  begin
    //fisher yates shuffle
    Idx := Random(k) + 1;
    tmp := Mix[idx]; Mix[idx] := Mix[k];Mix[k] := tmp;
    //Zeilentausch
    for Wo := 1 to L do
    begin
      TmpChar := MatrixG[Wo, tmp];
      MatrixG[Wo, tmp] := MatrixG[Wo, K];
      MatrixG[Wo, K] := TmpChar;

      TmpChar := MatrixL[Wo, tmp];
      MatrixL[Wo, tmp] := MatrixL[Wo, K];
      MatrixL[Wo, K] := TmpChar;
    end;
  end;

  for K := 1 to L do
    Mix[k] := k;
  for k := L downto 2 do
  begin
    Idx := Random(k) + 1;
    tmp := Mix[idx]; Mix[idx] := Mix[k];Mix[k] := tmp;
    //Spaltentausch
    for Wo := 1 to L do
    begin
      TmpChar := MatrixG[tmp, Wo];
      MatrixG[tmp, Wo] := MatrixG[K, Wo];
      MatrixG[K, Wo] := TmpChar;

      TmpChar := MatrixL[tmp, Wo];
      MatrixL[tmp, Wo] := MatrixL[K, Wo];
      MatrixL[K, Wo] := TmpChar;
    end;
  end;
end;

procedure TEulerQU.StartClick(Sender: TObject);
var
  N, K, L: integer;
  TeilG, TeilK: string;
begin
  N := StrToInt(Anzahl.Text);
  TeilG := copy(Gross, 1, N);
  TeilK := copy(Klein, 1, N);

  for K := 1 to N do
  begin
    // speichern in Latein und Griechisch
    for L := 1 to N do
    begin
      MatrixL[L, K] := TeilG[L];
      MatrixG[K, L] := TeilK[L];
    end;
    // rotieren
    TeilG := copy(TeilG, 2, N - 1) + TeilG[1];
    TeilK := TeilK[N] + copy(TeilK, 1, N - 1);
  end;
  LateinGriechisch.Selection := TGridRect(Rect(-1, -1, -1, -1)); // blaues Feld weg
  if ABCzufaellig.Checked then
    Zufall(L, 0);
  for K := 1 to N do
    for L := 1 to N do
    begin
      MatrixE[L, K] := MatrixL[L, K] + MatrixG[L, K];
      LateinGriechisch.Cells[L - 1, K - 1] := MatrixE[L, K];
    end;
  Farbig.Repaint;
end;

Vorher
ZufallAlt
Nachher
ZufallNeu

Gruß Horst
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Fiete
Fiete Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 484
Erhaltene Danke: 183

W7
Delphi 6 pro
BeitragVerfasst: Do 02.06.16 10:34 
Moin Horst_H,
die Diagonalen haben Dich wohl gestört :wink: , mich übrigens auch!
Deine Zufallsvariante hat ihren Namen wirklich verdient.
Jetzt fehlt nur noch eine Erweiterung auf gerade Ordnungen.
Habe es rekursiv versucht, die Rechenzeit ist schon bei N=8 enorm.
Eine kleine Denksportaufgabe an alle Interessierten.
Gruß Fiete

_________________
Fietes Gesetz: use your brain (THINK)