-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGPBestRun.py
More file actions
133 lines (117 loc) · 4.17 KB
/
GPBestRun.py
File metadata and controls
133 lines (117 loc) · 4.17 KB
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
from MalmoRun import MalmoRun
from Commands import Commands
from deap import algorithms
from deap import base
from deap import creator
from deap import tools
from deap import gp
import MalmoPython
import os
import random
import sys
import time
import json
import errno
import numpy as np
import operator
import math
mr = MalmoRun()
def ifThenElse(in1, out1, out2):
if(in1):
return out1
else:
return out2
def oneOver(x):
if x != 0:
return 1/x
return x
def loadXMLFile(mission_file = './Mazes/Maze1.xml'):
with open(mission_file, 'r') as f:
print "Loading mission from %s" % mission_file
xml = f.read()
mr.setXML(xml)
def gpLoop():
time.sleep(0.1)
observations = []
if not mr.o.update():
return -1.0
observations.append(float(mr.o.getDirection()))
for i in range(len(mr.o.gridFloat)):
observations.append(float(mr.o.gridFloat[i]))
observations.append(float(mr.lastVal))
# print "Observations: ",
# print observations
direction = math.floor(mr.gpFun(observations[0],observations[1],observations[2],
observations[3],observations[4],observations[5],
observations[6],observations[7],observations[8],
observations[9],observations[10]))
direction = direction % 4
# print "Direction: ",
# print direction
if direction < 1:
mr.c.moveForward()
elif direction < 2:
mr.c.moveBackward()
elif direction < 3:
mr.c.turnLeft()
elif direction < 4:
mr.c.turnRight()
mr.commandCount += 1
return direction
def setGPBestFun():
pset = gp.PrimitiveSetTyped("MAIN", [float, float, float, float, float, float,
float, float, float, float, float,], float)
pset.addPrimitive(ifThenElse, [bool, float, float], float)
pset.addPrimitive(operator.add, [float,float], float)
pset.addPrimitive(operator.sub, [float,float], float)
pset.addPrimitive(operator.mul, [float,float], float)
pset.addPrimitive(oneOver, [float], float)
pset.addPrimitive(operator.neg, [float], float)
pset.addPrimitive(operator.lt, [float, float], bool)
# pset.addPrimitive(operator.le, [float, float], bool)
pset.addPrimitive(operator.eq, [float, float], bool)
pset.addPrimitive(operator.gt, [float, float], bool)
# pset.addPrimitive(operator.ge, [float, float], bool)
pset.addPrimitive(operator.not_, [bool], bool)
pset.addPrimitive(operator.and_, [bool, bool], bool)
pset.addPrimitive(operator.or_, [bool, bool], bool)
pset.addTerminal(True, bool)
pset.addTerminal(mr.b.blockId("air"), float)
pset.addTerminal(mr.b.blockId("stone"), float)
# pset.addTerminal(mr.b.blockId("dirt"), float)
# pset.addTerminal(mr.b.blockId("glowstone"), float)
# pset.addTerminal(mr.b.blockId("emerald_block"), float)
# pset.addTerminal(mr.b.blockId("beacon"), float)
pset.addTerminal(mr.b.blockId("redstone_block"), float)
# pset.addTerminal(mr.b.blockId("stained_hardened_clay"), float)
# pset.addTerminal(mr.b.blockId("sea_lantern"), float)
pset.addEphemeralConstant("rand100", lambda: random.random() * 1000, float)
with open("GPMalmoBest.txt", 'r') as f:
individual = f.read()
print "Individual: ",
print individual
mr.gpFun = gp.compile(individual, pset)
mr.setAgentFun(gpLoop)
def main():
agentTime = 0.0
reward = 0.0
setGPBestFun()
for i in range(1,6):
loadXMLFile('./Mazes/EvalMaze'+str(i)+'.xml')
mr.runAgent(True)
currentReward = mr.getReward()
currentTime = mr.agentTime
printString = str(i) + "," + str(currentReward) + "," + str(currentTime) + "," + str(mr.commandCount) + "\n"
print printString
agentTime = agentTime + currentTime
reward = reward + currentReward
with open("BestGPAgentData.txt", 'a') as f:
f.write(printString)
return reward
def Evaluate():
with open("BestGPAgentData.txt", 'w') as f:
f.write("Random Agent Data\n")
f.write("Maze,Reward,Time,Command Count\n")
for i in range(3):
main()
Evaluate()