-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlogician_codebreaker.py
51 lines (40 loc) · 1.39 KB
/
logician_codebreaker.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import random
import time
from kripke_model import get_index_and_color_number
class LogicianCodeBreaker:
"""
Logician CodeBreaker generates the moves to guess
the code designed by CodeMaker. There are no repetitions allowed
in the move.
All the decisions are based on analysing the current knowledge model
logically. Every move is generated as a random world selection from
the currently available worlds in the knowledge model.
"""
def __init__(self, knowledge_model):
self.knowledge_model = knowledge_model
def get_first_move(self):
world = self.__generate_random_world()
self.move = world_to_move(world)
return self.move
def get_next_move(self, feedback):
world = self.__generate_random_world()
self.move = world_to_move(world)
return self.move
def __generate_random_world(self):
"""
Generates a random world from the
available knowledge model.
"""
random.seed(time.time_ns())
world = random.choice(self.knowledge_model.model.worlds)
return world
def world_to_move(world):
"""
For the given world, generates the move
using its propositional assignment
"""
move = [0, 0, 0, 0]
for proposition in world.assignment:
index, color = get_index_and_color_number(proposition)
move[index-1] = color
return move