Autor Beitrag
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Do 27.11.08 14:26 
Hallo,

das glaube ich ja nun garnicht.
Mein erster Versuch dauerte auf meinen Notebooki 2253 ms/44804 Versuche , der zweite 3225 ms/79035 dann 14891 ms/449245 Versuche

Schau Dir doch mal Programme für Sudoku an, das ja sehr ähnliche Belegungsregeln hat, und deren zufällige Belegung anschaust.
Da wird der Zufall nur einmal pro Zelle eingesetzt. Dazu muss man aber für jede Spalte und Zeile buchführen.
Also für jede Zeile/Spalte ein Feld der möglichen Zahlen.
Für jedes Feld (ze,sp):
Schnittmenge aus möglicheZe(ze) und möglicheSp(sp) bilden.
dabei Anzahl ermmitteln
Per Zufall eine von 1 bis Anzahl auswählen
Diese aus mögliche(ze) und mögliche(sp) entfernen und Feld(ze,sp]) damit belegen.
Da braucht man nicht wie jetzt bei n=32 nicht 2e5 Fehlversuche, sondern nur 32x32=1024 Versuche.

Gruß Horst
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Do 27.11.08 15:08 
Hallo,

apropos mehrere Prozessorkerne.
Jeder Prozessorkern kann an Zeile/Spalte arbeitem die nicht von einem anderen beackert wird.
Zwei Cpu-Kernen und einem Quadrat 32x32
CPU_0: Zeile 1..16 und Spalte 1..16
zeitgleich:
CPU_1: Zeile 17..32 und Spalte 17..32.

wenn beide zeilenweise vorgehen
Dann kann z.B CPU_0 mit Zeile 17 weitzermachen, wenn CPU_1 damit schon fertig ist.
umgekehrt CPU_1 mit Zeile 1 weitzermachen, wenn CPU_0 damit schon fertig ist.

Das heisst jede CPU erhält ihren konstanten Spaltenbereich mit Breite n/Cpu_Anzahl, aber startet um n/Cpu_Anzahl versetzt.
Wenn alle CPU's fast gleich schnell sind ist es auch Cpu_Anzahl-fach schneller.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Schritt 1
0000xxxx
xxxxxxxx
xxxxxxxx
xxxxxxxx
xxxx1111
xxxxxxxx
xxxxxxxx
xxxxxxxx


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Schritt 2
0000xxxx
0000xxxx
xxxxxxxx
xxxxxxxx
xxxx1111
xxxx1111
xxxxxxxx
xxxxxxxx


..
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Schritt 5 Cpu_0 war anderweitig beschäftigt
CPU_1 kann aber bei zeile 1 (oder 2) weitermachen
00001111
0000xxxx
xxxxxxxx
xxxxxxxx
xxxx1111
xxxx1111
xxxx1111
xxxx1111


Gruß Horst
Thorsten83
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 191
Erhaltene Danke: 1



BeitragVerfasst: Do 27.11.08 15:59 
user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

apropos mehrere Prozessorkerne.
Jeder Prozessorkern kann an Zeile/Spalte arbeitem die nicht von einem anderen beackert wird.
Zwei Cpu-Kernen und einem Quadrat 32x32
CPU_0: Zeile 1..16 und Spalte 1..16
zeitgleich:
CPU_1: Zeile 17..32 und Spalte 17..32.



Reden wir hier über das vertauschen von Zeilen/Spalten oder das Befüllen mit Zahlen per Backtracking?
Bei ersterem hättest du das Problem, dass Zeile 1 die Elemente [0][0] bis [0][31] beinhaltet, also alle Spalten,
bei zweiterem müsste man die Ergebnisse immer synchronisieren...

Man könnte natürlich wenn man mehr als 2 Kerne hat einen benutzen, um "swap-threads" zu erstellen, und die anderen arbeiten die dann ab,
aber ich habe so meine Zweifel ob das wirklich sinnvoll ist...
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Do 27.11.08 18:18 
Hallo,
EDIT:
Alles falsch, vo wegen der Aufteilbarkeit auf mehrere Prozessoren

Aber eine andere Idee
Ich erzeuge eine Standardmatrix die durch simple Verschiebung, die die Kriterien erfüllt
ausblenden Quelltext
1:
2:
3:
4:
5:
12345
51234
45123
34512
23451

Jetzt Miller Yates Mischen (erzeugt eine zufällige Permutation) Spalten, aber nur eine Liste was gemacht werden soll:
Tausche Spalten 5-3(Random(5)+1),4-2(Random(4)+1),3-1,1-1
Das gleiche mit den Zeilen
Tausche Zeilen 5-2,4-4,1-3,1-1
Jetzt eine Liste dieser Operationen erstellen und diese mischen.

Gruß Horst
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Fr 28.11.08 11:47 
Hallo,

wenigstens eine kleine Verbesserung des Programmes soll rausspringen:
n= 500 in 610 ms

Gruß Horst

EDIT: Programm entfernt, erzeugt zu wenig Möglichkeiten


Zuletzt bearbeitet von Horst_H am Fr 28.11.08 15:59, insgesamt 1-mal bearbeitet
Thorsten83
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 191
Erhaltene Danke: 1



BeitragVerfasst: Fr 28.11.08 12:35 
Ich hab mir da mal schnell was zusammengeklatscht, ich brauch für eine 64x64-Matrix und 5000 Vertauschungen 46ms...

Ist Delphi so langsam? (Also ich hab das gerade schnell in C gemacht...)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 28.11.08 12:36 
Delphi ist da normalerweise nicht wirklich langsamer, es kommt immer auf die Umsetzung an ;-).
freedy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 403
Erhaltene Danke: 1

Winows 7
Delphi XE
BeitragVerfasst: Fr 28.11.08 12:44 
Die Umsetzung ist eigentlich alles (s. Adventsgewinnspiel). Aber ich finde es faszinierend, dass dieses Thema inzwischen so viele beschäftigt. ;-)

Danke übrigens für deine Umsetzung, Horst. Probiere es heute Nachmittag mal aus.
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Fr 28.11.08 15:55 
Hallo,

@thorsten83:
Wenn du 5000 Vertauschungen bei 64x64 hast, hast Du erheblich weniger als freedy's Version und erheblich mehr als meine Version, die maximal 2*(n-1) Tauschungen vornimmt.
Meine Stoppuhr läßt das Befüllen des Stringsgrids aussen vor.
Ich habe jetzt die Matrix privat gemacht ( habe ich jetzt nicht hochgeladen ) und fülle den Stringgrid1 bei Bedarf daraus.
n = 1000 dauert jetzt 153 ms und belegt 8 MB im Taskmanger.
n= 5000 dauert jetzt 7892 ms und belegt 101 Mb

Bleibt die Frage: mache ich genug Vertauschungen.
Die Möglichkeiten sind:
Erste Zeile: Feld(0,0) =n fallend um 1 bis Feld(0,n-1)=1
Zweite Zeile Feld(1,0) =n-1 fallend bis Feld(1,n-2)=1,Feld(1,n-1)=1
..
n.te Zeile Feld(1,0) =1 bis Feld(1,n-1)=1
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 Beispiel für n = 5
5  4  3  2  1
4  3  2  1  1
3  2  1  1  1
2  1  1  1  1
1  1  1  1  1

120  24  6  2  1 = 5!*4!*3!*2!*1!


Das sind ( Produkt (i=1..n) n! ) Möglichkeiten // Superfactorials: product of first n factorials hilft mir irdenwie nicht, naja kleiner als (n^2) !...

Zeilen Tauschen erzeugt eine aus n! Möglichkeiten.
Spalten Tauschen erzeugt eine aus n! Möglichkeiten.
Die Abfolge der Operationen Spalte/Zeile tauschen hat (2*n)!Möglichkeiten

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
n       n!    Super     n!^2    (2*n)!
1  1  1  1  2
2  2  2  4  24
3  6  12  36  720
4  24  288  576  40320
5  120  34560  14400  3628800
6  720  24883200  518400  479001600
7  5040  1,25411E+11  25401600  87178291200
8  40320  5,05658E+15  1625702400  2,09228E+13
9  362880  1,83493E+21  1,31682E+11  6,40237E+15
10  3628800  6,65861E+27  1,31682E+13  2,4329E+18
11  39916800  1,32895E+35  1,59335E+15  1,124E+21
12  479001600  6,3657E+43  2,29443E+17  6,20448E+23
13  6227020800  2,75273E+51  3,87758E+19  4,03291E+26
14  87178291200  2,39978E+62  7,60005E+21  3,04888E+29


Ab n = 11 erreiche ich irgendwie nicht mehr alle Möglichkeiten. von den 10^35

Es gibt ja auch die Möglichkeit, zwei Zeilen zweimal zu tauschen und dazwischen zwei Spalten. Das würde mein Algorithmus nicht immer können, da bei Miller yates die Obergrenze immer kleiner wird.

Schade, muss ich wieder mit Schnittmengen der Belegung arbeiten und zwar nicht nur aus Zeile und Spalte sondern bei zeilenweisem Vorgehen Zeile und Spalte einschliesslich deren folgenden Spalten.Mühselig ernährt sich das Eichhörnchen

Gruß Horst
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: So 30.11.08 09:55 
Hallo,


ich habe das jetzt auch super-factorial mäßig gemischt, um bei dem Latein Quadrat hoffentlich alle Möglichkeiten zu erzeugen.
Am Beispiel n= 5.
1. Mischen (X) komplett , Damit steht dann unten rechts fest (O)
2. Mischen nur die ersten 4 Zeilen/Spalten
3. Mischen nur die ersten 3 Zeilen/Spalten
4. Mischen nur die ersten 2 Zeilen/Spalten

ausblenden Quelltext
1:
2:
3:
4:
5:
XXXXX  XXXXX  XXXXX  XXXXX
XXXXX  XXXXX  XXXXX  XXXXX
XXXXX->XXXXX->XXXXX->XXOOO
XXXXX  XXXXX  XXXOO  XXOOO
XXXXX  XXXXO  XXXOO  XXOOO


n = 500 dauert statt 610 ms nun 26?? ms (Tauschen mit sich selbst werden jetzt nicht mehr ausgeführt ..)


Anzahl der Tauschungen = Summe (i := 2 to n) 2*(i-1)= 2*Summe(i=1..n-1) i
=2 * n*(n-1)/2 = n*(n-1) ~ n^2

Bei n= 64 (Thorsten83) sind es 4032 Tauschungen bei n=500 sind es schon 250000.

Gruß Horst

P.S.:
Was mich ärgert , das man für den ersten Zustand , also unten rechts eine Zahl auswählen eigentlich nur eine! beliebige Zeile oder Spalte hintauschen müsste und nicht das komplette Feld verwirbeln.
Dann wäre der Vorgang linear:
ausblenden Quelltext
1:
2:
3:
4:
bie n Wähle eine Zeile aus n tausche mit letzter Zeile n,
wieder hole für j= 1 to n-2
  dann eine Zeile aus n-j aus tausche mit  Zeile n-j,
  dann eine Spalte aus n-j aus tausche mit Spalte n-j,
Einloggen, um Attachments anzusehen!
Thorsten83
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 191
Erhaltene Danke: 1



BeitragVerfasst: So 30.11.08 13:36 
Hey,
wer oder was ist Miller yates? :)

Was die Anzahl der möglichen Anordnungen angeht bin ich auf das gleiche Ergebnis gekommen, allerdings spuckt mein (zugegebenermaßen schnell zusammengeklatschter) Backtracker noch was anderes aus...

Jetzt bleibt halt die Frage: wie viele Vertauschungen brauche ich denn, damit das Ergebnis "zufällig" ist? Bzw.: wie definiert man in dem Kontext zufällig?


Die größere Anzahl von Möglichkeiten beim Vertauschen ergibt sich doch daraus, dass das Vertauschen einer Spalte und einer Zeile kommutativ ist, oder?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 30.11.08 14:37 
user profile iconThorsten83 hat folgendes geschrieben Zum zitierten Posting springen:
wer oder was ist Miller yates? :)
Eine seltsame Bezeichnung für den Fisher-Yates Algorithmus vermute ich ;-).
www.c-sharp-library....ewtopic.php?p=433127
en.wikipedia.org/wiki/Fisher-Yates_shuffle
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: So 30.11.08 14:44 
Hallo,

O.K geht der miller eben phishen...

Zitat:
Die größere Anzahl von Möglichkeiten beim Vertauschen ergibt sich doch daraus, dass das Vertauschen einer Spalte und einer Zeile kommutativ ist, oder?


Ist es leider nicht.
ausblenden 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:
Ausgang
   0   1   2   3   4
   1   2   3   4   0
   2   3   4   0   1
   3   4   0   1   2
   4   0   1   2   3

Tausch Spalte 2 mit 4
Tausch Zeile  1 mit 2
Tausch Spalte 1 mit 2
Tausch Zeile  0 mit 3

   3   2   1   0   4
   2   1   0   4   3
   4   3   2   1   0
   1   0   4   3   2
   0   4   3   2   1

Jetzt die selben Tauschvoränge in anderer Reihen folge

Tausch Spalte 1 mit 2 (vorher Pos 3)
Tausch Zeile  0 mit 3 (vorher Pos 4)
Tausch Spalte 2 mit 4 (vorher Pos 1)
Tausch Zeile  1 mit 2 (vorher Pos 2)

   3   2   1   0   4
   0   4   3   2   1
   2   1   0   4   3
   1   0   4   3   2
   4   3   2   1   0


Gruß Horst
Thorsten83
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 191
Erhaltene Danke: 1



BeitragVerfasst: So 30.11.08 14:54 
Hey,
da hast du auch die Reihenfolge der Vertauschungen zweier Spalten verändert...
Und genau das ist wiederum nicht kommutativ wenn du eine Überschneidung bei den vertauschten Spalten hast.
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: So 30.11.08 15:20 
Hallo,

deshalb fand ich es auch eine gute Idee, die Reihenfolge zu mischen, um zu mehr Varianten zu kommen.
Wie läuft den Dein Backtracking ab, Du wirst doch sicher nur aus den noch möglichen wählen. daher wundert mich etwas das Du 5000 Versuche von 4032 Möglichkeiten brauchst.
Gehtst Du strikt zeilen oder spaltenweise vor.
Ich würde anhand der Wahrscheinlichkeiten , also im ZickZack an der Nebendiagonale lang die Felder belegen.
Im Beispiel oben erst die 5 dann die 4er dann die 3 er...
Man hat bei mehr als der Hälfte überhaupt keine Möglichkeit der Auswahl
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
Beispiel für n = 5 
5  4  3  2  1 
4  3  2  1  1 
3  2  1  1  1 
2  1  1  1  1 
1  1  1  1  1


Hier könnte man vielleicht zwei Prozessoren benutzen:
Einer beginnt zeilenweise ab Zeile1 Spalte 1, der andere sobald Feld(1,1) belegt ist ab Zeile 2 die Spalte 1 runter.

Gruß Horst
P.S
Backtracking , sinnvolles Belegen ist sicher wesentlich schnellere Variante.
Statt genauso oft komplette Spalen/Zeilen zu tauschen.
Thorsten83
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 191
Erhaltene Danke: 1



BeitragVerfasst: So 30.11.08 15:47 
Hey,
das Backtracking sieht so aus:

ausblenden volle Höhe 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:
void delField(BOOL * feld, int n)
{
  int i;
  for (i=0 ; i<n ; i++) feld[i] = FALSE;
}

BOOL check(int * matrix, int index, int n, BOOL* tmp)
{
  int i, j;
  int itmp;
  // checke die spalte:
  j = index%n;
  delField(tmp, n);
  for (i=0 ; i<n ; i++)
  {
    itmp = matrix[j];
    if (itmp!=EMPTY)
    {
      if (tmp[itmp]==TRUE) 
      {
        return FALSE;
      }
      tmp[itmp] = TRUE;
      j+=n;
     }
    else break;
  }
  
  i = index-index%n;
  delField(tmp, n);
  for (j=0 ; j<n ; j++)
  {  
    itmp = matrix[i];
    if (itmp!=EMPTY)
    {
      if (tmp[itmp]==TRUE) 
      {
        return FALSE;
      }
      tmp[itmp] = TRUE;
      i++;
     }
    else break;
  }
  return TRUE;
}

void genSolutions(int * matrix, int index, int n, int * result, BOOL * tmp)
{
  int i;
  if (index==n*n)
  {
     (*result)++;
  }
  else
  {
    for (i=0 ; i<n ; i++)
    {
      matrix[index] = i;
      if (check(matrix, index, n, tmp)==TRUE)
      {
        genSolutions(matrix, index+1, n, result, tmp);
      }
    }
    matrix[index] = EMPTY;
  }
}
int getCount(int * matrix, int n)
{
  int result = 0;
  BOOL * tmp = (BOOL*)malloc(n*sizeof(int));
  genSolutions(matrix, 0, n, &result, tmp);
  free(tmp);
  return result;
}

Hoffe ihr könnt mir C was anfangen? Lazarus spinnt noch rum und ich hab ehrlich gesagt wenig Lust mich darum zu kümmern...

Die 5000 Vertauschungen waren Pi*Daumen gewählt, für kleine Matrizen wohl viel zu viel, für große wiederum nicht ausreichend...

Aber letztendlich ist doch der Fisher-Yates shuffle die Lösung, oder?
Die erste Zeile wird normal danach erstellt, bei den folgenden muss man dann halt alle Zahlen, die in der Spalte schon vorkommen, aus dem Feld streichen, wenn man das effizient macht sollte man für eine NxN-Matrix bei O(n²*log(n)) landen, oder?


edit: es soll natürlich "mit C" heißen, und zum Verständnis könnte

ausblenden Quelltext
1:
2:
3:
4:
#define EMPTY (-1)
#define TRUE 1
#define FALSE 0
typedef int BOOL;


auch noch ganz nützlich sein :)

edit2: betretenes Schweigen?
Sind da so gravierende Fehler drin, oder ist die Pointerarithmetik verwirrend?

Da Fisher-Yates irgendwie spannender als die Logikvorlesung ist hab ich gerade mal ausprobiert was passiert, wenn man mit Vertauschungen arbeitet, aber die nicht irgendwie zufällig wählt, sonst per Fisher-Yates, scheint relativ schnell und dabei auch noch zufällig zu sein :)

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 
   4    3    7    9    5    1    0    6    2    8 
   5    4    8    0    6    2    1    7    3    9 
   9    8    2    4    0    6    5    1    7    3 
   1    0    4    6    2    8    7    3    9    5 
   7    6    0    2    8    4    3    9    5    1 
   3    2    6    8    4    0    9    5    1    7 
   2    1    5    7    3    9    8    4    0    6 
   8    7    1    3    9    5    4    0    6    2 
   6    5    9    1    7    3    2    8    4    0 
   0    9    3    5    1    7    6    2    8    4

Der noch nicht optimierte Code braucht für eine 2048x2048-Matrix ca. 600ms...
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Mo 01.12.08 13:09 
Hallo,

Dein Backtracking hat ja ersteinmal nur die Anzahl aller Lösungen gezählt, aber keine zufällige erzeugt.
Du wolltest doch nicht alle Varianten erzeugen und dann diesen eine zufällig auswählen.
Was ist an deiner Misch-Variante anders, wie oft tauschst Du Zeilen und Spalten.

Gruß Horst
P.S.
n=2048 1012 ms 1012 ms bei 2* (n-1) Tauschungen //wie gesagt erzeugt nicht alle Möglichkeiten (1700 Mhz PentiumM)
n=2048 ~16x3600 ms rund eine Minute (extrapoliert aus n = 512) bei 2* (n-1)^2 Tauschungen
Thorsten83
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 191
Erhaltene Danke: 1



BeitragVerfasst: Mo 01.12.08 13:49 
user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

Dein Backtracking hat ja ersteinmal nur die Anzahl aller Lösungen gezählt, aber keine zufällige erzeugt.


Jo, das war auch die Absicht :)
Die noch offene Frage ist ja, ob man jede gültige Anordnung durch das Tauschen von Zeilen und Spalten erzeugen kann (ich denke schon), und ob bei dieser Art der Erstellung alle möglichen Ergebnisse gleich wahrscheinlich sind (ich befürchte nicht... :()

Ich führe jetzt max n Spalten- und n Zeilenvertauschungen durch, der Unterschied ist dass ich die zu vertauschenen Indizes nicht mehr rein willkürlich wähle, sondern dafür eine durch Fisher-Yates generierte Permutation der Menge {1, .., n} nehme.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
t1 = fisher_yates_set(n);
t2 = fisher_yates_set(n);
t3 = fisher_yates_set(n);
t4 = fisher_yates_set(n);
for (i=0 ; i<n ; i++)
{
  tauscheZeilen(matrix, t1[i], t2[i], n);
  tauscheSpalten(matrix, t3[i], t4[i], n);
}
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Mo 01.12.08 14:13 
Hallo,

dito, mach ich doch in der ersten Tausch Variante genauso, nur eben zusätzlich Tausch der Abfolge, welcher das Ergebnis nur selten ändert, weshalb die 2n! als Einfluß völlig daneben liegen, also berücksichtige ich das jetzt nicht mehr.
Dadurch verändert sich die Anzahl der Tauschen nicht.
Bleiben also n! x n! gegenüber SuperFac(n) ;-) , ab und zu muss man neue Bezeichner einführen.
Aber dies erzeugt ab n= 5 zuwenig Varianten.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
n       n!    Superfac  n!^2    (2*n)! 
1  1  1  1  2 
2  2  2  4  24 
3  6  12  36  720 
4  24  288  576  40320 
5  120  34560  14400  3628800 <-- nur 14400 von 34560 
6  720  24883200  518400  479001600


Gruß Horst
P.S.
Mein Versuch mit zufälliger Belegung ist momentan ähnlich lahm wie die Version des Threaderstellers. Da ich eine die Zile die nicht zu Ende gebracht werden konnte neu zufällig belege.
Da muss ich noch eine Logik einbauen, die erkennt, das wenn ich aus den möglichen Zahlen eine gewisse jetzt auswähle ich in der nächsten Spalten irgendwann auf leere Menge komme.
Thorsten83
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 191
Erhaltene Danke: 1



BeitragVerfasst: Mo 01.12.08 14:47 
Der Witz ist halt dass mein Backtracking für eine NxN-matrix schon 161280 Lösungen findet, keine Ahnung wie es zu der Zahl kommt.

Ich denke auch dass das Befüllen per Backtracking die "zufälligste" Möglichkeit ist, das Problem ist halt dass der Algorithmus nicht zwangsläufig terminiert und auch noch relativ langsam ist...