def grahp_isolines(f_index):
    low, up, dim = test_function_range.get_range(f_index)

    # точечный анимированный график для трехмерных функций
    if dim == 2:
        fig, ax = plt.subplots()
        # xdata, ydata = [], []
        # line, = ax.plot([], [], lw=2, color='b', linestyle=' ', marker='o', label='Агенты')
        plt.legend(loc='upper left')
        params = {
            'legend.fontsize': 'x-large',
            'figure.figsize': (15, 5),
            'axes.labelsize': 'large',
            'axes.titlesize': 'large',
            'xtick.labelsize': 'large',
            'ytick.labelsize': 'large'
        }
        plt.rcParams.update(params)
        X, Y, Z, levels = draw_isolines(low, up, dim, f_index, delta=0.1)
        # рисование графика изолиний исходной функции
        CS = plt.contour(X, Y, Z, levels=levels)
        name = "Функция F" + str(f_index)
        plt.title(name, loc='center', fontsize=18)
        ax.grid()
        # создание анимированного точечного графика
        # blit контролирует используется ли blitting. Если True не будет работать масштабирование и перемещение графика
        # ani = animation.FuncAnimation(fig, run, frames=data_gen(max_iter, coord), blit=False,
        #                               interval=rate_change_graph, repeat=False,
        #                               init_func=make_init(low, up, xdata, ydata, line, ax), fargs=(line,))

        plt.show()
def run_ICA(f_index, min_flag):
    num_of_countries = 200  # общее количество стран
    num_of_initial_imperialists = 10  # начальное количество империалистов
    revolution_rate = 0.3
    assimilation_coefficient = 2  # коэффициент ассимиляции "beta"
    assimilation_angle_coefficient = 0.5  # угловой коэффициент ассимиляции "gama"
    zeta = 0.02
    damp_ratio = 0.99
    stop_if_just_one_empire = False
    uniting_threshold = 0.02

    max_iter = 600
    epsilon = pow(10, -15)

    low, up, dim = get_range(f_index)
    ProblemParam = ProblemParams(dim, low, up, f_index, 0)

    AlgorithmParam = AlgorithmParams(num_of_countries,
                                     num_of_initial_imperialists, zeta,
                                     revolution_rate, damp_ratio,
                                     assimilation_coefficient,
                                     stop_if_just_one_empire,
                                     uniting_threshold)

    res = ICA(ProblemParam, AlgorithmParam, max_iter, min_flag, epsilon)

    func_best, agent_best, best_chart, mean_chart, coord_x, stop_iteration = res

    return func_best, agent_best, best_chart
def print_graph(f_index, rate_change_graph, coord, max_iter):
    low, up, dim = test_function_range.get_range(f_index)

    # точечный анимированный график для трехмерных функций
    if dim == 2:
        fig, ax = plt.subplots()
        xdata, ydata = [], []
        line, = ax.plot([], [],
                        lw=2,
                        color='b',
                        linestyle=' ',
                        marker='o',
                        label='Агенты')
        plt.legend(loc='upper left')
        X, Y, Z, levels = draw_isolines(low, up, dim, f_index)
        # рисование графика изолиний исходной функции
        CS = plt.contour(X, Y, Z, levels=levels)
        ax.grid()
        # создание анимированного точечного графика
        # blit контролирует используется ли blitting. Если True не будет работать масштабирование и перемещение графика
        ani = animation.FuncAnimation(fig,
                                      run,
                                      frames=data_gen(max_iter, coord),
                                      blit=False,
                                      interval=rate_change_graph,
                                      repeat=False,
                                      init_func=make_init(
                                          low, up, xdata, ydata, line, ax),
                                      fargs=(line, ))

        plt.show()
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("Работа завершена.")
Exemple #5
0
def main():
    num_of_countries = 200  # общее количество стран
    num_of_initial_imperialists = 10  # начальное количество империалистов
    revolution_rate = 0.3
    assimilation_coefficient = 2  # коэффициент ассимиляции "beta"
    assimilation_angle_coefficient = 0.5  # угловой коэффициент ассимиляции "gama"
    zeta = 0.02
    damp_ratio = 0.99
    stop_if_just_one_empire = False
    uniting_threshold = 0.02
    zarib = 1.05
    alpha = 0.1

    epsilon = pow(10, -20)

    max_iter = 100
    min_flag = 1  # 1 - минимизация, 0 - максимизация
    # скорость изменения графика, установите значение в милисекундах
    rate_change_graph = 500

    # индекс функции в файле test_function
    f_index = 10

    low, up, dim = test_function_range.get_range(f_index)
    ProblemParam = ProblemParams.ProblemParams(dim, low, up, f_index, 0)
    AlgorithmParam = AlgorithmParams.AlgorithmParams(
        num_of_countries, num_of_initial_imperialists, zeta, revolution_rate,
        damp_ratio, assimilation_coefficient, stop_if_just_one_empire,
        uniting_threshold)

    print("Подождите идут вычисления...")

    func_best, agent_best, best_chart, mean_chart, coord_x, stop_iteration = ICA(
        ProblemParam, AlgorithmParam, max_iter, min_flag, epsilon)

    print("-------------------------------")
    print("Лучший результат: " + str(func_best))
    print("Лучшее решение (точка, агент): " + str(agent_best))
    print("Лучшие решения на каждой итерации: " + str(best_chart))
    print("Среднее решений на каждой итерации: " + str(mean_chart))
    print("-------------------------------")

    graph.graph_motion_points_3d(f_index, rate_change_graph, coord_x, max_iter)

    graph.graph_best_chart(best_chart)

    graph.print_graph(f_index, rate_change_graph, coord_x, max_iter)
def graph_motion_points_3d(f_index, rate_change_graph, coord, max_iter):
    low, up, dim = test_function_range.get_range(f_index)

    fig = plt.figure()
    # ax = Axes3D(fig)
    ax = fig.add_subplot(111, projection='3d')
    # ax = fig.gca(projection='3d')
    xdata, ydata, zdata = [], [], []
    # line, = ax.scatter([], [], [], lw=2, color='b', marker='o', label='Агенты') # linestyle='-'
    # line, = ax.scatter([], [], [], marker='o')
    # line, = ax.plot([], [], [], linestyle="", marker="o", color='b')
    line = ax.scatter([], [], [], marker='o', color='r', label='Агенты')

    plt.legend(loc='upper left')

    # получение данных для рисования фона
    X, Y, Z = get_data_func_3d(f_index, delta=0.1)

    # рисование 3D графика исходной функции как фон
    # plot_surface - сплошная поверхность с подсветкой высот, contour3D - сетка с подсветкой высот (изолинии)
    # plot_wireframe - сетка одного цвета
    ax.plot_surface(X, Y, Z, rstride=4, cstride=4, cmap=cm.jet, alpha=0.5)
    ax.grid()

    # создание анимированного точечного графика
    # blit контролирует используется ли blitting. Если True не будет работать масштабирование и перемещение графика
    ani = animation.FuncAnimation(
        fig,
        run_3d,
        frames=data_gen_for_3d_func(max_iter, coord, f_index, dim),
        blit=False,
        interval=rate_change_graph,
        repeat=False,
        init_func=make_init_3d(low, up, xdata, ydata, zdata, ax, line),
        fargs=(line, ax))

    plt.show()
def get_data_func_3d(f_index, delta=0.2):
    low, up, dim = test_function_range.get_range(f_index)

    X, Y, Z = get_data(delta, low, up, f_index, dim)

    return X, Y, Z
def SAC(f_index, max_iter, N, min_flag, nuclear_func_index, selectivity_factor,
        gamma, q, epsilon):
    low, up, dimension = test_function_range.get_range(f_index)

    stop_iteration = max_iter
    best_chart = []
    mean_chart = []

    coord_x = 0
    coord_x_test = 0

    if dimension == 2:
        # массив для сохранения прогресса координат решений
        coord_x = np.empty((max_iter, 1, dimension))
        coord_x_test = np.empty((max_iter, N, dimension))

    X = initialization_X_0(low, up, dimension)

    delta_X_0 = np.array([(up - low) / 2])

    # delta_X = np.zeros((dimension, ))

    delta_X = delta_X_0

    for i in range(max_iter):
        iteration = i + 1

        if iteration == 1:
            test_points = initialization_test_points(N, dimension, delta_X_0,
                                                     X)
            fitness_test_points, fitness_operating_point = evaluate_function(
                X, test_points, f_index)
        else:
            test_points = initialization_test_points(N, dimension, delta_X, X)
            fitness_test_points, fitness_operating_point = evaluate_function(
                X, test_points, f_index)

        if dimension == 2:
            coord_x[i] = X.copy()
            coord_x_test[i] = test_points.copy()

        if min_flag == 1:
            # лучшее решение
            best = np.min(fitness_test_points)
            # лучшее положение (точка, агент)
            best_x = np.argmin(fitness_test_points)
        else:
            best = np.max(fitness_test_points)
            best_x = np.argmax(fitness_test_points)

        if iteration == 1:
            # лучшее значение функции
            func_best = best
            # лучший агент
            agent_best = test_points[best_x, :]

        if min_flag == 1:
            # минимизация
            if best < func_best:
                func_best = best
                agent_best = test_points[best_x, :]
        else:
            # максимизация
            if best > func_best:
                func_best = best
                agent_best = test_points[best_x, :]

        # сохранение лучших и средних решений на итерации
        # best_chart.append(func_best)
        best_chart.append(fitness_operating_point)
        mean_chart.append(np.mean(fitness_test_points))

        g = find_g(test_points, fitness_test_points, min_flag)

        nuclear_func = nuclear_function_K(g, nuclear_func_index,
                                          selectivity_factor)

        X, delta_X = move(delta_X, X, test_points, nuclear_func, q)

        # delta_X = size_area_search_calculation(delta_X, gamma, q, nuclear_func, N)

        last_value_func = fitness_operating_point

        # if iteration > 2:
        #     break_point = break_check(best_chart, epsilon, delta_X)
        #     if break_point:
        #         stop_iteration = iteration
        #         break

    return func_best, agent_best, best_chart, mean_chart, coord_x, stop_iteration, last_value_func, coord_x_test
Exemple #9
0
def GSA(f_index, N, max_iter, elitist_check, min_flag, r_power):
    r_norm = 2
    low, up, dimension = test_function_range.get_range(f_index)

    # if dimension == 2:
        # массив для сохранения прогресса координат решений
    coord = np.empty((max_iter, N, dimension))

    X = initialization(dimension, N, up, low)

    velocity = np.zeros((N, dimension))

    best_chart = []
    mean_chart = []

    for i in range(max_iter):
        iteration = i + 1

        # print("Началась " + str(iteration) + " итерация алгоритма.")

        # проверка выхода за границы поиска
        X = space_bound(X, up, low)
        # расчет значений функции качества (минимизируемой или максимизируемой функции)
        fit = evaluate_function(X, f_index)

        if dimension == 2:
            coord[i] = X.copy()

        if min_flag == 1:
            # лучшее решение
            best = np.min(fit)
            # лучшее положение (точка, агент)
            best_x = np.argmin(fit)
        else:
            best = np.max(fit)
            best_x = np.argmax(fit)

        if iteration == 1:
            # лучшее значение функции
            func_best = best
            # лучший агент
            agent_best = X[best_x, :]

        if min_flag == 1:
            # минимизация
            if best < func_best:
                func_best = best
                agent_best = X[best_x, :]
        else:
            # максимизация
            if best > func_best:
                func_best = best
                agent_best = X[best_x, :]

        # сохранение лучших и средних решений на итерации
        best_chart.append(func_best)
        mean_chart.append(np.mean(fit))

        # расчет масс, гравитационной постоянной, ускорения
        mass = mass_calculation(fit, min_flag)
        G = G_constant(iteration, max_iter)
        a = acceleration_calc(X, mass, G, r_norm, r_power, elitist_check, iteration, max_iter)
        # расчет скорости и нового положения
        X, velocity = move(X, a, velocity)

    return func_best, agent_best, best_chart, mean_chart, coord
Exemple #10
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