Ejemplo n.º 1
0
    def step(self, obs):
        super(MoveToBeacon, self).step(obs)

        if MoveToBeacon.loaded == False:
            self.loadK("8Dense-10-epochs-2-batches-3000-dataSetSize-98%")
            MoveToBeacon.loaded = True
        input = obs.observation.feature_minimap[5]
        for x in input:
                output = ""
                for i in x:
                    output+=str(i)
                    output+=""
                print(output)
        print("\n")        
        #If maring is selected, use DNN
        #print("Single: " + (str)(len(obs.observation.single_select)))
        #print("Multi: " + (str)(len(obs.observation.multi_select)))
        if self.unit_type_is_selected(obs, units.Terran.Marine):
            if self.can_do(obs, actions.FUNCTIONS.Attack_screen.id):

                newInput = self.stencil(obs.observation.feature_minimap[3], obs.observation.feature_minimap[5])

                #for x in stencil:
                #        output = ""
                #        for i in x:
                #            output+=str(i)
                #            output+=""
                #        print(output)
                #print("\n")
                #for x in input:
                #        output = ""
                #        for i in x:
                #            output+=str(i)
                #            output+=""
                #        print(output)
                #print("\n")
                #for x in newInput:
                #        output = ""
                #        for i in x:
                #            output+=str(i)
                #            output+=" "
                #        print(output)
                #print("\n")

                newInput = numpy.expand_dims(newInput, axis=2)
                newInput = newInput.reshape([-1,const.InputSize(),const.InputSize(),1])
                prediction = self.model.predict(newInput)
                outputx = prediction[0][0] * const.ScreenSize().x
                outputy = prediction[0][1] * const.ScreenSize().y
                #print(('Network Prediction vs Optimum: ({},{}) ({},{})'.format(int(outputx),int(outputy),beacon.x,beacon.y)), end='\r')
                return actions.FUNCTIONS.Attack_screen("now", (outputx,outputy))
        #Select Marine
        else: 
            marine = self.get_units_by_type(obs, units.Terran.Marine)
            if len(marine) > 0: 
                return actions.FUNCTIONS.select_point('select_all_type', (marine[0].x,
                                                                    marine[0].y))

        #features.MinimapFeatures.
        return actions.FUNCTIONS.no_op()
Ejemplo n.º 2
0
def get_training_data(training_data_dir):
    all_files = os.listdir(training_data_dir)
    all_files_size = len([num for num in all_files])
    inputs = []
    outputs = []
    counter = 0
    print('Extracting files...')
    for file in all_files:
        print("{}/{}".format(counter + 1, all_files_size), end='\r')
        counter += 1
        full_path = os.path.join(training_data_dir, file)
        # Extract file code
        with open(full_path) as csv_file:
            reader = csv.reader(csv_file)
            count = 0
            inputrows = []
            for row in reader:
                if count == const.InputSize():
                    outputs.append(row)
                else:
                    inputrows.append(row)
                count += 1
            inputs.append(inputrows)

    print("{}/{}".format(counter, all_files_size))
    inputs = np.expand_dims(inputs, axis=3)

    inputs = np.reshape(inputs, (-1, const.InputSize(), const.InputSize(), 1))
    outputs = np.reshape(outputs, (-1, const.OutputSize()))

    inputs = inputs.astype(np.int)
    outputs = outputs.astype(np.float)

    return [inputs, outputs]
Ejemplo n.º 3
0
 def stencil(self, _stencil, _raw_list):
     input = _raw_list
     stencil = _stencil
     newInput = numpy.zeros((const.InputSize(),const.InputSize()),int)
     counterx = 0
     countery = 0
     for numy, y in enumerate(stencil):
         for numx, x in enumerate(y): 
             if (x != 0):
                 newInput[countery][counterx] = input[numy][numx]
                 counterx+=1
             if (counterx == const.InputSize()):
                 countery+=1
                 counterx=0
     return newInput
 def getSimplifiedInput(self, obs):
   #31x31 Simplified
   input = obs.observation.feature_minimap[5]
   stencil = obs.observation.feature_minimap[3]
   newInput = numpy.zeros((const.InputSize(),const.InputSize()),int)
   counterx = 0
   countery = 0
   for numy, y in enumerate(stencil):
       for numx, x in enumerate(y): 
           if (x == 1):
               newInput[countery][counterx] = input[numy][numx]
               counterx+=1
           if (counterx == const.InputSize()):
               countery+=1
               counterx=0
   return newInput
Ejemplo n.º 5
0
class GenerateMoveToBeaconTestData(base_agent.BaseAgent):
        #Pysc2 defs
    packagedInput = numpy.zeros((const.InputSize(),const.InputSize()),int)
    packagedOutput = numpy.empty(const.OutputSize(), float)
    packageCounter = 0
    def get_obs(self, obs):
        return {self.screen: obs['screen'],
                self.available_actions: obs['available_actions']}

    def get_units_by_type(self, obs, unit_type):
        return [unit for unit in obs.observation.feature_units
            if unit.unit_type == unit_type]

    def can_do(self, obs, action):
        return action in obs.observation.available_actions

    def unit_type_is_selected(self, obs, unit_type):
        if (len(obs.observation.single_select) > 0 and
         obs.observation.single_select[0].unit_type == unit_type):
          return True

    def step(self, obs):
        super(GenerateMoveToBeaconTestData, self).step(obs)


       # Extract file code
       # with open ('training_data/0.csv') as csv_file:
       #     reader = csv.reader(csv_file)
       #     count = 0
       #     for row in reader:
       #         if count == 0:
       #             GenerateMoveToBeaconTestData.packagedInput = row
       #         if count == 2:
       #             GenerateMoveToBeaconTestData.packagedOutput = row
       #         count+=1


        #If previous action was successful, record as training data
        if obs.reward > 0:
            #counter = 0
            #output = ""
            #for x in GenerateMoveToBeaconTestData.packagedInput:
            #    output+=str(x)
            #    output+=" "
            #    counter+=1 
            #    if (counter == const.InputSize()):
            #        print(output)
            #        output = ""
            #        counter = 0
            #print(GenerateMoveToBeaconTestData.packagedOutput)
            fileName = 'raw_training_data/' + str(self.packageCounter) + '.csv'
            with open(fileName, mode='w', newline='') as file:
                writer = csv.writer(file)
                writer.writerows(self.packagedInput)
                writer.writerow(self.packagedOutput)
            self.packageCounter+=1
            #if (self.packageCounter == 3000):
            #    self.packageCounter = 4000


        newinput = obs.observation.feature_screen[6]


        #stencil = obs.observation.feature_minimap[3]

        ##24x24 is refined input data size
        ##Use camera stencil to grab relevent data   
        #newinput = numpy.zeros((const.InputSize(),const.InputSize()),int)
        #counterx = 0
        #countery = 0
        #for numy, y in enumerate(stencil):
        #    for numx, x in enumerate(y): 
        #        if (x == 1):
        #            newinput[countery][counterx] = input[numy][numx]
        #            counterx+=1
        #        if (counterx == const.InputSize()):
        #            countery+=1
        #            counterx=0

        for unit in obs.observation.feature_units:
            if(unit.unit_type == 317):
                beacon = unit

        
        #for x in newinput:
        #    output = ""
        #    for i in x:
        #        output+=str(i)
        #        output+=""
        #    print(output)
        #print("\n")

        #Screen is not 84x84 but ~84x60 but 84x84 for simplicity
        outputx = beacon.x #random.randint(0,const.ScreenSize())
        outputy = beacon.y #random.randint(0,const.ScreenSize())

        self.packagedInput = newinput
        #/84 to get a number between 0 and 1 as outputs for DNN
        self.packagedOutput = [float(round(Decimal(outputx/const.ScreenSize().x),2)),
                                                       float(round(Decimal(outputy/const.ScreenSize().y),2))]
        if self.unit_type_is_selected(obs, units.Terran.Marine):
            if self.can_do(obs, actions.FUNCTIONS.Attack_screen.id):
                return actions.FUNCTIONS.Attack_screen("now", (outputx,outputy))
        #Select Marine
        else: 
            marine = self.get_units_by_type(obs, units.Terran.Marine)
            if len(marine) > 0: 
                return actions.FUNCTIONS.select_point('select_all_type', (marine[0].x,
                                                                    marine[0].y))


        #features.MinimapFeatures.
        return actions.FUNCTIONS.no_op()
    def step(self, obs):
        super(DefeatEnemies, self).step(obs)

        if DefeatEnemies.loaded == False:
            self.loadK("LSTM84")
            DefeatEnemies.loaded = True

        if self.unit_type_is_selected(obs, units.Terran.Marine):
            if self.can_do(obs, actions.FUNCTIONS.Attack_screen.id):

                #84x84 Detailed
                #Things to be known:
                #Height_map(0) visibility(1) creep(2) Player_relative(5) Unit_type(6) selected(7) hit_points(8) unit_density(11) 
                input = obs.observation.feature_screen[6]
                #features.Dimensions.screen
                #31x31 Simplified
                #input = obs.observation.feature_screen[5]
                #stencil = obs.observation.feature_screen[3]
                #newInput = numpy.zeros((const.InputSize(),const.InputSize()),int)
                #counterx = 0
                #countery = 0
                #for numy, y in enumerate(stencil):
                #    for numx, x in enumerate(y): 
                #        if (x == 1):
                #            newInput[countery][counterx] = input[numy][numx]
                #            counterx+=1
                #        if (counterx == const.InputSize()):
                #            countery+=1
                #            counterx=0
                obs.observation
                for x in obs.observation.feature_screen[6]:
                        output = ""
                        for i in x:
                            output+=str(i)
                            output+=""
                        print(output)
                print("\n")

                newInput = numpy.expand_dims(input, axis=2)
                newInput = newInput.reshape([-1,const.InputSize(),const.InputSize(),1])


                #self.model.fit(TD[0], TD[1], 
                #batch_size=batch_size,
                #epochs=epochs,
                #validation_split=0.1, 
                #shuffle=False, verbose=verbose)
                prediction = self.model.predict(newInput)
                #for marines in obs.observation.multi_select:
                #    obs.observation.multi_select[0]
                #    prediction = self.model.predict(newInput)


                outputx = prediction[0][0] * const.ScreenSize().x
                outputy = prediction[0][1] * const.ScreenSize().y
            #return actions.FunctionCall(function_id, args)

                return actions.FUNCTIONS.Attack_screen("now", (outputx,outputy))
        else: 
            marine = self.get_units_by_type(obs, units.Terran.Marine)
            if len(marine) > 0: 
                return actions.FUNCTIONS.select_point('select_all_type', (marine[0].x,
                                                                    marine[0].y))