def run(self): # Сгенерируем популяцию мамонтов. # Тут, конечно, эффективнее было бы воспользоваться генератором, а не запоминать все в памяти mammoth_list = [MetaHeuristic.generateRandomSchedule(self._n, self._m, self._k, self._totalGroups) for mammoth in xrange(MAMMOTH_COUNT)] # Зададим нашу функцию, которую мы хотим оптимизировать optimization_func = getattr(self, self._funcName) def sorting_func(x, y): """ Функция сравнения двух особей для сортировки их списка и отбрасывания ненужных """ return cmp(optimization_func(x), optimization_func(y)) # Дальше ход алгоритма for iteration in xrange(MAX_ITERATION): print "iteration: %s\n"%iteration for mammoth in mammoth_list: # self.__crossing() self.__mutation(mammoth) # Селекция. Для начала, берем первые 5 лучших temp_mammoths = sorted(mammoth_list, cmp=sorting_func)[:5] # Прицепим еще 5 рандомных к мутированным for i in xrange(5): temp_mammoths.append(MetaHeuristic.generateRandomSchedule(self._n, self._m, self._k, self._totalGroups)) mammoth_list = temp_mammoths # запомним лучший результат self.function_result = optimization_func(mammoth_list[0]) # Возвращаем лучшую из найденных особей return mammoth_list[0]
def __init__(self, n, m, k, totalgroups, func): self.position = MetaHeuristic.generateRandomSchedule( n, m, k, totalgroups) self.velocity = [[[0.0 for i in xrange(k)] for j in xrange(totalgroups)] for k in xrange(m)] self.error = error(self.position, func) self.best_part_pos = copy.copy(self.position) self.best_part_err = self.error
def run(self): # Сгенерируем популяцию мамонтов. # Тут, конечно, эффективнее было бы воспользоваться генератором, а не запоминать все в памяти mammoth_list = [ MetaHeuristic.generateRandomSchedule(self._n, self._m, self._k, self._totalGroups) for mammoth in xrange(MAMMOTH_COUNT) ] # Зададим нашу функцию, которую мы хотим оптимизировать optimization_func = getattr(self, self._funcName) def sorting_func(x, y): """ Функция сравнения двух особей для сортировки их списка и отбрасывания ненужных """ return cmp(optimization_func(x), optimization_func(y)) # Дальше ход алгоритма for iteration in xrange(MAX_ITERATION): print "iteration: %s\n" % iteration for mammoth in mammoth_list: # self.__crossing() self.__mutation(mammoth) # Селекция. Для начала, берем первые 5 лучших temp_mammoths = sorted(mammoth_list, cmp=sorting_func)[:5] # Прицепим еще 5 рандомных к мутированным for i in xrange(5): temp_mammoths.append( MetaHeuristic.generateRandomSchedule( self._n, self._m, self._k, self._totalGroups)) mammoth_list = temp_mammoths # запомним лучший результат self.function_result = optimization_func(mammoth_list[0]) # Возвращаем лучшую из найденных особей return mammoth_list[0]
def run(self): # Возьмем случайное расписание schedule = MetaHeuristic.generateRandomSchedule( self._n, self._m, self._k, self._totalGroups) # Обзовем его текущим лучшим best_schedule = schedule # Зададим начальную температуру temperature = START_TEMPERATURE # введем распределение вероятности принятия нового состояния h = lambda T, delE: 1 / (1 + math.exp(-delE / T)) # введем функцию понижения температуры decrease_temperature = lambda T, iteration: T * math.exp( -DECREMENT * math.pow(iteration, 1 / (self._m * self._k))) # Зададим нашу функцию, которую мы хотим оптимизировать optimization_func = getattr(self, self._funcName) best_function_result = 0 # Пока температура не опустилась, выполняем алгоритм iteration = 0 while temperature > COOL: self.__move_to_new_tours(schedule, temperature) if optimization_func(schedule) < best_function_result: best_schedule = schedule else: if random.random() > h( temperature, optimization_func(schedule) - best_function_result): schedule = best_schedule else: best_schedule = schedule best_function_result = optimization_func(schedule) print "best_function_result: %s" % best_function_result temperature = decrease_temperature(temperature, iteration) print "temperature: %s" % temperature iteration += 1 self.function_result = best_function_result return best_schedule
def run(self): # Возьмем случайное расписание schedule = MetaHeuristic.generateRandomSchedule(self._n, self._m, self._k, self._totalGroups) # Обзовем его текущим лучшим best_schedule = schedule # Зададим начальную температуру temperature = START_TEMPERATURE # введем распределение вероятности принятия нового состояния h = lambda T, delE: 1 / (1 + math.exp(-delE / T)); # введем функцию понижения температуры decrease_temperature = lambda T, iteration: T*math.exp(-DECREMENT * math.pow(iteration, 1/(self._m*self._k))) # Зададим нашу функцию, которую мы хотим оптимизировать optimization_func = getattr(self, self._funcName) best_function_result = 0 # Пока температура не опустилась, выполняем алгоритм iteration = 0 while temperature > COOL: self.__move_to_new_tours(schedule, temperature) if optimization_func(schedule) < best_function_result: best_schedule = schedule else: if random.random() > h(temperature, optimization_func(schedule) - best_function_result): schedule = best_schedule else: best_schedule = schedule best_function_result = optimization_func(schedule) print "best_function_result: %s"%best_function_result temperature = decrease_temperature(temperature, iteration) print "temperature: %s"%temperature iteration += 1 self.function_result = best_function_result return best_schedule
def __move_to_new_tours(self, schedule, temperature): """ Функция случайного выбора следующего тура на основе текущей вероятности TODO: add serious implementation """ alpha = random.random() # на самом деле, поскольку пример алгоритма был для коэффициента движения # по доске координаты, то тут он особо не имеет смысла. Поэтому мы на основе # коэффициента, раз он зависит от температуры, будем просто принимать решение # о генерации нового тура. Конечно, эффективность будет очевидно снижена. z = (math.pow((1 + 1/temperature), (2 * alpha - 1)) - 1) * temperature; print "ZZZZ: %s\n\n"%z tour = random.choice(range(self._m)) group = random.choice(range(self._totalGroups)) if z > MAGIC_CONSTANT: random.shuffle(schedule[tour][group]) else: schedule = MetaHeuristic.generateRandomSchedule(self._n, self._m, self._k, self._totalGroups)
def __move_to_new_tours(self, schedule, temperature): """ Функция случайного выбора следующего тура на основе текущей вероятности TODO: add serious implementation """ alpha = random.random() # на самом деле, поскольку пример алгоритма был для коэффициента движения # по доске координаты, то тут он особо не имеет смысла. Поэтому мы на основе # коэффициента, раз он зависит от температуры, будем просто принимать решение # о генерации нового тура. Конечно, эффективность будет очевидно снижена. z = (math.pow((1 + 1 / temperature), (2 * alpha - 1)) - 1) * temperature print "ZZZZ: %s\n\n" % z tour = random.choice(range(self._m)) group = random.choice(range(self._totalGroups)) if z > MAGIC_CONSTANT: random.shuffle(schedule[tour][group]) else: schedule = MetaHeuristic.generateRandomSchedule( self._n, self._m, self._k, self._totalGroups)
def __init__(self, n, m, k, totalgroups, func): self.position = MetaHeuristic.generateRandomSchedule(n, m, k, totalgroups) self.velocity = [[[0.0 for i in xrange(k)] for j in xrange(totalgroups)] for k in xrange(m)] self.error = error(self.position, func) self.best_part_pos = copy.copy(self.position) self.best_part_err = self.error