コード例 #1
0
ファイル: main.py プロジェクト: kjgarbutt/CrisisComABM
    def __init__(self, population_size, spread_x, spread_y, crisis_center_x,
                 crisis_center_y, crisis_strength, crisis_wave1, crisis_wave2,
                 crisis_wave3, capabilities, levels, multiple):

        self.population_size = population_size
        self.spread_x = spread_x
        self.spread_y = spread_y

        self.count_civ_message_total = self.count_civ_message_shelter = self.count_civ_message_medical = \
            self.count_civ_message_food = 0
        self.civ_list_shelter = []
        self.civ_list_medical = []
        self.civ_list_food = []

        self.stat_absolute_civilian = self.stat_absolute_shelter = self.stat_absolute_medical = self.stat_absolute_food = 0

        self.cri = Crisis(crisis_center_x, crisis_center_y, crisis_strength,
                                crisis_wave1, crisis_wave2, crisis_wave3)

        for i in range(self.population_size):
            self.civ.append(Civilian(i, Location(random.randrange(0, self.spread_x),
                                           random.randrange(0, self.spread_y)), False,
                                           False, False, False, False, random.randint(40, 100)))

        # create response network
        self.capabilities = capabilities
        self.levels = levels
        self.multiple = multiple

        self.nw = Response_Network_Star(self.capabilities, self.levels, self.multiple, self.spread_x, self.spread_y)
コード例 #2
0
ファイル: main.py プロジェクト: kjgarbutt/CrisisComABM
class Environment:
    """ Class for world / environment  """

    civ = []
    rs = []
    G = nx.Graph()

    fail_list = []

    def __init__(self, population_size, spread_x, spread_y, crisis_center_x,
                 crisis_center_y, crisis_strength, crisis_wave1, crisis_wave2,
                 crisis_wave3, capabilities, levels, multiple):

        self.population_size = population_size
        self.spread_x = spread_x
        self.spread_y = spread_y

        self.count_civ_message_total = self.count_civ_message_shelter = self.count_civ_message_medical = \
            self.count_civ_message_food = 0
        self.civ_list_shelter = []
        self.civ_list_medical = []
        self.civ_list_food = []

        self.stat_absolute_civilian = self.stat_absolute_shelter = self.stat_absolute_medical = self.stat_absolute_food = 0

        self.cri = Crisis(crisis_center_x, crisis_center_y, crisis_strength,
                                crisis_wave1, crisis_wave2, crisis_wave3)

        for i in range(self.population_size):
            self.civ.append(Civilian(i, Location(random.randrange(0, self.spread_x),
                                           random.randrange(0, self.spread_y)), False,
                                           False, False, False, False, random.randint(40, 100)))

        # create response network
        self.capabilities = capabilities
        self.levels = levels
        self.multiple = multiple

        self.nw = Response_Network_Star(self.capabilities, self.levels, self.multiple, self.spread_x, self.spread_y)

    def set_crisis(self):
        for i in range(self.population_size):
            self.civ[i].dead = self.cri.crisis_affect(0, self.civ[i].position.x, self.civ[i].position.y)
            self.civ[i].shelter = self.cri.crisis_affect(1, self.civ[i].position.x, self.civ[i].position.y)
            self.civ[i].medical = self.cri.crisis_affect(2, self.civ[i].position.x, self.civ[i].position.y)
            self.civ[i].food = self.cri.crisis_affect(3, self.civ[i].position.x, self.civ[i].position.y)

    def draw_environment(self):

        ref = 30

        master = Tk()

        w = Canvas(master, width=SPREAD_X*1.2, height=SPREAD_Y*1.2)
        w.pack()

        w.create_rectangle(ref, ref, ref+SPREAD_X, ref+SPREAD_Y)

        for i in range(len(env.civ)):
            if env.civ[i].dead == True:
                w.create_line(ref+env.civ[i].position.x-1, ref+env.civ[i].position.y-1, ref+env.civ[i].position.x+1, ref+env.civ[i].position.y+1, fill='red')
                w.create_line(ref+env.civ[i].position.x-1, ref+env.civ[i].position.y+1, ref+env.civ[i].position.x+1, ref+env.civ[i].position.y-1, fill='red')
            elif env.civ[i].shelter == True or env.civ[i].medical == True or env.civ[i].food == True:
                w.create_line(ref+env.civ[i].position.x-1, ref+env.civ[i].position.y-1, ref+env.civ[i].position.x+1, ref+env.civ[i].position.y+1, fill='green')
                w.create_line(ref+env.civ[i].position.x-1, ref+env.civ[i].position.y+1, ref+env.civ[i].position.x+1, ref+env.civ[i].position.y-1, fill='green')
            else:
                w.create_line(ref+env.civ[i].position.x-1, ref+env.civ[i].position.y-1, ref+env.civ[i].position.x+1, ref+env.civ[i].position.y+1)
                w.create_line(ref+env.civ[i].position.x-1, ref+env.civ[i].position.y+1, ref+env.civ[i].position.x+1, ref+env.civ[i].position.y-1)

        w.create_oval(ref+CRISIS_CENTER_X-CRISIS_WAVE3*2, ref+CRISIS_CENTER_Y-CRISIS_WAVE3*2, ref+CRISIS_CENTER_X+CRISIS_WAVE3*2, ref+CRISIS_CENTER_Y+CRISIS_WAVE3*2, outline='blue', width=5)

        mainloop()


    def civilian_to_responder(self):
        for i in range(len(self.civ)):
            if self.civ[i].dead is False:
                if self.civ[i].shelter is True or self.civ[i].medical is True or self.civ[i].food is True and random.random() < 0.99:
                    # randomly choose emergency contact
                    em_contact = self.nw.local_em[random.randint(0, len(self.nw.local_em)-1)]

                    #share information with emergency contact - creating Information instance
                    self.nw.rs[em_contact].info.append(Responder_Information(self.civ[i].id, self.civ[i].position, "up", "civ", False, False, False, False,
                                                                                self.civ[i].shelter, self.civ[i].medical,
                                                                                self.civ[i].food, False, ))

                    print("Civilian %d sent information to Responder %d ----- Needs Shelter %r - Medical %r - Food %r" % (self.civ[i].id, self.nw.rs[em_contact].id, self.civ[i].shelter, self.civ[i].medical, self.civ[i].food))

                    self.stat_absolute_civilian += 1

                    if self.civ[i].shelter is True:
                        self.stat_absolute_shelter += 1
                        self.civ_list_shelter.append(i)
                    if self.civ[i].medical is True:
                        self.stat_absolute_medical += 1
                        self.civ_list_medical.append(i)
                    if self.civ[i].food is True:
                        self.stat_absolute_food += 1
                        self.civ_list_food.append(i)







    def update_civilian_status(self):
        # TODO: check for civilian auto update functionality!
        for self.i in range(len(self.civ)):
            self.civ[self.i].update_status()