def optimize_ga(timetable, func): sorter = GeneticSorter(timetable, func, seed=(timetable,), population_size=100, crossover_p=0.3, mutations={ inversion_mutation: 0.002, swap_mutation: 0.02, displacement_mutation: 0.01, }) return sorter.run(100)
def optimize_ga(timetable, func, params): params = params or {} population_size = params.get('population_size', 100) sorter = GeneticSorter(timetable, func, seed=(timetable,), population_size=population_size, crossover_p=0.2, mutations={ inversion_mutation: 0.005, swap_mutation: 0.05, displacement_mutation: 0.03, random_replacement_mutation: 0.01, }) return sorter.run(params.get('iterations', 100))
def test_list_sort(self): N = 20 data = random.sample(xrange(N), N) f = lambda p: sum(1.0 / (abs(i-x) + 1) for i, x in enumerate(p)) sorter = GeneticSorter(data, evaluation_func=f, population_size=50, mutations={swap_mutation: 0.02}) # This is fragile: if we don't find a solution in 10^6 generations this test will fail. for i in xrange(1000): result = sorter.run(1000) if result == tuple(xrange(N)): break self.failUnlessEqual(result, tuple(xrange(N)))
def test_list_sort(self): '''Tests if the GeneticSorter correctly sorts a supplied list. ''' N = 20 data = random.sample(range(N), N) f = lambda p: sum(1.0 / (abs(i-x) + 1) for i, x in enumerate(p)) sorter = GeneticSorter(data, evaluation_func=f, population_size=50, mutations={swap_mutation: 0.02}) # This is fragile: if we don't find a solution in 10^6 generations this test will fail. for i in range(1000): result = sorter.run(1000) if result == tuple(range(N)): break self.assertEqual(result, tuple(range(N)))
def handle(self, **options): submission_data = {} meeting = Meeting.objects.create(start=datetime.datetime( 2010, 4, 13, 10), title="Test") entries_by_title = {} for name, submissions, comments in csv.reader(open( os.path.join(os.path.dirname(__file__), 'data', 'meeting100413.csv'), 'r'), delimiter=',', quotechar='"'): user = User.objects.create(username=name) for submission in submissions.split(','): title = "".join(submission.strip().split()[:1]) if title in entries_by_title: entry = entries_by_title[title] else: entry = meeting.add_entry( title=title, duration=datetime.timedelta(minutes=10)) entries_by_title[title] = entry entry.participations.create(user=user) #print len(entries_by_title) setup = 'from ecs.meetings.models import Meeting;m = Meeting.objects.get(pk=%s);f = m.create_evaluation_func(lambda x: x);perm=list(m)' % meeting.pk print("%.3fms per metric constructor" % (timeit.timeit('f(perm)', setup, number=1000))) setup = 'from ecs.utils.genetic_sort import order_crossover' print("%.3fms per order_crossover" % (timeit.timeit( 'order_crossover((1,2,3,4,5,6,7,8,9), (9,8,7,6,5,4,3,2,1))', setup, number=1000))) setup = 'from ecs.utils.genetic_sort import swap_mutation' print("%.3fms per swap_mutuation" % (timeit.timeit( 'swap_mutation((1,2,3,4,5,6,7,8,9))', setup, number=1000))) setup = 'from ecs.utils.genetic_sort import inversion_mutation' print("%.3fms per swap_mutuation" % (timeit.timeit( 'inversion_mutation((1,2,3,4,5,6,7,8,9))', setup, number=1000))) setup = 'from ecs.utils.genetic_sort import displacement_mutation' print("%.3fms per displacement_mutation" % (timeit.timeit( 'displacement_mutation((1,2,3,4,5,6,7,8,9))', setup, number=1000))) get_metrics = meeting.create_evaluation_func(lambda x: x) evalf = meeting.create_evaluation_func(lambda metrics: 1000 * 1000 * ( 10.0 / (metrics._waiting_time_total + 1) + 0 / (metrics._waiting_time_max + 1))) entries, users = meeting.timetable sorter = GeneticSorter(entries, evalf, population_size=100, crossover_p=0.3, mutations={ inversion_mutation: 0.002, swap_mutation: 0.02, displacement_mutation: 0.01, }) print("===" * 25) try: for i in range(1000): result = sorter.run(5) metrics = get_metrics(result) if not i % 10: print("%4s %8s %8s %8s %8s %8s %8s %4s %10s" % ( 'gen', 'sum', 'avg', 'min', 'max', 'base', 'value', 'pop', 'secs/gen', )) print("%4d %8d %8d %8d %8d %8d %8d %4d %10.4f" % (sorter.generation_count, int(metrics.waiting_time_total.total_seconds() / 60), int(metrics.waiting_time_avg.total_seconds() / 60), int(metrics.waiting_time_min.total_seconds() / 60), int(metrics.waiting_time_max.total_seconds() / 60), int(evalf(entries)), int(evalf(result)), len(sorter.population), sorter.time_per_generation)) except KeyboardInterrupt: pass transaction.set_rollback(True)
def handle(self, **options): submission_data = {} try: meeting = Meeting.objects.create(start=datetime.datetime(2010, 4, 13, 10), title="Test") entries_by_title = {} for name, submissions, comments in csv.reader( open(os.path.join(os.path.dirname(__file__), "data", "meeting100413.csv"), "r"), delimiter=",", quotechar='"', ): user = User.objects.create(username=name) for submission in submissions.split(","): title = "".join(submission.strip().split()[:1]) if title in entries_by_title: entry = entries_by_title[title] else: entry = meeting.add_entry(title=title, duration=datetime.timedelta(minutes=10)) entries_by_title[title] = entry entry.add_user(user) # print len(entries_by_title) setup = ( "from ecs.meetings.models import Meeting;m = Meeting.objects.get(pk=%s);f = m.create_evaluation_func(lambda x: x);perm=list(m)" % meeting.pk ) print "%.3fms per metric constructor" % (timeit.timeit("f(perm)", setup, number=1000)) setup = "from ecs.utils.genetic_sort import order_crossover" print "%.3fms per order_crossover" % ( timeit.timeit("order_crossover((1,2,3,4,5,6,7,8,9), (9,8,7,6,5,4,3,2,1))", setup, number=1000) ) setup = "from ecs.utils.genetic_sort import swap_mutation" print "%.3fms per swap_mutuation" % ( timeit.timeit("swap_mutation((1,2,3,4,5,6,7,8,9))", setup, number=1000) ) setup = "from ecs.utils.genetic_sort import inversion_mutation" print "%.3fms per swap_mutuation" % ( timeit.timeit("inversion_mutation((1,2,3,4,5,6,7,8,9))", setup, number=1000) ) setup = "from ecs.utils.genetic_sort import displacement_mutation" print "%.3fms per displacement_mutation" % ( timeit.timeit("displacement_mutation((1,2,3,4,5,6,7,8,9))", setup, number=1000) ) get_metrics = meeting.create_evaluation_func(lambda x: x) evalf = meeting.create_evaluation_func( lambda metrics: 1000 * 1000 * (10.0 / (metrics._waiting_time_total + 1) + 0 / (metrics._waiting_time_max + 1)) ) entries, users = meeting.timetable sorter = GeneticSorter( entries, evalf, population_size=100, crossover_p=0.3, mutations={inversion_mutation: 0.002, swap_mutation: 0.02, displacement_mutation: 0.01}, ) print "===" * 25 try: for i in xrange(1000): result = sorter.run(5) metrics = get_metrics(result) if not i % 10: print "%4s %8s %8s %8s %8s %8s %8s %4s %10s" % ( "gen", "sum", "avg", "min", "max", "base", "value", "pop", "secs/gen", ) print "%4d %8d %8d %8d %8d %8d %8d %4d %10.4f" % ( sorter.generation_count, int(timedelta_to_seconds(metrics.waiting_time_total) / 60), int(timedelta_to_seconds(metrics.waiting_time_avg) / 60), int(timedelta_to_seconds(metrics.waiting_time_min) / 60), int(timedelta_to_seconds(metrics.waiting_time_max) / 60), int(evalf(entries)), int(evalf(result)), len(sorter.population), sorter.time_per_generation, ) except KeyboardInterrupt: pass finally: transaction.rollback()