def evaluate_function(X, test_points, f_index):
    N = len(test_points)
    dim = len(test_points[0])

    fitness_test_points = np.zeros(N)

    # расчет значения функции в центральной точке
    fitness_operating_point = test_function.test_function(X, f_index, dim)

    for i in range(N):
        x_i = test_points[i, :]
        fitness_test_points[i] = test_function.test_function(x_i, f_index, dim)

    return fitness_test_points, fitness_operating_point
示例#2
0
def draw_isolines(low, up, dimension, f_index, delta=0.15):

    # delta = 0.15
    # для 4 функции 0.05

    if (type(up) == int) or (type(up) == float):
        x = np.arange(low, up, delta)
        y = np.arange(low, up, delta)
    else:
        x = np.arange(low[0], up[0], delta)
        y = np.arange(low[1], up[1], delta)

    X, Y = np.meshgrid(x, y)

    Z = test_function.test_function(np.array([X, Y]), f_index, dimension)

    levels = np.arange(np.min(Z), np.max(Z), delta)  # * 65

    # CS = plt.contour(X, Y, Z, levels=levels)
    # CS = plt.contour(X, Y, Z)
    # plt.clabel(CS, fmt="%1.1f", inline=1, fontsize=3)
    # plt.title("График изолиний функции F" + str(f_index))
    # plt.show()

    return X, Y, Z, levels
示例#3
0
def evaluate_function(X, f_index):
    N = len(X)
    dim = len(X[0])

    fit = np.zeros(N)

    for i in range(N):
        x_i = X[i, :]
        fit[i] = test_function.test_function(x_i, f_index, dim)

    return fit
示例#4
0
def optimization(empire, gamma, ProblemParam):
    """ Функция оптимизации положения империалиста (столицы).
        optization(empire, gamma, ProblemParam) -> empire
            Оптимизация осуществляется в небольшой окрестности.
            Окрестность (delta) расчитывается как gamma * best, 
        где gamma - настраеваемый параметр алгоритма (gamma < 1)
            best  - евклидово расстояние до ближайшей колонии.
            В случае, если у империалиста отсутствуют колонии область поиска определяется как gamma * gamma.
            Потенциальная позиция для перемещения выбирается случаынйм образом в данной окрестности:
        potential_position[i] = empire.imperialist_position[i] + np.random.uniform(-1, 1) * delta.
            Пригодность потенциального положения определяется путем расчета значения функции качества в этой точке,
        если оно [значение функции качества] меньше значения функции качества в текущей точке 
        происходит передвижение империалиста, в противном случае империалист не перемещается.
        --------------------------------------------------------
            Параметры:
        @param empire       - объект класса "Empires", 
                              необходимы поля - imperialist_position, colonies_position и imperialist_fitness
        @param gamma        - настраеваемый параметр алгоритма (0 < gamma < 1), число.
        @param ProblemParam - объект класса "ProblemParams"
            Возвращаемые значения:
        @return empire      - объект класса "Empires"
    """
    num_colonies = len(empire.colonies_position)

    if num_colonies == 0:
        best = gamma

    # поиск самой ближайшей колонии
    for i in range(num_colonies):
        distance_vector = empire.imperialist_position - empire.colonies_position[
            i]
        distance = np.linalg.norm(distance_vector)
        if i == 0:
            best = distance
        if best > distance:
            best = distance

    # Определение радиуса поисковой области
    delta = gamma * best

    potential_position = np.zeros(len(empire.imperialist_position))
    for i in range(len(empire.imperialist_position)):
        potential_position[i] = empire.imperialist_position[
            i] + np.random.uniform(-1, 1) * delta

    potential_fit = test_function.test_function(
        potential_position, ProblemParam.test_function_index,
        ProblemParam.dimention)

    if potential_fit < empire.imperialist_fitness:
        empire.imperialist_position = potential_position
        empire.imperialist_fitness = potential_fit

    return empire
示例#5
0
def data_gen_for_3d_func(max_iter, coord, f_index, dimension, num=0):
    while num < max_iter:
        # не работает если написать так np.zeros((len(coord[num]), 1))
        xlist = np.zeros((len(coord[num]), ))
        ylist = np.zeros((len(coord[num]), ))
        zlist = np.zeros((len(coord[num]), ))
        for j in range(len(coord[num])):
            xlist[j] = coord[num][j][0]
            ylist[j] = coord[num][j][1]
            zlist[j] = test_function.test_function(coord[num][j], f_index,
                                                   dimension)
        num = num + 1
        yield xlist, ylist, zlist
示例#6
0
def get_data(delta, low, up, f_index, dimension):
    if (type(up) == int) or (type(up) == float):
        x = np.arange(low, up, delta)
        y = np.arange(low, up, delta)
    else:
        x = np.arange(low[0], up[0], delta)
        y = np.arange(low[1], up[1], delta)

    X, Y = np.meshgrid(x, y)

    Z = test_function.test_function(np.array([X, Y]), f_index, dimension)

    return X, Y, Z
def optimization(f_index, min_flag):
    print("Запущен алгоритм селективного усреднения координат...")
    func_best_SAC, agent_best_SAC, best_chart_SAC = run_SAC(f_index, min_flag)
    print("Запущен алгоритм гравитационного поиска...")
    func_best_GSA, agent_best_GSA, best_chart_GSA = run_GSA(f_index, min_flag)
    print("Запущен империалистический конкурентный алгоритм...")
    func_best_ICA, agent_best_ICA, best_chart_ICA = run_ICA(f_index, min_flag)

    func_best = np.array([func_best_SAC, func_best_GSA, func_best_ICA])
    agent_best = np.array([agent_best_SAC, agent_best_GSA, agent_best_ICA])

    comparative_graph_convergence(f_index,
                                  SAC=best_chart_SAC,
                                  GSA=best_chart_GSA,
                                  ICA=best_chart_ICA)

    grahp_isolines(f_index)

    # print(str(func_best))
    # print(str(agent_best))

    # func_best, agent_best, best_chart, mean_chart, coord_x, stop_iteration, last_value_func, coord_x_test = result_SAC
    # func_best, agent_best, best_chart, mean_chart, coord = result_GSA
    # func_best, agent_best, best_chart, mean_chart, coord_x, stop_iteration = result_ICA

    low, up, dim = get_range(f_index)

    while len(func_best) > 1:

        min_fit = np.min(func_best)
        arg_min = np.argmin(func_best)

        if np.all(agent_best[arg_min] > low) and np.all(
                agent_best[arg_min] < up):
            min_test = test_function.test_function(agent_best[arg_min],
                                                   f_index, dim)
            if min_test <= min_fit:
                print("Лучший результат: " + str(min_test))
                print("Лучшая точка: " + str(agent_best[arg_min]))
                if arg_min == 0:
                    print("Алгоритм селективного усреднения")
                elif arg_min == 1:
                    print("Алгоритм гравитационного поиска")
                elif arg_min == 2:
                    print("Империалистический конкурентный алгоритм")
                break
        else:
            func_best = np.delete(func_best, [arg_min])
            agent_best = np.delete(agent_best, [arg_min])

    print("Работа завершена.")
示例#8
0
def ICA(ProblemParam, AlgorithmParam, max_iter, min_flag, epsilon):
    low, up, dimension = test_function_range.get_range(
        ProblemParam.test_function_index)
    min_limit, max_limit, search_space_size = modifying_size_search_space(
        low, up, dimension)

    ProblemParam.max_limit_search = max_limit
    ProblemParam.min_limit_search = min_limit
    ProblemParam.search_space_size = search_space_size

    num_of_all_colonies = AlgorithmParam.num_of_countries - AlgorithmParam.num_of_initial_imperialists

    coord = np.empty((max_iter, AlgorithmParam.num_of_countries, dimension))

    # ----------Создание первоначальных империй----------
    initial_сountries = generate_new_country(AlgorithmParam.num_of_countries,
                                             min_limit, max_limit)
    # расчет приспособленности (стоимости) каждой страны
    initial_fitness_country = np.zeros(AlgorithmParam.num_of_countries)
    for i in range(AlgorithmParam.num_of_countries):
        initial_fitness_country[i] = test_function.test_function(
            initial_сountries[i], ProblemParam.test_function_index, dimension)

    # сортировка по убыванию
    ind_fitness_country = np.argsort(initial_fitness_country)[::-1]
    initial_fitness_country = np.sort(initial_fitness_country)[::-1]
    # initial_сountries = np.take(initial_сountries, ind_fitness_country, axis=0)
    initial_сountries_t = np.array([
        initial_сountries[ind_fitness_country[i]]
        for i in range(len(ind_fitness_country))
    ])
    initial_сountries = initial_сountries_t

    empires = create_initial_empires(initial_сountries,
                                     initial_fitness_country, ProblemParam,
                                     AlgorithmParam)
    # ---------------------------------------------------

    # Главный цикл алгоритма
    min_fitness = np.zeros((max_iter, ))
    mean_fitness = np.zeros((max_iter, ))

    # best_chart = np.zeros(max_iter)
    # mean_chart = np.zeros(max_iter)
    best_chart = []
    mean_chart = []
    coord_x = np.zeros((max_iter, 1, dimension))
    stop_iteration = max_iter

    for i in range(max_iter):
        iteration = i + 1
        AlgorithmParam.revolution_rate = AlgorithmParam.revolution_rate * AlgorithmParam.damp_ratio
        remained = max_iter - iteration

        imperialist_fit = np.zeros(len(empires))
        for j in range(len(empires)):
            imperialist_fit[j] = empires[j].imperialist_fitness
        best = np.min(imperialist_fit)
        best_x = np.argmin(imperialist_fit)
        if iteration == 1:
            # лучшее значение функции
            func_best = best
            # лучший агент
            agent_best = empires[best_x].imperialist_position
        if best < func_best:
            func_best = best
            agent_best = empires[best_x].imperialist_position

        best_chart.append(func_best)
        coord_x[i][0] = agent_best
        mean_chart.append(np.mean(imperialist_fit))

        for j in range(len(empires)):
            empires[j] = optimization(empires[j], 0.1, ProblemParam)

            # Ассимиляция. Движение колоний к империалистам
            empires[j] = assimilate_colonies(empires[j], ProblemParam,
                                             AlgorithmParam)

            # Революция
            empires[j] = revolve_colonies(empires[j], ProblemParam,
                                          AlgorithmParam)

            # Расчет новой стоимости стран (приспособленности)
            fit = np.zeros(len(empires[j].colonies_position))
            for k in range(len(empires[j].colonies_position)):
                x_i = empires[j].colonies_position[k]
                fit[k] = test_function.test_function(
                    x_i, ProblemParam.test_function_index, dimension)
            empires[j].colonies_fitness = fit

            empires[j] = prosses_empire(empires[j])

            # Вычисление общей стоимости (приспособленности) империи
            if empires[j].colonies_fitness.size == 0:
                empires[j].total_fitness = empires[j].imperialist_fitness
            else:
                empires[j].total_fitness = empires[
                    j].imperialist_fitness + AlgorithmParam.zeta * np.mean(
                        empires[j].colonies_fitness)

        # слияние империй
        empires = unite_simular_empires(empires, ProblemParam, AlgorithmParam)

        # империалистическая конкуренция
        empires = imperialistic_competition(empires)

        if (len(empires) == 1) and (AlgorithmParam.stop_if_just_one_empire):
            break
        # if iteration > 11:
        #     break_point = check_break(best_chart, epsilon)
        #     if break_point:
        #         stop_iteration = iteration
        #         break

    return func_best, agent_best, best_chart, mean_chart, coord_x, stop_iteration
示例#9
0
def create_initial_empires(initial_сountries, initial_fitness_country,
                           ProblemParam, AlgorithmParam):
    """
    Функция инициализации империй (точек с лучшим значенийм функции качества (стоимостью)).
    
    Параметры:
    :param initial_сountries: Набор координат стран, составленный в порядке убывания их значения функции качества. 
            Двумерный массив. 
    :type initial_сountries: numpy.array
    
    :param initial_fitness_country: Набор значений функции качетва (стоимостей) стран, 
            отсортированный в порядке убывания. Одномерный массив-строка.
    :type initial_fitness_country: numpy.array
    
    :param ProblemParam: Объект хранящий параметры задачи оптимизации. Объект класса ProblemParams.
            Имеет поля:
            dimention:           Размерность (количество переменных) целевой функции типа int.
            min_limit_search:    Нижняя граница области поиска экстремума. Одномерный массив-строка типа numpy.array.
            max_limit_search:    Верхняя граница области поиска экстремума. Одномерный массив-строка типа numpy.array.
            test_function_index: Номер тестовой функции из файла test_function.
            search_space_size:   Размер области поиска экстремума. Одномерный массив-строка типа numpy.array.
    :type ProblemParam: ProblemParams
    
    :param AlgorithmParam: Объект хранящий параметры алгоритма. Объект класса AlgorithmParams.
            Имеет поля:
            num_of_initial_imperialists: Изначальное количество империалистов, целое число.
            num_of_countries:            Количество стран, целое число.
            zeta:                        Коэффициент для расчета общей ценности империи, 
                                         характеризует влияние стоимостей колоний на общую стоимость империи.
            revolution_rate:             ?????
            damp_ratio:                  Процент колиний подвернувшихся революции.
            assimilation_coefficient:    Коэффициент ассимиляции, 
                                         характеризует процент максимально возможного шага колонии за одну итерацию.
            stop_if_just_one_empire:     True - алгоритм можно завершить если останеться только один империалист,
                                         False - иначе.
            uniting_threshold:           Величина расстояния между двумя империалистами 
                                         при которой произойдет слияние их империй.
    :type AlgorithmParam: AlgorithmParams
    
    :return empires: Список хрянящий объекты класса Empires.
    """
    num_all_colonies = AlgorithmParam.num_of_countries - AlgorithmParam.num_of_initial_imperialists
    num_init_imper = AlgorithmParam.num_of_initial_imperialists

    all_imperialists_position = initial_сountries[:num_init_imper]
    all_imperialists_fitness = initial_fitness_country[:num_init_imper]

    all_colonies_position = initial_сountries[num_init_imper:]
    all_colonies_fitness = initial_fitness_country[num_init_imper:]

    if np.max(all_imperialists_fitness) > 0:
        all_imperialists_power = 1.3 * np.max(
            all_imperialists_fitness) - all_imperialists_fitness
    else:
        all_imperialists_power = 0.7 * np.max(
            all_imperialists_fitness) - all_imperialists_fitness

    power_norm = all_imperialists_power / np.sum(all_imperialists_power)
    all_imperialists_num_colonies = np.round(power_norm * num_all_colonies)
    # последнее значение это число всех стран за минусом уже распределенных
    all_imperialists_num_colonies[-1] = num_all_colonies - np.sum(
        all_imperialists_num_colonies[:-1])

    random_index = np.random.permutation(num_all_colonies)
    empires = []

    for i in range(AlgorithmParam.num_of_initial_imperialists):
        imp_pos = all_imperialists_position[i]
        imp_fit = all_imperialists_fitness[i]
        rand = random_index[:int(all_imperialists_num_colonies[i])]
        colonies_pos = all_colonies_position[rand]
        colonies_fit = all_colonies_fitness[rand]
        total_fit = imp_fit + AlgorithmParam.zeta * np.mean(colonies_fit)
        Empire = Empires.Empires(imp_pos, imp_fit, colonies_pos, colonies_fit,
                                 total_fit)
        empires.append(Empire)

    for i in range(len(empires)):
        if len(empires[i].colonies_position) == 0:
            empires[i].colonies_position = generate_new_country(
                1, ProblemParam.min_limit_search,
                ProblemParam.max_limit_search)
            empires[i].colonies_fitness = [
                test_function.test_function(empires[i].colonies_position[0],
                                            ProblemParam.test_function_index,
                                            ProblemParam.dimention)
            ]

    return empires