| 

.NET C# Java Javascript Exception

1
Hi habe ein kleines Problem undzwar komm ich einfach nicht drauf warum mein pc sich bei diesem code immer aufhängt und garnichtsmehr macht. Vielleicht hat einer von euch ja ne idee...

Es handelt sich um einen algorythmus zum lösen des 8 Damen problems. Ich habe auch schon Threadsleeps eingebaut bringt alles nichts hängt sich immer auf und ich hab kp warum hier der komplette code:

//Damenlösungs programm zum anzeigen alle lösungen des 8 Damen Problems 
//---------------------------------------------------------------------
//den code könnt ihr gerne benutzen und modifizieren wie ihr wollt

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DamenProblem_Lösungen
{
static class Program
{
//charset
public static string[] chars = new string[] { "A", "B", "C", "D", "E", "F", "G", "H" };
public static string[] letters = new string[] { "1", "2", "3", "4", "5", "6", "7", "8" };
//gibt alle möglichen kombinationen zurück
public static string[] positions
{
get
{
string[] returnment = new string[(chars.Length) * (letters.Length)];
Int64 i = 0;
foreach (string x in chars)
{
foreach (string y in letters)
{
returnment = x + y;
i++;
}
}
return returnment;
}
}
public static List<string[]> lösungen = new List<string[]>() { };
public static Dictionary<string, int> Book = new Dictionary<string, int>();

//initzialisiert einen liste mit A - H und den nummern dazu für ChackTwo
public static void setupBook()
{
Book.Add("A", 1);
Book.Add("B", 2);
Book.Add("C", 3);
Book.Add("D", 4);
Book.Add("E", 5);
Book.Add("F", 6);
Book.Add("G", 7);
Book.Add("H", 8);
Book.Add("1", 1);
Book.Add("2", 2);
Book.Add("3", 3);
Book.Add("4", 4);
Book.Add("5", 5);
Book.Add("6", 6);
Book.Add("7", 7);
Book.Add("8", 8);
}

//Haupteinstigs pu blabla kennt ihr ja
static void Main()
{
try
{
setupBook();
//algorythm oder so
Int64 z = 0;
Int64 C_IN = 0, C_JA = 0, C_NE = 0;
foreach (string D1 in positions)
foreach (string D2 in positions)
foreach (string D3 in positions)
foreach (string D4 in positions)
foreach (string D5 in positions)
foreach (string D6 in positions)
foreach (string D7 in positions)
foreach (string D8 in positions)
{
Console.Title = z + "/16777216 Lösungen:" + lösungen.Count + " IN:" + C_IN + " JA:" + C_JA + " NE:" + C_NE;
z++;
string[] actpos = new string[] { D1, D2, D3, D4, D5, D6, D7, D8 };
bool Continue = false;
foreach (string m1 in actpos)
{
if (Continue) continue;
Int64 intersects = 0;
foreach (string m2 in actpos)
if (m1 == m2)
intersects++;
if (intersects > 1)
Continue = true;
}
if (Continue)
{
C_IN++;
continue;
}
if (Checker(actpos))
{
lösungen.Add(actpos);
C_JA++;
}
else
{
C_NE++;
}
}
//zeigt lösungen an
Console.Clear();
Console.WriteLine("Drücken sie eine belibige Taste um die Lösungen anzuzeigen!");
Console.ReadKey(true);
Int64 i = 1;
foreach (string[] LARR in lösungen)
{
Console.Clear();
Console.WriteLine("LÖSUNG: " + i);
printer(false, LARR);
Console.WriteLine("Drücken sie eine belibige Taste um die nächste Lösungen anzuzeigen!");
Console.ReadKey(true);
i++;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
while (true) Console.ReadKey(true);
}

//ruft check auf
public static bool Checker(string d1, string d2, string d3, string d4, string d5, string d6, string d7, string d8)
{
return !Check(new string[] { d1, d2, d3, d4, d5, d6, d7, d8 });
}
//ruft check auf
public static bool Checker(string[] damen)
{
return !Check(damen);
}
//Prüft ein Schachfeld
public static bool Check(string[] poses)
{
bool collisions = false;
foreach (string one in poses)
{
if (collisions) break;
foreach (string two in poses)
{
if (one != two)
{
if (CheckTwo(one, two))
{
collisions = true;
break;
}
}
}
}
return collisions;
}

//ruft print auf
public static void printer(bool c, string d1, string d2, string d3, string d4, string d5, string d6, string d7, string d8)
{
if (c) Console.Clear();
print(new string[] { d1, d2, d3, d4, d5, d6, d7, d8 });
}
//ruft print auf
public static void printer(bool c, string[] damen)
{
if (c) Console.Clear();
print(damen);
}
//gibt ein schachfeld aus
public static void print(string[] poses)
{
Console.WriteLine("----------------");
foreach (string x in chars)
{
foreach (string y in letters)
{
if (Contains(x + y, poses))
Console.Write("O");
else
Console.Write(" ");
Console.Write("|");
}
Console.WriteLine();
Console.WriteLine("----------------");
}
}

//prüft ob das string[] arr den string o enthält
public static bool Contains(string o, string[] arr)
{
foreach (string i in arr)
if (o == i)
return true;
return false;
}

//Prüft ob zwei Punkte auf dem Schachfeld sich schlagen können
public static bool CheckTwo(string one, string two)
{
bool canHit = false;
if (one.Substring(1, 1) == two.Substring(1, 1))
canHit = true;
if (one.Substring(0, 1) == two.Substring(0, 1))
canHit = true;
if (Book[one.Substring(0, 1)] - Book[two.Substring(0, 1)] == Book[one.Substring(1, 1)] - Book[two.Substring(1, 1)])
canHit = true;
return canHit;
}
}
}[/code]
News:
22.02.2014
TheOnlyStone 9 2
Debuggen auf Endlosschleife kannst Du ja sicher selbst. Insofern: Sicher das der Rechner dafür nicht einfach nur mehrere Stunden/Tage benötigt? Wie kommst Du darauf, dass er sich aufhängt? Bau doch mal ein paar Console.Writeline ein um zu sehen, ob er noch arbeitet.
Jens Duczmal 22.02.2014
Für ein Schachbrett, m. 64 Feldern u. led. 8 Damen, tippe doch hier eher auf eine Endlosschkeife. Ich würde prüfen, ob alle Schleifen immer "voll" durchlaufen dürfen.
Falkner 23.02.2014
4
Naja. "Positions" hat 64 Einträge. Und die werden in 8 verschachtelten Schleifen durchlaufen. Das alleine sind ja 64^8 = 281474976710656 mal den Code in foreach(string D8 in positions). Ich glaub das reicht um den Rechner laaange zu beschäftigen :) Bei dem Code stellen sich mir auch allgemein die Nackenhaare auf.
Jens Duczmal 23.02.2014
Danke für euro kommentare :D Habe einiges geprüft. Das Programm höngt sich nicht auf es leuft weiter.
Console.Title = z +.... aber irgentwie lässt sich das Programm nicht mehr minimieren und es ist so als hätte ich ein screenshot vom desktop gemacht und bewege mich mit der maus darüber. Könnt ihn ja selber mal kompilieren und gucken obs bei euch auch so ist ich geb den code auf :D
TheOnlyStone 23.02.2014
1
100% CPU-Auslastung dürften das erklären. Mein Ansatz wäre, den Quellcode grundlegend zu überarbeiten. Ich habe mich damit zwar nicht beschäftigt, aber ich bin mir ganz sicher, dass es deutlich eleganter geht.

Selbst wenn Du das mit Multithreading löst, das Problem ist m.E. nach ein unnötig verschachteltes Schleifenkonstrukt.
Jens Duczmal 23.02.2014
2 Antworten
2
Ich weiß nicht, ob das gerade Deine Aufgabe während eines Informatikstudiums ist, aber ich kann mich erinnern, dass wir das auch lösen mussten.
Ein grundlegender Aspekt des Studiums ist wohl, zu erkennen, ob es überhaupt eine Lösung gibt, die in endlicher Zeit zu einem Ergebnis führt.
Das 8-Damen Problem hat mindestens eine effiziente Lösung, die grundlegend von Deiner Herangehensweise abweicht.
Schau doch mal auf wikipedia, da musst Du kaum 10 Zeilen Python verstehen...
23.02.2014
ffordermaier 8,4k 3 9
2
Ich schliesse mich der Meinung von ffordermeier an, und gebe nochmal etwas Senf drauf.
Das ist ja an für sich ein recht "plastisches" Problem welches man ja einwandfrei auch ohne Computer lösen kann, bzw. könnte.

Bei solchen Dingen lohnt es sich m.E. nach oft, einfach mal zu überlegen, wie man per Hand als Mensch vorgehen würde. Und genau das könnte man dann auch nachprogrammieren. Das mag nicht immer effizient sein, aber es würde funktionieren. Und Dir sicher auch ein wenig helfen, die generelle Vorgehensweise zu verstehen.

Wenn ich so ein Schachbrett vor mir hätte, würde ich auf A1 erst einmal eine Dame abstellen. Oder meinetwegen auf ein zufälliges Feld der ersten Reihe. Dann in Reihe 2 die nächste wo aufstellen, dass sie nicht geschlagen werden kann, usw. Spätestens bei Reihe 7 oder 8 knallt es dann aber. Weil es halt nicht so einfach ist :)

Wenn Du dann per Hand in Reihe 7 nicht mehr weiterkommst, dann änderst Du die Dame der Reihe 6 nochmal ab, Du gehst also eine Ebene höher und korrigierst. Anschließend guckst Du wieder ob Reihe 7 machbar ist. Falls nicht, gehst Du wieder auf Ebene 6. Kannst Du dort nicht weiter etwas neues ausprobieren, gehst Du noch eine Ebene höher in Reihe 5 und ändertst dort die Position ab. Anschließend dann.....bla.

Das kann man richtig schön mit einer rekursiven Methode lösen. Auch wenn ich das 8-Damen-Problem bisher noch nie programmiert habe, aber genau so würde ich vorgehen. Das mag nicht elegant sein, aber ich bin mir sicher, das der Weg zum Ziel führt.

Verfeinern könnte man das vielleicht noch mit einer Art Hilfstabelle in der bestimmte erfolglose Muster gespeichert werden, damit man die nicht wiederholt per "Brute Force" ausprobiert.
24.02.2014
Jens Duczmal 2,6k 1 3 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH