def WalkSAT(clauses, p=0.5, max_flips=10000): """Checks for satisfiability of all clauses by randomly flipping values of variables """ # Set of all symbols in all clauses symbols = {sym for clause in clauses for sym in prop_symbols(clause)} # model is a random assignment of true/false to the symbols in clauses model = {s: random.choice([True, False]) for s in symbols} for i in range(max_flips): satisfied, unsatisfied = [], [] for clause in clauses: (satisfied if pl_true(clause, model) else unsatisfied).append(clause) if not unsatisfied: # if model satisfies all the clauses return model clause = random.choice(unsatisfied) if probability(p): sym = random.choice(list(prop_symbols(clause))) else: # Flip the symbol in clause that maximizes number of sat. clauses def sat_count(sym): # Return the the number of clauses satisfied after flipping the symbol. model[sym] = not model[sym] count = len( [clause for clause in clauses if pl_true(clause, model)]) model[sym] = not model[sym] return count sym = argmax(prop_symbols(clause), key=sat_count) model[sym] = not model[sym] # If no solution is found within the flip limit, we return failure return None
def minimax_decision(state, game): """Given a state in a game, calculate the best move by searching forward all the way to the terminal states. [Figure 5.3]""" player = game.to_move(state) def max_value(state): if game.terminal_test(state): return game.utility(state, player) v = -infinity for a in game.actions(state): v = max(v, min_value(game.result(state, a))) return v def min_value(state): if game.terminal_test(state): return game.utility(state, player) v = infinity for a in game.actions(state): v = min(v, max_value(game.result(state, a))) return v # Body of minimax_decision: return argmax(game.actions(state), key=lambda a: min_value(game.result(state, a)))
def predict(example): """Predict the target value for example. Consider each possible value, and pick the most likely by looking at each attribute independently.""" def class_probability(targetval): return (target_dist[targetval] * product(attr_dists[targetval, attr][example[attr]] for attr in dataset.inputs)) return argmax(target_vals, key=class_probability)
def predict(example): """Predict the target value for example. Calculate probabilities for each class and pick the max.""" def class_probability(targetval): attr_dist = attr_dists[targetval] return target_dist[targetval] * product(attr_dist[a] for a in example) return argmax(target_dist.keys(), key=class_probability)
def best_policy(mdp, U): """Given an MDP and a utility function U, determine the best policy, as a mapping from state to action. (Equation 17.4)""" pi = {} for s in mdp.states: pi[s] = argmax(mdp.actions(s), key=lambda a: expected_utility(a, s, U, mdp)) return pi
def predict(example): """Predict the target value for example. Consider each possible value, and pick the most likely by looking at each attribute independently.""" def class_probability(targetval): prob = target_dist[targetval] for attr in dataset.inputs: prob *= gaussian(means[targetval][attr], deviations[targetval][attr], example[attr]) return prob return argmax(target_vals, key=class_probability)
def genetic_algorithm(population, fitness_fn, ngen=1000, pmut=0.1): "[Figure 4.8]" for i in range(ngen): new_population = [] for i in len(population): fitnesses = map(fitness_fn, population) p1, p2 = weighted_sample_with_replacement(population, fitnesses, 2) child = p1.mate(p2) if random.uniform(0, 1) < pmut: child.mutate() new_population.append(child) population = new_population return argmax(population, key=fitness_fn)
def max_value(node): if game.terminal_test(node): return game.utility(node, player) self.change_list.append(('a', node)) self.change_list.append(('h',)) max_a = argmax(game.actions(node), key=lambda x: min_value(game.result(node, x))) max_node = game.result(node, max_a) self.utils[node] = self.utils[max_node] x1, y1 = self.node_pos[node] x2, y2 = self.node_pos[max_node] self.change_list.append(('l', (node, max_node - 3*node - 1))) self.change_list.append(('e', node)) self.change_list.append(('p',)) self.change_list.append(('h',)) return self.utils[node]
def policy_iteration(mdp): """Solve an MDP by policy iteration [Figure 17.7]""" U = {s: 0 for s in mdp.states} pi = {s: random.choice(mdp.actions(s)) for s in mdp.states} while True: U = policy_evaluation(pi, U, mdp) unchanged = True for s in mdp.states: a = argmax(mdp.actions(s), key=lambda a: expected_utility(a, s, U, mdp)) if a != pi[s]: pi[s] = a unchanged = False if unchanged: return pi
def expectiminimax(state, game): """Return the best move for a player after dice are thrown. The game tree includes chance nodes along with min and max nodes. [Figure 5.11]""" player = game.to_move(state) def max_value(state): v = -infinity for a in game.actions(state): v = max(v, chance_node(state, a)) return v def min_value(state): v = infinity for a in game.actions(state): v = min(v, chance_node(state, a)) return v def chance_node(state, action): res_state = game.result(state, action) if game.terminal_test(res_state): return game.utility(res_state, player) sum_chances = 0 num_chances = len(game.chances(res_state)) for chance in game.chances(res_state): res_state = game.outcome(res_state, chance) util = 0 if res_state.to_move == player: util = max_value(res_state) else: util = min_value(res_state) sum_chances += util * game.probability(chance) return sum_chances / num_chances # Body of expectiminimax: return argmax(game.actions(state), key=lambda a: chance_node(state, a), default=None)
def find_max_node(nodes): return nodes.index(argmax(nodes, key=lambda node: node.value))