diff --git a/.vs/8queens_simulated/v14/.suo b/.vs/8queens_simulated/v14/.suo new file mode 100644 index 0000000..462b395 Binary files /dev/null and b/.vs/8queens_simulated/v14/.suo differ diff --git a/8queens_simulated.sln b/8queens_simulated.sln new file mode 100644 index 0000000..a475962 --- /dev/null +++ b/8queens_simulated.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "8queens_simulated", "8queens_simulated\8queens_simulated.csproj", "{3AD7C5A2-5CA1-477A-9E17-835E8C6A35CD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3AD7C5A2-5CA1-477A-9E17-835E8C6A35CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3AD7C5A2-5CA1-477A-9E17-835E8C6A35CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3AD7C5A2-5CA1-477A-9E17-835E8C6A35CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3AD7C5A2-5CA1-477A-9E17-835E8C6A35CD}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/8queens_simulated/8queens_simulated.csproj b/8queens_simulated/8queens_simulated.csproj new file mode 100644 index 0000000..9090122 --- /dev/null +++ b/8queens_simulated/8queens_simulated.csproj @@ -0,0 +1,60 @@ + + + + + Debug + AnyCPU + {3AD7C5A2-5CA1-477A-9E17-835E8C6A35CD} + Exe + Properties + _8queens_simulated + 8queens_simulated + v4.5.2 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/8queens_simulated/App.config b/8queens_simulated/App.config new file mode 100644 index 0000000..88fa402 --- /dev/null +++ b/8queens_simulated/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/8queens_simulated/Program.cs b/8queens_simulated/Program.cs new file mode 100644 index 0000000..b8e3b41 --- /dev/null +++ b/8queens_simulated/Program.cs @@ -0,0 +1,226 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace _8queens_simulated +{ + class Program + { + static void Main(string[] args) + { + List tablo = new List(); + int totalTime = 0; + int totalMoves = 0; + int totalRestarts = 0; + + for (int i = 0; i < 35; i++) + { + bool[,] board = initializeBoard(8); //initialize for 8x8 (8 queens) + + int Moves = 0; + int restartCount = 0; + Stopwatch stopwatch = new Stopwatch(); + + stopwatch.Start(); // Begin timing. + + while (calculateCollisions(board) > 0) + { + applyHillClimbingAlgorithmToTheBoard(board); + Moves++; + if (Moves > 20) //if it stucks at the local minimum + { + board = initializeBoard(8); //random new board + Moves = 0; + restartCount++; + } + } + stopwatch.Stop(); + drawTheBoard(board); + Console.WriteLine(i + 1 + ") Total Moves: " + Moves + ", Restart Count: " + restartCount + ", Time elapsed: {0} ms", stopwatch.Elapsed.Milliseconds); + tablo.Add(i + 1 + ") Total Moves: " + Moves + ", Restart Count: " + restartCount + ", Time elapsed:" + stopwatch.Elapsed.Milliseconds + " ms"); + + totalMoves += Moves; + totalTime += stopwatch.Elapsed.Milliseconds; + totalRestarts += restartCount; + + Thread.Sleep(300); //to see the board + Console.Clear(); + } + + foreach (String istatistik in tablo) + { + Console.WriteLine(istatistik); + } + Console.WriteLine("++Average Moves: " + totalMoves / 35 + ", Average Restarts: " + totalRestarts / 35 + ", Average Time: " + totalTime / 35 + " ms "); + + Console.ReadKey(); + } + + // returns 2d array with specified size (if size=4, 2d array is 4 x 4 and there are 4 queens) + static bool[,] initializeBoard(int size) + { + bool[,] board = new bool[size, size]; + Random rnd = new Random(); + + + for (int i = 0; i < size; i++) + { + int randomSquare = rnd.Next(8); //placing queen to a random square in the row + for (int j = 0; j < size; j++) + { + if (j != randomSquare) + board[i, j] = false; + else + board[i, j] = true; + } + } + + return board; + } + + static int calculateCollisions(bool[,] board) + { + int size = Convert.ToInt32(Math.Sqrt(board.Length)); //if the board is 8x8, board.Length will be 64 + int totalCollisions = 0; + + for (int i = 0; i < size; i++) + { + for (int j = 0; j < size; j++) + { + if (board[i, j] == true) // if there is a queen on that square + { + //for (int z = j + 1; z < size; z++) //check the row //not necessary with this put-a-queen-to-each-row initialization + //{ + // if (board[i, z] == true) + // { + // totalCollisions++; + // break; + // } + //} + + for (int z = i + 1; z < size; z++) //check the column + { + if (board[z, j] == true) + { + totalCollisions++; + //break; //if indirect attacking does not count + } + } + + for (int z = 1; i + z < size && j + z < size; z++) //check the bottom-right diagonal + { + if (board[i + z, j + z] == true) + { + totalCollisions++; + //break; + } + } + + for (int z = 1; i - z >= 0 && j + z < size; z++) //check the top-right diagonal + { + if (board[i - z, j + z] == true) + { + totalCollisions++; + //break; + } + } + + } + } + } + return totalCollisions; + + } + + static void applyHillClimbingAlgorithmToTheBoard(bool[,] board) + { + int size = Convert.ToInt32(Math.Sqrt(board.Length)); + int[,] successors = new int[size, size]; + + for (int i = 0; i < size; i++) + { + //find the queen of the row first + int indexOfQueen = -1; + for (int j = 0; j < size; j++) + { + if (board[i, j] == true) + { + indexOfQueen = j; + board[i, j] = false; + } + } + //try all the moves on the row and save collisions + for (int j = 0; j < size; j++) + { + if (j != indexOfQueen) + { + board[i, j] = true; + successors[i, j] = calculateCollisions(board); + board[i, j] = false; + } + else + { + successors[i, j] = 999; //to ignore old position + } + } + board[i, indexOfQueen] = true; //fixing the row to its first position + } + + //select lowest value of successors + int min = 998; + int indexI = -1; + int indexJ = -1; + for (int i = 0; i < size; i++) + { + for (int j = 0; j < size; j++) + { + if (successors[i, j] < min) + { + min = successors[i, j]; + indexI = i; + indexJ = j; + } + } + } + + //make the move, remove queen of the row first and put the new one + for (int j = 0; j < size; j++) + { + if (board[indexI, j] == true) + { + board[indexI, j] = false; + } + } + board[indexI, indexJ] = true; + + + drawTheBoard(board); + Console.WriteLine("Total Collisions: " + calculateCollisions(board)); + //Thread.Sleep(100); //to follow steps + Console.Clear(); + } + + static void drawTheBoard(bool[,] board) + { + int size = Convert.ToInt32(Math.Sqrt(board.Length)); //if the board is 8x8, board.Length will be 64 + + for (int k = 0; k < size; k++) + { + for (int j = 0; j < size; j++) + { + if (board[k, j] == true) + Console.Write("O "); + else + Console.Write("- "); + } + Console.WriteLine(); + } + } + + + } +} diff --git a/8queens_simulated/Properties/AssemblyInfo.cs b/8queens_simulated/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c1e38b8 --- /dev/null +++ b/8queens_simulated/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("8queens_simulated")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("8queens_simulated")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3ad7c5a2-5ca1-477a-9e17-835e8c6a35cd")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/8queens_simulated/bin/Debug/8queens_simulated.exe b/8queens_simulated/bin/Debug/8queens_simulated.exe new file mode 100644 index 0000000..0d859d8 Binary files /dev/null and b/8queens_simulated/bin/Debug/8queens_simulated.exe differ diff --git a/8queens_simulated/bin/Debug/8queens_simulated.exe.config b/8queens_simulated/bin/Debug/8queens_simulated.exe.config new file mode 100644 index 0000000..88fa402 --- /dev/null +++ b/8queens_simulated/bin/Debug/8queens_simulated.exe.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/8queens_simulated/bin/Debug/8queens_simulated.pdb b/8queens_simulated/bin/Debug/8queens_simulated.pdb new file mode 100644 index 0000000..2c8fb12 Binary files /dev/null and b/8queens_simulated/bin/Debug/8queens_simulated.pdb differ diff --git a/8queens_simulated/bin/Debug/8queens_simulated.vshost.exe b/8queens_simulated/bin/Debug/8queens_simulated.vshost.exe new file mode 100644 index 0000000..681ab77 Binary files /dev/null and b/8queens_simulated/bin/Debug/8queens_simulated.vshost.exe differ diff --git a/8queens_simulated/bin/Debug/8queens_simulated.vshost.exe.config b/8queens_simulated/bin/Debug/8queens_simulated.vshost.exe.config new file mode 100644 index 0000000..88fa402 --- /dev/null +++ b/8queens_simulated/bin/Debug/8queens_simulated.vshost.exe.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/8queens_simulated/bin/Debug/8queens_simulated.vshost.exe.manifest b/8queens_simulated/bin/Debug/8queens_simulated.vshost.exe.manifest new file mode 100644 index 0000000..061c9ca --- /dev/null +++ b/8queens_simulated/bin/Debug/8queens_simulated.vshost.exe.manifest @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/8queens_simulated/obj/Debug/8queens_simulated.csproj.FileListAbsolute.txt b/8queens_simulated/obj/Debug/8queens_simulated.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..11b5f63 --- /dev/null +++ b/8queens_simulated/obj/Debug/8queens_simulated.csproj.FileListAbsolute.txt @@ -0,0 +1,6 @@ +c:\users\naim\documents\visual studio 2015\Projects\8queens_simulated\8queens_simulated\bin\Debug\8queens_simulated.exe.config +c:\users\naim\documents\visual studio 2015\Projects\8queens_simulated\8queens_simulated\bin\Debug\8queens_simulated.exe +c:\users\naim\documents\visual studio 2015\Projects\8queens_simulated\8queens_simulated\bin\Debug\8queens_simulated.pdb +c:\users\naim\documents\visual studio 2015\Projects\8queens_simulated\8queens_simulated\obj\Debug\8queens_simulated.csprojResolveAssemblyReference.cache +c:\users\naim\documents\visual studio 2015\Projects\8queens_simulated\8queens_simulated\obj\Debug\8queens_simulated.exe +c:\users\naim\documents\visual studio 2015\Projects\8queens_simulated\8queens_simulated\obj\Debug\8queens_simulated.pdb diff --git a/8queens_simulated/obj/Debug/8queens_simulated.csprojResolveAssemblyReference.cache b/8queens_simulated/obj/Debug/8queens_simulated.csprojResolveAssemblyReference.cache new file mode 100644 index 0000000..8b357ed Binary files /dev/null and b/8queens_simulated/obj/Debug/8queens_simulated.csprojResolveAssemblyReference.cache differ diff --git a/8queens_simulated/obj/Debug/8queens_simulated.exe b/8queens_simulated/obj/Debug/8queens_simulated.exe new file mode 100644 index 0000000..0d859d8 Binary files /dev/null and b/8queens_simulated/obj/Debug/8queens_simulated.exe differ diff --git a/8queens_simulated/obj/Debug/8queens_simulated.pdb b/8queens_simulated/obj/Debug/8queens_simulated.pdb new file mode 100644 index 0000000..2c8fb12 Binary files /dev/null and b/8queens_simulated/obj/Debug/8queens_simulated.pdb differ diff --git a/8queens_simulated/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/8queens_simulated/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..2d52dc5 Binary files /dev/null and b/8queens_simulated/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/8queens_simulated/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/8queens_simulated/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs new file mode 100644 index 0000000..e69de29 diff --git a/8queens_simulated/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/8queens_simulated/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs new file mode 100644 index 0000000..e69de29 diff --git a/8queens_simulated/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/8queens_simulated/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs new file mode 100644 index 0000000..e69de29