Ifi6057w5ex
Allikas: Lambda
N lipu paigutamine lokaalse otsinguga.
import search import random class HCNQueens(search.Problem): def __init__(self, N): self.N = N self.initial = [None]*N for i in range(N): self.initial[i] = random.randint(0,N-1) def actions(self, state): acts = [] for i in range(self.N): pos = state[i] for j in range(self.N): if j == pos: continue acts.append((i, j)) return acts def result(self, state, action): i, j = action newstate = list(state) newstate[i] = j return newstate def conflict(self, row1, col1, row2, col2): """Would putting two queens in (row1, col1) and (row2, col2) conflict?""" return (row1 == row2 or # same row col1 == col2 or # same column row1 - col1 == row2 - col2 or # same \ diagonal row1 + col1 == row2 + col2) # same / diagonal def value(self, state): h = 0 for col in range(self.N - 1): row = state[col] for col2 in range(col + 1, self.N): row2 = state[col2] if self.conflict(row, col, row2, col2): h += 1 return h def hill_climbing(problem): current = problem.initial curr_value = problem.value(problem.initial) while True: max_value = 99999 for action in problem.actions(current): neighbor = problem.result(current, action) neigh_value = problem.value(neighbor) if neigh_value < max_value: max_neighbor = neighbor max_value = neigh_value if max_value >= curr_value: break else: current = max_neighbor curr_value = max_value print (curr_value, current) return current p = HCNQueens(36) print(p.value(p.initial), p.initial) #print(p.value([2,1,2,1])) #print (p.actions(p.initial)) #print (p.result(p.initial,p.actions(p.initial)[0])) print(hill_climbing(p))