Ejemplo n.º 1
0
    def process_round(self, state: GameState):
        pathogens_without_vaccine = set(state.pathogens).difference(
            state.pathogens_with_vaccination)
        pathogens_without_vaccine = list(
            pathogens_without_vaccine.difference(
                state.pathogens_with_vaccination_in_development))
        if pathogens_without_vaccine:
            # develop all vaccines first
            if state.points >= 40:
                return develop_vaccine(pathogens_without_vaccine[0].index)
            else:
                return end_round()
        else:
            pathogens_with_vaccine = state.pathogens_with_vaccination
            if pathogens_with_vaccine:
                if state.points >= 5:
                    # collect all not vaccinated outbreaks
                    outbreaks_to_vaccinate = []
                    for city in state.cities:
                        events: list = city.events
                        vaccinated_pathogens = list(
                            map(
                                lambda event: event.pathogen,
                                filter(
                                    lambda event: event.event_type ==
                                    "vaccineDeployed", events)))
                        outbreaks = list(
                            filter(
                                lambda event: event.event_type == "outbreak",
                                events))
                        outbreaks = list(
                            filter(
                                lambda outbreak_event: outbreak_event.pathogen
                                in pathogens_with_vaccine, outbreaks))
                        outbreaks = list(
                            filter(
                                lambda outbreak_event: outbreak_event.pathogen
                                not in vaccinated_pathogens, outbreaks))
                        outbreaks_to_vaccinate.extend(
                            list(
                                map(
                                    lambda outbreak_event:
                                    (city, outbreak_event), outbreaks)))

                    if outbreaks_to_vaccinate:
                        outbreaks_to_vaccinate.sort(key=self.outbreak_priority,
                                                    reverse=True)
                        outbreak_to_vaccinate = outbreaks_to_vaccinate[0]
                        return deploy_vaccine(
                            outbreak_to_vaccinate[1].pathogen.index,
                            outbreak_to_vaccinate[0].index)
                    else:
                        return end_round()
                else:
                    return end_round()
            else:
                return end_round()
Ejemplo n.º 2
0
 def generate_deployment_action(self, possible_actions: list, state: GameState):
     executable_actions = list(filter(lambda action: self.is_action_executable(action, state), possible_actions))
     if executable_actions:
         action = executable_actions[0]
         if action.is_vaccine:
             return deploy_vaccine(action.pathogen.index, action.city_id)
         else:
             return deploy_medication(action.pathogen.index, action.city_id)
     else:
         return end_round()
    def _generate_city_vaccine_actions(
            cls, city: City, ordered_available_pathogens: List[Pathogen],
            pathogens_with_vaccination: List[Pathogen]):
        city_pathogens_with_vaccine = list(
            filter(
                lambda city_pathogen: city_pathogen in
                pathogens_with_vaccination, city.pathogens))

        ordered_city_pathogens_with_vaccine = [
            actions.deploy_vaccine(pathogen.index, city.index)
            if pathogen in city_pathogens_with_vaccine else INVALID_ACTION
            for pathogen in ordered_available_pathogens
        ]
        return ordered_city_pathogens_with_vaccine
Ejemplo n.º 4
0
    def process_round(self, state: GameState):
        possible_actions = []
        points = state.points

        for city in state.cities:
            if points >= 5:
                not_vaccinated_outbreaks = self.get_not_vaccinated_outbreaks_for_city(city)
                actions = list(map(
                    lambda outbreak: self.generate_possible_action(outbreak, city, True,
                                                                   state.pathogens_with_vaccination),
                    not_vaccinated_outbreaks))
                possible_actions.extend(actions)

            if points >= 10:
                not_medicated_outbreaks = self.get_not_medicated_outbreaks_for_city(city)
                actions = list(map(
                    lambda outbreak: self.generate_possible_action(outbreak, city, False,
                                                                   state.pathogens_with_medication),
                    not_medicated_outbreaks))
                possible_actions.extend(actions)

        if possible_actions:
            possible_actions.sort(key=lambda action: action.priority, reverse=True)

            action = possible_actions[0]
            pathogen = action.pathogen
            if action.is_vaccine:
                if pathogen in state.pathogens_with_vaccination:
                    return deploy_vaccine(pathogen.index, action.city_id)
                elif pathogen not in state.pathogens_with_vaccination_in_development:
                    if points >= 40:
                        return develop_vaccine(pathogen.index)
                    else:
                        return end_round()
                else:
                    return self.generate_deployment_action(possible_actions, state)
            else:
                if pathogen in state.pathogens_with_medication:
                    return deploy_medication(pathogen.index, action.city_id)
                elif pathogen not in state.pathogens_with_medication_in_development:
                    if points >= 20:
                        return develop_medication(pathogen.index)
                    else:
                        return end_round()
                else:
                    return self.generate_deployment_action(possible_actions, state)
        else:
            return end_round()
def test_generate_city_vaccine_actions(
        simple_act_state_processor: SimpleActStateProcessor,
        city_with_pathogens: City, available_pathogens: List[Pathogen],
        pathogens_with_vaccination: List[Pathogen]):
    deploy_vaccine_actions = [
        actions.deploy_vaccine(pathogen.index, city_with_pathogens.index)
        if pathogen in city_with_pathogens.pathogens
        and pathogen in pathogens_with_vaccination else INVALID_ACTION
        for pathogen in available_pathogens
    ]

    assert simple_act_state_processor._generate_city_vaccine_actions(
        city_with_pathogens, available_pathogens,
        pathogens_with_vaccination) == deploy_vaccine_actions

    assert simple_act_state_processor._generate_city_vaccine_actions(
        city_with_pathogens, available_pathogens,
        list(reversed(pathogens_with_vaccination))) == deploy_vaccine_actions

    assert simple_act_state_processor._generate_city_vaccine_actions(
        city_with_pathogens, list(reversed(available_pathogens)),
        pathogens_with_vaccination) == list(reversed(deploy_vaccine_actions))