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())