From b68e2fcfc3f73f6ab791c9b9234658ce6f0715c2 Mon Sep 17 00:00:00 2001 From: Ruben Seitz Date: Sun, 5 Oct 2025 14:40:38 +0200 Subject: [PATCH] Finished Hillclimber algorithm --- 01_sudoku_hillclimber.py | 17 +++++++++++------ 02_sudoku_sa.py | 27 +++++++++++++++------------ 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/01_sudoku_hillclimber.py b/01_sudoku_hillclimber.py index c1c628c..e13ad5b 100644 --- a/01_sudoku_hillclimber.py +++ b/01_sudoku_hillclimber.py @@ -6,6 +6,7 @@ erfüllen. """ import numpy as np +import random board = np.array([ [1, 2, 3, 4, 5, 6, 7, 8, 9], @@ -20,15 +21,19 @@ board = np.array([ ]) board_size = len(board) # Board is always quadratic +last_fitness = -np.sum([len(set(board[:, i])) != 9 for i in range(9)]) # -9 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 + # swap col in row with random other col + rand_col = random.randrange(board_size) + board[row, col], board[row, rand_col] = board[row, rand_col], board[row, col] + current_fitness = -np.sum([len(set(board[:, i])) != 9 for i in range(9)]) + if current_fitness >= last_fitness: + last_fitness = current_fitness + else: + board[row, rand_col], board[row, col], = board[row, col], board[row, rand_col] # swap back + # print(last_fitness) # debugging print(board) diff --git a/02_sudoku_sa.py b/02_sudoku_sa.py index 98168b8..e13ad5b 100644 --- a/02_sudoku_sa.py +++ b/02_sudoku_sa.py @@ -1,13 +1,12 @@ """ -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. +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 +import random board = np.array([ [1, 2, 3, 4, 5, 6, 7, 8, 9], @@ -22,15 +21,19 @@ board = np.array([ ]) board_size = len(board) # Board is always quadratic +last_fitness = -np.sum([len(set(board[:, i])) != 9 for i in range(9)]) # -9 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 + # swap col in row with random other col + rand_col = random.randrange(board_size) + board[row, col], board[row, rand_col] = board[row, rand_col], board[row, col] + current_fitness = -np.sum([len(set(board[:, i])) != 9 for i in range(9)]) + if current_fitness >= last_fitness: + last_fitness = current_fitness + else: + board[row, rand_col], board[row, col], = board[row, col], board[row, rand_col] # swap back + # print(last_fitness) # debugging print(board)