Пример #1
0
	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]
Пример #2
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
Пример #3
0
    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]
Пример #4
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
Пример #5
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
Пример #6
0
	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) 
Пример #7
0
    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)
Пример #8
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