def improve(self):
     float_i = list(map(lambda x: x.curr_float, Project.all))
     min_float = min(float_i)
     max_float = max(float_i)
     if self.time < END:
         p = select(Project.all, key=lambda x: x.curr_float - min_float + 1, num=1).pop()
         self.candidate_l[p.num] = p.candidate_time(p.curr_time, p.curr_time + (END - self.time))
     elif self.time > END:
         p = select(Project.all, key=lambda x: max_float - x.curr_float + 1, num=1).pop()
         self.candidate_l[p.num] = p.candidate_time(p.curr_time - (self.time - END), p.curr_time)
 def improve(self):
     float_i = list(map(lambda x: x.curr_float, Project.all))
     min_float = min(float_i)
     max_float = max(float_i)
     if self.time < END:
         p = select(Project.all,
                    key=lambda x: x.curr_float - min_float + 1,
                    num=1).pop()
         self.candidate_l[p.num] = p.candidate_time(
             p.curr_time, p.curr_time + (END - self.time))
     elif self.time > END:
         p = select(Project.all,
                    key=lambda x: max_float - x.curr_float + 1,
                    num=1).pop()
         self.candidate_l[p.num] = p.candidate_time(
             p.curr_time - (self.time - END), p.curr_time)
    def test():
        c_foo = Candidate('foo')
        c_bar = Candidate('bar')
        c_lol = Candidate('lol')

        p_se = Project('se')
        p_s1 = Project('s1')
        p_12 = Project('12')
        p_e3 = Project('e3')
        p_23 = Project('23')
        p_24 = Project('24')
        p_2e = Project('2e')
        p_34 = Project('34')
        p_45 = Project('45')
        p_e5 = Project('e5')
        p_ee = Project('ee')
        p_56 = Project('56')
        p_e6 = Project('e6')
        p_e7 = Project('e7')
        p_67 = Project('67')
        p_7e = Project('7e')

        p_e3.depend_on(p_se)
        p_12.depend_on(p_s1)
        p_23.depend_on(p_12)
        p_34.depend_on(p_e3, p_23)
        p_24.depend_on(p_12)
        p_2e.depend_on(p_12)
        p_e5.depend_on(p_2e)
        p_ee.depend_on(p_2e)
        p_45.depend_on(p_34, p_24)
        p_56.depend_on(p_45, p_e5)
        p_e6.depend_on(p_ee)
        p_e7.depend_on(p_ee)
        p_67.depend_on(p_56, p_e6)
        p_7e.depend_on(p_67, p_e7)

        p_se.add_candidate(c_foo, 2, 2)
        p_se.add_candidate(c_bar, 1, 3)
        p_se.add_candidate(c_lol, 3, 1)

        p_s1.add_candidate(c_foo, 1, 1)

        p_12.add_candidate(c_foo, 3, 3)
        p_12.add_candidate(c_bar, 4, 2)
        p_12.add_candidate(c_lol, 2, 4)

        p_e3.add_candidate(c_foo, 1, 1)

        p_23.add_candidate(c_foo, 2, 2)
        p_23.add_candidate(c_bar, 1, 3)
        p_23.add_candidate(c_lol, 3, 1)

        p_24.add_candidate(c_foo, 1, 1)

        p_2e.add_candidate(c_foo, 3, 3)
        p_2e.add_candidate(c_bar, 4, 2)
        p_2e.add_candidate(c_lol, 2, 4)

        p_34.add_candidate(c_foo, 2, 2)
        p_34.add_candidate(c_bar, 3, 1)

        p_45.add_candidate(c_foo, 3, 3)
        p_45.add_candidate(c_bar, 4, 2)
        p_45.add_candidate(c_lol, 2, 4)

        p_e5.add_candidate(c_foo, 3, 3)
        p_e5.add_candidate(c_bar, 4, 2)
        p_e5.add_candidate(c_lol, 2, 4)

        p_ee.add_candidate(c_foo, 2, 2)
        p_ee.add_candidate(c_bar, 3, 1)

        p_56.add_candidate(c_foo, 3, 3)

        p_e6.add_candidate(c_foo, 3, 3)
        p_e6.add_candidate(c_bar, 4, 2)
        p_e6.add_candidate(c_lol, 2, 4)

        p_e7.add_candidate(c_foo, 4, 4)
        p_e7.add_candidate(c_bar, 5, 3)
        p_e7.add_candidate(c_lol, 3, 5)

        p_67.add_candidate(c_foo, 1, 1)
        p_7e.add_candidate(c_bar, 1, 1)

        def rand_solution():
            return Solution([
                choice(list(project.candidate_d.keys()))
                for project in Project.all
            ])

        solution_l = [rand_solution() for _ in range(100)]
        for i in range(100):
            max_price = 0
            for solution in solution_l:
                solution.stimulate()
                solution.improve()
                solution.stimulate()
                max_price = max(max_price, solution.price)

            solution_l = select(solution_l,
                                key=lambda x: max_price - x.price + 1,
                                num=len(solution_l),
                                clone_func=lambda x: x.clone())
            crossover([s.candidate_l for s in solution_l], rate=0.2)
            mutate((s.candidate_l for s in solution_l),
                   func=lambda i: choice(list(Project.all[i].candidate_d)),
                   rate=0.05)

            for solution in solution_l:
                solution.stimulate()
            print(sum(solution.price for solution in solution_l))
    def test():
        c_foo = Candidate('foo')
        c_bar = Candidate('bar')
        c_lol = Candidate('lol')

        p_se = Project('se')
        p_s1 = Project('s1')
        p_12 = Project('12')
        p_e3 = Project('e3')
        p_23 = Project('23')
        p_24 = Project('24')
        p_2e = Project('2e')
        p_34 = Project('34')
        p_45 = Project('45')
        p_e5 = Project('e5')
        p_ee = Project('ee')
        p_56 = Project('56')
        p_e6 = Project('e6')
        p_e7 = Project('e7')
        p_67 = Project('67')
        p_7e = Project('7e')

        p_e3.depend_on(p_se)
        p_12.depend_on(p_s1)
        p_23.depend_on(p_12)
        p_34.depend_on(p_e3, p_23)
        p_24.depend_on(p_12)
        p_2e.depend_on(p_12)
        p_e5.depend_on(p_2e)
        p_ee.depend_on(p_2e)
        p_45.depend_on(p_34, p_24)
        p_56.depend_on(p_45, p_e5)
        p_e6.depend_on(p_ee)
        p_e7.depend_on(p_ee)
        p_67.depend_on(p_56, p_e6)
        p_7e.depend_on(p_67, p_e7)

        p_se.add_candidate(c_foo, 2, 2)
        p_se.add_candidate(c_bar, 1, 3)
        p_se.add_candidate(c_lol, 3, 1)

        p_s1.add_candidate(c_foo, 1, 1)

        p_12.add_candidate(c_foo, 3, 3)
        p_12.add_candidate(c_bar, 4, 2)
        p_12.add_candidate(c_lol, 2, 4)

        p_e3.add_candidate(c_foo, 1, 1)

        p_23.add_candidate(c_foo, 2, 2)
        p_23.add_candidate(c_bar, 1, 3)
        p_23.add_candidate(c_lol, 3, 1)

        p_24.add_candidate(c_foo, 1, 1)

        p_2e.add_candidate(c_foo, 3, 3)
        p_2e.add_candidate(c_bar, 4, 2)
        p_2e.add_candidate(c_lol, 2, 4)

        p_34.add_candidate(c_foo, 2, 2)
        p_34.add_candidate(c_bar, 3, 1)

        p_45.add_candidate(c_foo, 3, 3)
        p_45.add_candidate(c_bar, 4, 2)
        p_45.add_candidate(c_lol, 2, 4)

        p_e5.add_candidate(c_foo, 3, 3)
        p_e5.add_candidate(c_bar, 4, 2)
        p_e5.add_candidate(c_lol, 2, 4)

        p_ee.add_candidate(c_foo, 2, 2)
        p_ee.add_candidate(c_bar, 3, 1)

        p_56.add_candidate(c_foo, 3, 3)

        p_e6.add_candidate(c_foo, 3, 3)
        p_e6.add_candidate(c_bar, 4, 2)
        p_e6.add_candidate(c_lol, 2, 4)

        p_e7.add_candidate(c_foo, 4, 4)
        p_e7.add_candidate(c_bar, 5, 3)
        p_e7.add_candidate(c_lol, 3, 5)

        p_67.add_candidate(c_foo, 1, 1)
        p_7e.add_candidate(c_bar, 1, 1)

        def rand_solution():
            return Solution([choice(list(project.candidate_d.keys())) for project in Project.all])

        solution_l = [rand_solution() for _ in range(100)]
        for i in range(100):
            max_price = 0
            for solution in solution_l:
                solution.stimulate()
                solution.improve()
                solution.stimulate()
                max_price = max(max_price, solution.price)

            solution_l = select(solution_l, key=lambda x: max_price - x.price + 1,
                                num=len(solution_l), clone_func=lambda x: x.clone())
            crossover([s.candidate_l for s in solution_l], rate=0.2)
            mutate((s.candidate_l for s in solution_l),
                   func=lambda i: choice(list(Project.all[i].candidate_d)), rate=0.05)

            for solution in solution_l:
                solution.stimulate()
            print(sum(solution.price for solution in solution_l))
 def select_apply(solution_l: list):
     solution_l[:] = select(solution_l, lambda x: x.fitness, len(solution_l), lambda x: x.clone())