예제 #1
0
class INDIVIDUAL:
    def __init__(self, i):

        self.ID = i

        self.genome = numpy.random.random([4, 8]) * 2 - 1

        self.fitness = 0

    def Start_Evaluation(self, pp, pb):

        self.sim = PYROSIM(playPaused=pp, playBlind=pb, evalTime=500)

        robot = ROBOT(self.sim, self.genome)

        self.sim.Start()

    def Compute_Fitness(self):

        self.sim.Wait_To_Finish()

        sensorData = self.sim.Get_Sensor_Data(sensorID=4, s=1)

        self.fitness = sensorData[499]

        if (self.fitness > 10.0):

            self.fitness = 10.0

        del self.sim

    def Mutate(self):

        s = random.randint(0, 3)

        m = random.randint(0, 7)

        self.genome[s, m] = random.gauss(self.genome[s, m],
                                         math.fabs(self.genome[s, m]))

        if (self.genome[s, m] > 1.0):

            self.genome[s, m] = 1.0

        if (self.genome[s, m] < -1.0):

            self.genome[s, m] = -1.0

    def Print(self):

        print '[',

        print self.ID,

        print self.fitness,

        print '] ',
    def Evaluate(self, hideSim=True, startPaused=False):

        sim = PYROSIM(playPaused=startPaused,
                      playBlind=hideSim,
                      evalTime=c.evaluationTime)
        robot = ROBOT(sim, self.genome)
        sim.Start()

        sim.Wait_To_Finish()

        x = sim.Get_Sensor_Data(sensorID=4, s=0)
        y = sim.Get_Sensor_Data(sensorID=4, s=1)
        z = sim.Get_Sensor_Data(sensorID=4, s=2)

        # self.sensorData_0 = sim.Get_Sensor_Data(sensorID=0)
        # self.sensorData_1 = sim.Get_Sensor_Data(sensorID=1)
        # self.sensorData_2 = sim.Get_Sensor_Data(sensorID=2)
        # self.sensorData_3 = sim.Get_Sensor_Data(sensorID=3)
        # self.sensorData_4 = sim.Get_Sensor_Data(sensorID=4)

        # print(sim.Get_Sensor_Data(sensorID=4))

        self.fitness = y[-1]
        del sim
예제 #3
0
from pyrosim import PYROSIM
import matplotlib.pyplot as plt

sim = PYROSIM(playPaused=True , evalTime=100)
sim.Send_Cylinder( objectID=0, x=0 , y=0 , z=.6 , length=1.0 , radius=0.1 )
sim.Send_Cylinder( objectID=1 , x=0 , y=.5 , z=1.1 , r1=0 , r2=1, r3=0 , length=1.0 , radius=0.1 , r=1, g=0, b=0)

sim.Send_Joint( jointID = 0 , firstObjectID = 0 , secondObjectID = 1, x=0 , y=0 , z=1.1, n1 = -1 , n2 = 0 , n3 = 0, lo=-3.14159/2 , hi=3.14159/2 )

sim.Send_Touch_Sensor( sensorID = 0 , objectID = 0 )
sim.Send_Touch_Sensor( sensorID = 1 , objectID = 1 )

sim.Start()
sim.Wait_To_Finish()
sensorData = sim.Get_Sensor_Data(sensorID = 1)
print sensorData

#f = plt.figure()
#pn = f.add_subplot(111)
#plt.plot(sensorData)
#plt.show()
import matplotlib.pyplot as plt
from pyrosim import PYROSIM
from robot import ROBOT
import random

for i in range(0, 3):
    ########################################################################################################################
    # Pyrosim setup
    ########################################################################################################################
    sim = PYROSIM(playPaused=False, evalTime=300)
    robot = ROBOT(sim, random.random() * 2 - 1)

    sim.Start()
    sim.Wait_To_Finish()

    sensorData_0 = sim.Get_Sensor_Data(sensorID=0)
    sensorData_1 = sim.Get_Sensor_Data(sensorID=1)
    sensorData_2 = sim.Get_Sensor_Data(sensorID=2)
    sensorData_3 = sim.Get_Sensor_Data(sensorID=3)
    sensorData_4 = sim.Get_Sensor_Data(sensorID=4)
    sensorData_5 = sim.Get_Sensor_Data(sensorID=5)

    # x = sim.Get_Sensor_Data(sensorID=5, s=0)
    # y = sim.Get_Sensor_Data(sensorID=5, s=1)
    # z = sim.Get_Sensor_Data(sensorID=5, s=2)
    #
    # print (x[-1])
    # print(y[-1])
    # print(z[-1])

########################################################################################################################
예제 #5
0
    sim = PYROSIM(playPaused=False, playBlind=False, evalTime=T)
    objID = 0
    jointID = 0
    sensorID = 0
    neuronID = 0
    pos_sensor_list = []
    N = 4
    for i in range(
            N):  #Create N potatoes, each with a different random network
        color = np.random.rand(3)
        objID, jointID, sensorID, neuronID = Send_Quadruped_Body_And_Brain(
            sim,
            x=i * 1.5 - N / 2.,
            objID=objID,
            jointID=jointID,
            sensorID=sensorID,
            neuronID=neuronID,
            color=color)
        pos_sensor_list.append(sensorID - 1)

    sim.Start()
    sim.Wait_To_Finish()
    print pos_sensor_list
    for i in range(N):
        for j in range(3):
            print sim.Get_Sensor_Data(pos_sensor_list[i], j, T - 1)
        print '--------'
    #sim.Get_Sensor_Data(pos_sensor_list[0],0,0)
    #print Create_Layered_Network(back_connections=1,hidden_recurrence=0,motor_recurrence=0)
# sim.Collect_Sensor_Data()
예제 #6
0
파일: sensors.py 프로젝트: vedipen/ludobots
               n2=0,
               n3=0,
               lo=-3.14159 / 2,
               hi=3.14159 / 2)
sim.Send_Touch_Sensor(sensorID=0, objectID=0)
sim.Send_Touch_Sensor(sensorID=1, objectID=1)
sim.Send_Proprioceptive_Sensor(sensorID=2, jointID=0)
sim.Send_Ray_Sensor(sensorID=3,
                    objectID=1,
                    x=0,
                    y=1.1,
                    z=1.1,
                    r1=0,
                    r2=1,
                    r3=0)
# sim.Send_Ray_Sensor(sensorID = 3 , objectID = 1 , x = 0 , y = 0.55 , z = 1.1 , r1 = 0 , r2 = 0 , r3 = -1)
sim.Start()
sim.Wait_To_Finish()
sensorData0 = sim.Get_Sensor_Data(sensorID=0)
sensorData1 = sim.Get_Sensor_Data(sensorID=1)
sensorData2 = sim.Get_Sensor_Data(sensorID=2)
sensorData3 = sim.Get_Sensor_Data(sensorID=3)
f = plt.figure()
pn = f.add_subplot(111)
plt.plot(sensorData0)
plt.plot(sensorData1)
plt.plot(sensorData2)
plt.plot(sensorData3)
pn.set_ylim(-2, +11)
plt.show()
class INDIVIDUAL:
    def __init__(self, i):

        self.ID = i

        # genome[0] = Hidden <-> Sensor Neurons
        # genome[1] = Hidden <-> Motor Neurons
        # genome[2] = Hidden <-> Hidden Recurrent Neurons
        self.genome = [
            MatrixCreate(c.numHidNeurons, 5),
            MatrixCreate(c.numHidNeurons, 8),
            MatrixCreate(c.numHidNeurons, c.numHidNeurons)
        ]
        self.genome[0] = MatrixRandomize(self.genome[0], 1, -1)
        self.genome[1] = MatrixRandomize(self.genome[1], 1, -1)
        self.genome[2] = MatrixRandomize(self.genome[2], 1, -1)
        self.fitness = 0
        self.stability = 0
        self.uniqueness = 0
        self.touchSensorData = np.array([])

    def Evaluate(self,
                 environment,
                 hideSim=True,
                 startPaused=False,
                 printFalse=False):

        self.Start_Evaluation(environment=environment,
                              hideSim=hideSim,
                              startPaused=startPaused)
        self.Compute_Fitness(printFit=printFalse)
        self.Store_Sensor_Data()
        del self.sim

    def Mutate(self, s=c.sMutation):

        # This will choose a random gene to mutate. but this is based on a Gauss distribution. This has been edited to
        # accept 2 dimensional genes

        for i in range(0, 3):

            # Synapse Layer
            sLayer = random.randint(0, len(self.genome) - 1)
            x = random.randint(0, len(self.genome[sLayer]) - 1)
            y = random.randint(0, len(self.genome[sLayer][x]) - 1)

            # random.gauss(mean, sigma)
            self.genome[sLayer][x, y] = random.gauss(
                self.genome[sLayer][x, y],
                math.fabs(self.genome[sLayer][x, y] * s))

            # # This will mutate ALL genes
            # for i in range(0, len(self.genome)):
            #     self.genome[i] = random.gauss(self.genome[i], math.fabs(self.genome[i]))

            # Clip the value of Gene
            self.genome[sLayer][x, y] = np.clip(self.genome[sLayer][x, y], -1,
                                                1)
            #self.genome[x, y] = max(min(1, self.genome[x, y]), -1)

    def Print(self):

        print('[', self.ID, self.fitness, self.uniqueness, ']', end=" ")
        #print(self.fitness, end=" "),
        #print(self.genome)

    def Start_Evaluation(self, environment, hideSim=True, startPaused=False):

        self.sim = PYROSIM(playPaused=startPaused,
                           playBlind=hideSim,
                           evalTime=c.evaluationTime)
        robot = ROBOT(self.sim, self.genome)
        environment.Send_To(self.sim)

        self.sim.Start()

    def Compute_Fitness(self, printFit=False):

        self.sim.Wait_To_Finish()

        # x = self.sim.Get_Sensor_Data( sensorID=4, s=0 )     # s is the flag for the desired coordinate
        # y = self.sim.Get_Sensor_Data( sensorID=4, s=1 )
        # z = self.sim.Get_Sensor_Data( sensorID=4, s=2 )

        # the returned value is the inverse squared of the distance to light source
        distLight = self.sim.Get_Sensor_Data(sensorID=4, s=0)
        distX = self.sim.Get_Sensor_Data(sensorID=5, s=0)
        distY = self.sim.Get_Sensor_Data(sensorID=5, s=1)

        # Touch Sensor Values.... Comes in vector
        for t in range(0, 4):

            self.stability += sum(self.sim.Get_Sensor_Data(sensorID=t)) * 0.25

        # DEBUGGING #
        if printFit:

            plt.plot(distLight**0.25)
            plt.show()

        # Fitness Computation
        self.fitness += distLight[-1]**0.25
        # self.fitness += np.clip(distLight[-1], 0, 0.1)

    def Store_Sensor_Data(self):

        touchSensorData = np.zeros(shape=(4, c.evaluationTime))

        for t in range(0, 4):

            touchSensorData[t, :] = self.sim.Get_Sensor_Data(sensorID=t, s=0)

        self.touchSensorData = touchSensorData

        # Stability Data
        columnSums = np.sum(touchSensorData, axis=0)
        columnThresholds = np.clip(columnSums, 0, 1)
        self.stability = np.sum(columnThresholds)

    def Compute_Distance_Between(self, other):

        try:

            self.touchSensorData

        except NameError:

            print("Sensor Data was not Stored")

        else:

            #euclideanDistance = np.linalg.norm(self.touchSensorData - other.touchSensorData)
            #euclideanDistance = self.fitness - other.fitness

            delta = np.sum(
                np.fabs(self.touchSensorData - other.touchSensorData))
            return delta

            # tOnGround = np.sum(self.touchSensorData)
            # tOnGround_Other = np.sum(other.touchSensorData)
            # euclideanDistance = np.fabs(tOnGround - tOnGround_Other)
            #
            # return euclideanDistance
    def Mutate_Neat(self):

        # synapse layer
        sLayer = random.randint(0, len(self.genome) - 1)

        # Shuffles the row of that Synapse layer
        self.genome[sLayer] = self.genome[sLayer][
            np.random.permutation(len(self.genome[sLayer][0])), :]
예제 #8
0
파일: individual.py 프로젝트: rdpli/evodevo
class INDIVIDUAL:
    def __init__(self, i):

        self.ID = i

        self.genome = numpy.random.random([5, 8]) * 2 - 1

        self.fitness = 0

    def Start_Evaluation(self, env, pp, pb):

        self.sim = PYROSIM(playPaused=pp,
                           playBlind=pb,
                           evalTime=constants.evaluationTime)

        robot = ROBOT(self.sim, self.genome)

        env.Send_To(self.sim)

        self.sim.Start()

    def Compute_Fitness(self):

        self.sim.Wait_To_Finish()

        sensorData = self.sim.Get_Sensor_Data(sensorID=4, s=0)

        currentFitness = sensorData[-1]

        if (currentFitness < self.fitness):

            self.fitness = currentFitness

        # self.fitness = self.fitness + currentFitness

# if ( self.fitness > 10.0 ):

#	self.fitness = 10.0

        del self.sim

    def Mutate(self):

        s = random.randint(0, 4)

        m = random.randint(0, 7)

        self.genome[s, m] = random.gauss(self.genome[s, m],
                                         math.fabs(self.genome[s, m]))

        if (self.genome[s, m] > 1.0):

            self.genome[s, m] = 1.0

        if (self.genome[s, m] < -1.0):

            self.genome[s, m] = -1.0

    def Print(self):

        print '[',

        print self.ID,

        print self.fitness,

        print '] ',
class INDIVIDUAL:
    def __init__(self, i):

        self.ID = i
        self.genome = MatrixCreate(4, 8)
        self.genome = MatrixRandomize(self.genome, 1, -1)
        self.fitness = 0

    def Evaluate(self, hideSim=True, startPaused=False):

        sim = PYROSIM(playPaused=startPaused,
                      playBlind=hideSim,
                      evalTime=c.evaluationTime)
        robot = ROBOT(sim, self.genome)
        sim.Start()

        sim.Wait_To_Finish()

        x = sim.Get_Sensor_Data(sensorID=4, s=0)
        y = sim.Get_Sensor_Data(sensorID=4, s=1)
        z = sim.Get_Sensor_Data(sensorID=4, s=2)

        # self.sensorData_0 = sim.Get_Sensor_Data(sensorID=0)
        # self.sensorData_1 = sim.Get_Sensor_Data(sensorID=1)
        # self.sensorData_2 = sim.Get_Sensor_Data(sensorID=2)
        # self.sensorData_3 = sim.Get_Sensor_Data(sensorID=3)
        # self.sensorData_4 = sim.Get_Sensor_Data(sensorID=4)

        # print(sim.Get_Sensor_Data(sensorID=4))

        self.fitness = y[-1]
        del sim

    def Mutate(self):

        # This will choose a random gene to mutate. but this is based on a Gauss distribution. This has been edited to
        # accept 2 dimensional genes
        x = random.randint(0, len(self.genome) - 1)
        y = random.randint(0, len(self.genome[0]) - 1)
        self.genome[x, y] = random.gauss(self.genome[x, y],
                                         math.fabs(self.genome[x, y]))

        # # This will mutate ALL genes
        # for i in range(0, len(self.genome)):
        #     self.genome[i] = random.gauss(self.genome[i], math.fabs(self.genome[i]))

    def Print(self):

        print('[', self.ID, self.fitness, ']', end=" ")
        #print(self.fitness, end=" "),
        #print(self.genome)

    def Start_Evaluation(self, hideSim=True, startPaused=False):

        self.sim = PYROSIM(playPaused=startPaused,
                           playBlind=hideSim,
                           evalTime=c.evaluationTime)
        robot = ROBOT(self.sim, self.genome)
        self.sim.Start()

    def Compute_Fitness(self):

        self.sim.Wait_To_Finish()

        x = self.sim.Get_Sensor_Data(sensorID=4, s=0)
        y = self.sim.Get_Sensor_Data(sensorID=4, s=1)
        z = self.sim.Get_Sensor_Data(sensorID=4, s=2)

        # self.sensorData_0 = sim.Get_Sensor_Data(sensorID=0)
        # self.sensorData_1 = sim.Get_Sensor_Data(sensorID=1)
        # self.sensorData_2 = sim.Get_Sensor_Data(sensorID=2)
        # self.sensorData_3 = sim.Get_Sensor_Data(sensorID=3)
        # self.sensorData_4 = sim.Get_Sensor_Data(sensorID=4)

        self.fitness = y[-1]
        del self.sim