mc.py
author Eugen Sawin <sawine@me73.com>
Wed, 18 May 2011 01:51:18 +0200
changeset 0 33930f88de07
permissions -rw-r--r--
Missionaries and Cannibals.
sawine@0
     1
"""
sawine@0
     2
Name:
sawine@0
     3
Author: Eugen Sawin <sawine@informatik.uni-freiburg.de>
sawine@0
     4
"""
sawine@0
     5
sawine@0
     6
def main():    
sawine@0
     7
    goal = ((0, 0, 0), (3, 3, 1))
sawine@0
     8
    node = Node(((3, 3, 1), (0, 0, 0)))
sawine@0
     9
    frontier = [node]
sawine@0
    10
    explored = set()
sawine@0
    11
    solutions = set()
sawine@0
    12
    while len(frontier):
sawine@0
    13
        node = frontier.pop()
sawine@0
    14
        explored.add(node.state)      
sawine@0
    15
        for action in actions(node.state):            
sawine@0
    16
            child = Node(apply(node.state, action), node, action)      
sawine@0
    17
            if child.state == child.parent.state:
sawine@0
    18
                print child
sawine@0
    19
                return
sawine@0
    20
            if child.state not in explored and child not in frontier:
sawine@0
    21
                if child.state == goal:
sawine@0
    22
                    solutions.add(child)
sawine@0
    23
                else:
sawine@0
    24
                    frontier.append(child) 
sawine@0
    25
    for i, s in enumerate(solutions):
sawine@0
    26
        print "solution ", i
sawine@0
    27
        parent = s.parent
sawine@0
    28
        parents = []
sawine@0
    29
        while parent:
sawine@0
    30
            parents.append(parent)            
sawine@0
    31
            parent = parent.parent
sawine@0
    32
        print [p.state for p in reversed(parents)]
sawine@0
    33
            
sawine@0
    34
def negate(action):
sawine@0
    35
    return (-action[0], -action[1], -action[2]) 
sawine@0
    36
sawine@0
    37
def apply(state, action):
sawine@0
    38
    if len(state) == 2:
sawine@0
    39
        return (apply(state[0], action), apply(state[1], negate(action)))
sawine@0
    40
    return (state[0] + action[0], state[1] + action[1], state[2] + action[2])
sawine@0
    41
sawine@0
    42
def actions(state):      
sawine@0
    43
    actions = [(-2, 0, -1), (-1, 0, -1), (-1, -1, -1), (0, -2, -1), (0, -1, -1)]
sawine@0
    44
    actions.extend([negate(a)for a in actions])
sawine@0
    45
    states = [apply(state, a) for a in actions]   
sawine@0
    46
    good_states = [s[0] for s in states if s[0][2] >= 0 and s[1][2] >= 0 
sawine@0
    47
                   and (s[0][0] >= s[0][1] or not s[0][0]) 
sawine@0
    48
                   and (s[1][0] >= s[1][1] or not s[1][0])
sawine@0
    49
                   and s[0][1] >= 0 and s[1][1] >= 0
sawine@0
    50
                   and s[0][2] >= 0 and s[1][2] >= 0]
sawine@0
    51
    return [a for a in actions if apply(state[0], a) in good_states]
sawine@0
    52
sawine@0
    53
class Node(object):
sawine@0
    54
    def __init__(self, state, parent=None, action=None, cost=None):
sawine@0
    55
        self.state = state
sawine@0
    56
        self.parent = parent
sawine@0
    57
        self.action = action
sawine@0
    58
        self.cost = cost
sawine@0
    59
    
sawine@0
    60
sawine@0
    61
from argparse import ArgumentParser
sawine@0
    62
sawine@0
    63
def parse_arguments():
sawine@0
    64
    parser = ArgumentParser(description="Parses simple modal logic syntax.")
sawine@0
    65
    parser.add_argument("-f", "--formula", help="your formula") 
sawine@0
    66
    return parser.parse_args()
sawine@0
    67
sawine@0
    68
if __name__ == "__main__":
sawine@0
    69
    main()