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))