From c96abad68f55855b2370df59b220f40457da7a15 Mon Sep 17 00:00:00 2001 From: Ruben Seitz Date: Sun, 5 Oct 2025 14:19:44 +0200 Subject: [PATCH] Wannabe Hill-Climber implemented --- 01_sudoku_hillclimber.py | 34 ++++++++++++++++++++++++++++++++++ 02_sudoku_sa.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 01_sudoku_hillclimber.py create mode 100644 02_sudoku_sa.py diff --git a/01_sudoku_hillclimber.py b/01_sudoku_hillclimber.py new file mode 100644 index 0000000..c1c628c --- /dev/null +++ b/01_sudoku_hillclimber.py @@ -0,0 +1,34 @@ +""" +Implementiere einen Hill-Climbing-Algorithmus, der die Zahlen in +einem SUDOKU-Feld durch vertauschen innerhalb einer Zeile so +umsortiert, dass sie die SUDOKU-Bedingung auch für die Spalten +erfüllen. +""" + +import numpy as np + +board = np.array([ + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9] +]) + +board_size = len(board) # Board is always quadratic + +while -np.sum([len(set(board[:, i])) != 9 for i in range(9)]): + for row in range(board_size): + for col in range(board_size): + # Create array of column values excluding current row + column_without_current = np.concatenate([board[:row, col], board[row + 1:, col]]) + if board[row, col] in column_without_current: + board[row, col], board[row, (col + 1) % board_size] = board[row, (col + 1) % board_size], board[row, col] + break + # print(-np.sum([len(set(board[:, i])) != 9 for i in range(9)])) # debugging + +print(board) diff --git a/02_sudoku_sa.py b/02_sudoku_sa.py new file mode 100644 index 0000000..98168b8 --- /dev/null +++ b/02_sudoku_sa.py @@ -0,0 +1,36 @@ +""" +Erweitere das SUDOKU aus Aufgabe 1 so, dass auch die 9 +üblichen 3x3 Quadrate alle Zahlen von 1-9 enthalten. Außerdem +soll der Hill-Climber in einen Simulated-Annealing-Algorithmus +abgewandelt werden. Wichtig ist, dass dabei die Wahrscheinlichkeit +berechnet und ausgegeben wird, falls ein Schritt zu einer kleineren +Fitness auftreten würde. +""" + +import numpy as np + +board = np.array([ + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [1, 2, 3, 4, 5, 6, 7, 8, 9] +]) + +board_size = len(board) # Board is always quadratic + +while -np.sum([len(set(board[:, i])) != 9 for i in range(9)]): + for row in range(board_size): + for col in range(board_size): + # Create array of column values excluding current row + column_without_current = np.concatenate([board[:row, col], board[row + 1:, col]]) + if board[row, col] in column_without_current: + board[row, col], board[row, (col + 1) % board_size] = board[row, (col + 1) % board_size], board[row, col] + break + # print(-np.sum([len(set(board[:, i])) != 9 for i in range(9)])) # debugging + +print(board)