Роевой интеллект в Python
(Генетический алгоритм, оптимизация роя частиц, имитация отжига, алгоритм муравьиной колонии, иммунный алгоритм, алгоритм искусственного роя рыб на Python)
Документация: https://scikit-opt.github.io/scikit-opt/#/en/
Источник: https://scikit-opt.github.io/scikit-opt/#/zh/
Исходный код: https://github.com/guofei9987/scikit-opt.
Помогите нам улучшить scikit-opt https://www.wjx.cn/jq/50964691.aspx
pip install scikit-opt
Для текущей версии для разработчиков:
git clone [email protected]:guofei9987/scikit-opt.git
cd scikit-opt
pip install .
UDF (пользовательская функция) доступна уже сейчас!
Например, вы только что разработали новый тип функции selection
.
Теперь ваша функция selection
выглядит следующим образом:
-> Демо-код: example/demo_ga_udf.py#s1
# шаг 1: определите свой собственный оператор: def choice_tournament(algorithm, Tourn_size):FitV = алгоритм.FitVsel_index = []for i in range(algorithm.size_pop):aspirants_index = np.random.choice(range(algorithm.size_pop), size =tourn_size)sel_index.append(max(aspirants_index, key=lambda i: FitV[i]))algorithm.Chrom = алгоритм.Chrom[sel_index, :] # алгоритм возврата следующего поколения.Chrom
Импортируйте и создайте ga
-> Демо-код: example/demo_ga_udf.py#s2
импортировать numpy как npfrom sko.GA import GA, GA_TSPdemo_func = лямбда x: x[0] ** 2 + (x[1] - 0,05) ** 2 + (x[2] - 0,5) ** 2ga = GA(func =demo_func, n_dim=3, size_pop=100, max_iter=500, prob_mut=0.001,lb=[-1, -10, -5], ub=[2, 10, 2], точность=[1e-7, 1e-7, 1])
Зарегистрируйте свой UDF в GA
-> Демо-код: example/demo_ga_udf.py#s3
ga.register(operator_name='selection',operator=selection_tournament,tourn_size=3)
scikit-opt также предоставляет некоторые операторы
-> Демо-код: example/demo_ga_udf.py#s4
из sko.operators импортирует рейтинг, выбор, кроссовер,mutationga.register(operator_name='ranking',operator=ranking.ranking). зарегистрировать(имя_оператора='кроссовер', оператор=кроссовер.кроссовер_2точка). зарегистрировать (имя_оператора = 'мутация', оператор = мутация.мутация)
Теперь делайте GA как обычно
-> Демо-код: example/demo_ga_udf.py#s5
best_x, best_y = ga.run()print('best_x:', best_x, 'n', 'best_y:', best_y)
До сих пор
crossover
udf surport,mutation
,selection
,ranking
GA scikit-opt предоставляют дюжину операторов, см. здесь.
Для продвинутых пользователей:
-> Демо-код: example/demo_ga_udf.py#s6
класс MyGA(GA):def choice(self, Tourn_size=3):FitV = self.FitVsel_index = []для i в диапазоне(self.size_pop):aspirants_index = np.random.choice(range(self.size_pop), size =tourn_size)sel_index.append(max(aspirants_index, key=lambda i: FitV[i]))self.Chrom = self.Chrom[sel_index, :] # возврат следующего поколения self.Chromranking = Ranking.rankingdemo_func = лямбда x: x[0] ** 2 + (x[1] - 0,05) ** 2 + (x[2] - 0,5) ** 2my_ga = MyGA(func=demo_func, n_dim=3, size_pop=100, max_iter=500, lb=[-1, -10, -5], ub=[2, 10, 2], точность=[1e-7, 1e-7, 1])best_x, best_y = my_ga.run() print('best_x:', best_x, 'n', 'best_y:', best_y)
(Новое в версии 0.3.6)
Запустите алгоритм на 10 итераций, а затем запустите еще 20 итераций на основе предыдущих 10 итераций:
из sko.GA import GAfunc = лямбда x: x[0] ** 2ga = GA(func=func, n_dim=1)ga.run(10)ga.run(20)
векторизация
многопоточность
многопроцессорность
кэшированный
см. https://github.com/guofei9987/scikit-opt/blob/master/examples/example_function_modes.py.
Мы разрабатываем вычисления на графическом процессоре, которые будут стабильны в версии 1.0.0.
Пример уже доступен: https://github.com/guofei9987/scikit-opt/blob/master/examples/demo_ga_gpu.py.
Шаг 1 : определите свою проблему
-> Демо-код: example/demo_de.py#s1
'''min f(x1, x2, x3) = x1^2 + x2^2 + x3^2s.t. x1*x2 >= 1 x1*x2 <= 5 x2 + x3 = 1 0 <= x1, x2, x3 <= 5'''def obj_func(p):x1, x2, x3 = preturn x1 ** 2 + x2 ** 2 + x3 ** 2constraint_eq = [лямбда x: 1 - x[1] - x[2] ]constraint_ueq = [лямбда x: 1 - x[0] * x[1],лямбда x: x[0] * x[1] - 5]
Шаг 2 : выполните дифференциальную эволюцию
-> Демо-код: example/demo_de.py#s2
из sko.DE import DEde = DE(func=obj_func, n_dim=3, size_pop=50, max_iter=800, lb=[0, 0, 0], ub=[5, 5, 5],constraint_eq=constraint_eq, ограничение_ueq =constraint_ueq)best_x, best_y = de.run()print('best_x:', best_x, 'n', 'best_y:', best_y)
Шаг 1 : определите свою проблему
-> Демо-код: example/demo_ga.py#s1
import numpy as npdef schaffer(p):''' Эта функция имеет множество локальных минимумов, с сильными потрясениями глобального минимума в (0,0) со значением 0 https://en.wikipedia.org/wiki/Test_functions_for_optimization ''' x1, x2 = ppart1 = np.square(x1) - np.square(x2)part2 = np.square(x1) + np.square(x2)return 0,5 + (np.square(np.sin(part1)) - 0,5) / np.square(1 + 0,001 * part2)
Шаг 2 : выполните генетический алгоритм
-> Демо-код: example/demo_ga.py#s2
из sko.GA import GAga = GA(func=schaffer, n_dim=2, size_pop=50, max_iter=800, prob_mut=0.001, lb=[-1, -1], ub=[1, 1], точность=1e -7)best_x, best_y = ga.run()print('best_x:', best_x, 'n', 'best_y:', best_y)
-> Демо-код: example/demo_ga.py#s3
импортировать панд как pdimport matplotlib.pyplot как pltY_history = pd.DataFrame(ga.all_history_Y)fig, ax = plt.subplots(2, 1)ax[0].plot(Y_history.index, Y_history.values, '.', color='red')Y_history.min(axis=1).cummin().plot(kind='line')plt.show()
Просто импортируйте GA_TSP
, он перегружает crossover
, mutation
для решения TSP.
Шаг 1 : определите свою проблему. Подготовьте координаты точек и матрицу расстояний.
Здесь я генерирую данные случайным образом в качестве демонстрации:
-> Демо-код: example/demo_ga_tsp.py#s1
import numpy as npfrom scipy import пространственный импорт matplotlib.pyplot as pltnum_points = 50points_coordinate = np.random.rand(num_points, 2) # генерировать координаты точекdistance_matrix = пространственный.distance.cdist(points_coordinate,points_coordinate, metric='euclidean')def Cal_total_distance(routine):'''Целевая функция. процедура ввода, возврат общего расстояния. Cal_total_distance(np.arange(num_points)) '''num_points, = подпрограмма.shapereturn sum([distance_matrix[рутина[i % num_points], подпрограмма[(i + 1) % num_points]] для i в диапазоне(num_points)])
Шаг 2 : сделайте GA
-> Демо-код: example/demo_ga_tsp.py#s2
из sko.GA import GA_TSPga_tsp = GA_TSP(func=cal_total_distance, n_dim=num_points, size_pop=50, max_iter=500,prob_mut=1)best_points, best_distance = ga_tsp.run()
Шаг 3 : Постройте результат:
-> Демо-код: example/demo_ga_tsp.py#s3
fig, ax = plt.subplots(1, 2)best_points_ = np.concatenate([best_points, [best_points[0]]])best_points_coordinate = point_coordinate[best_points_, :]ax[0].plot(best_points_coordinate[:, 0] , best_points_coordinate[:, 1], 'или')ax[1].plot(ga_tsp.generation_best_Y)plt.show()
Шаг 1 : определите свою проблему:
-> Демо-код: example/demo_pso.py#s1
def demo_func(x):x1, x2, x3 = xreturn x1 ** 2 + (x2 - 0,05) ** 2 + x3 ** 2
Шаг 2 : сделайте PSO
-> Демо-код: example/demo_pso.py#s2
из sko.PSO import PSOpso = PSO(func=demo_func, n_dim=3, pop=40, max_iter=150, lb=[0, -1, 0.5], ub=[1, 1, 1], w=0.8, c1=0,5, c2=0,5)pso.run()print('best_x равно ', pso.gbest_x, 'best_y есть', pso.gbest_y)
Шаг 3 : Постройте результат
-> Демо-код: example/demo_pso.py#s3
импортируйте matplotlib.pyplot как pltplt.plot(pso.gbest_y_hist)plt.show()
Если вам нужно нелинейное ограничение, например (x[0] - 1) ** 2 + (x[1] - 0) ** 2 - 0.5 ** 2<=0
Коды такие:
ограничения_ueq = (лямбда x: (x[0] - 1) ** 2 + (x[1] - 0) ** 2 - 0,5 ** 2, )pso = PSO(func=demo_func, n_dim=2, pop=40, max_iter=max_iter, lb=[-2, -2], ub=[2, 2] , ограничение_ueq=constraint_ueq)
Обратите внимание, что вы можете добавить более одного нелинейного ограничения. Просто добавьте его в constraint_ueq
Более того, у нас есть анимация:
↑ см. примеры/demo_pso_ani.py.
Шаг 1 : определите свою проблему
-> Демо-код: example/demo_sa.py#s1
demo_func = лямбда x: x[0] ** 2 + (x[1] - 0,05) ** 2 + x[2] ** 2
Шаг 2 : выполните SA
-> Демо-код: example/demo_sa.py#s2
из sko.SA import SAsa = SA(func=demo_func, x0=[1, 1, 1], T_max=1, T_min=1e-9, L=300, max_stay_counter=150)best_x, best_y = sa.run() print('best_x:', best_x, 'best_y', best_y)
Шаг 3 : Постройте результат
-> Демо-код: example/demo_sa.py#s3
импортируйте matplotlib.pyplot как pltimport pandas как pdplt.plot(pd.DataFrame(sa.best_y_history).cummin(axis=0))plt.show()
Кроме того, scikit-opt обеспечивает 3 типа имитации отжига: быстрый, Больцмана, Коши. Увидеть больше
Шаг 1 : о да, определите свои проблемы. Копировать этот шаг скучно.
Шаг 2. Сделайте SA для TSP.
-> Демо-код: example/demo_sa_tsp.py#s2
из импорта sko.SA SA_TSPsa_tsp = SA_TSP(func=cal_total_distance, x0=range(num_points), T_max=100, T_min=1, L=10 * num_points)best_points, best_distance = sa_tsp.run()print(best_points, best_distance, Cal_total_distance (лучшие_очки))
Шаг 3 : постройте результат
-> Демо-код: example/demo_sa_tsp.py#s3
из matplotlib.ticker import FormatStrFormatterfig, ax = plt.subplots(1, 2)best_points_ = np.concatenate([best_points, [best_points[0]]])best_points_coordinate = point_coordinate[best_points_, :]ax[0].plot(sa_tsp.best_y_history)ax[0].set_xlabel("Итерация")ax[0].set_ylabel("Расстояние")ax[1].plot(best_points_coordinate[:, 0], best_points_coordinate [:, 1], маркер='o', маркерfacecolor='b', цвет='c', linestyle='-')ax[1].xaxis.set_major_formatter(FormatStrFormatter('%.3f'))ax[1].yaxis.set_major_formatter(FormatStrFormatter('%.3f'))ax[1].set_xlabel(" Долгота")ax[1].set_ylabel("Широта")plt.show()
Подробнее: Постройте анимацию:
↑ см. примеры/demo_sa_tsp.py
-> Демо-код: example/demo_aca_tsp.py#s2
из sko.ACA import ACA_TSPaca = ACA_TSP(func=cal_total_distance, n_dim=num_points, size_pop=50, max_iter=200, distance_matrix=distance_matrix)best_x, best_y = aca.run()
-> Демо-код: example/demo_ia.py#s2
из sko.IA import IA_TSPia_tsp = IA_TSP(func=cal_total_distance, n_dim=num_points, size_pop=500, max_iter=800, prob_mut=0,2,T=0,7, альфа=0,95)best_points, best_distance = ia_tsp.run()print('best рутина:', best_points, 'best_distance:', best_distance)
-> Демо-код: example/demo_afsa.py#s1
def func(x):x1, x2 = xreturn 1 / x1 ** 2 + x1 ** 2 + 1 / x2 ** 2 + x2 ** 2from sko.AFSA import AFSAafsa = AFSA(func, n_dim=2, size_pop= 50, max_iter=300,max_try_num=100, шаг=0,5, визуальный = 0,3, q = 0,98, дельта = 0,5)best_x, best_y = afsa.run()print(best_x, best_y)
Ю, Дж., Хэ, Ю., Ян, К. и Канг, Х. (2021). SpecView: платформа визуализации спектра вредоносных программ с сингулярным преобразованием спектра. Транзакции IEEE по информационной криминалистике и безопасности, 16, 5093-5107.
Чжэнь Х., Чжай Х., Ма В., Чжао Л., Венг Ю., Сюй Ю., ... и Хэ Х. (2021). Проектирование и испытания генератора решений оптимального потока мощности на основе обучения с подкреплением. Энергетические отчеты.
Генрих К., Зшех П., Яниш К. и Бонин М. (2021). Свойства обрабатываемых данных имеют значение: внедрение закрытых сверточных нейронных сетей (GCNN) и сетей внимания с прогнозированием ключ-значение (KVP) для прогнозирования следующих событий с помощью глубокого обучения. Системы поддержки принятия решений, 143, 113494.
Тан, Гонконг, и Го, Словакия (2021). Новый метаэвристический оптимизатор, не основанный на численности населения, вдохновленный философией И Цзин. Препринт arXiv arXiv:2104.08564.
Ву, Г., Ли, Л., Ли, X., Чен, Ю., Чен, З., Цяо, Б., ... и Ся, Л. (2021). Сопоставление социальных событий в режиме реального времени на основе встраивания графиков для рекомендаций EBSN. Всемирная паутина, 1-22.
Пан, X., Чжан, З., Чжан, Х., Вэнь, З., Е, В., Ян, Ю., ... и Чжао, X. (2021). Быстрый и надежный алгоритм идентификации и определения концентрации газовых смесей, основанный на механизме внимания, оснащенный рекуррентной нейронной сетью с функцией двойной потери. Датчики и исполнительные механизмы B: Chemical, 342, 129982.
Кастелла Бальселл, М. (2021). Оптимизация системы стационарного обслуживания плавучей морской ветряной турбины WindCrete.
Чжай Б., Ван Ю., Ван В. и Ву Б. (2021). Стратегия оптимального регулирования ограничения скорости на участках автомагистралей в условиях тумана. Препринт arXiv arXiv:2107.14406.
Яп, XH (2021). Классификация с несколькими метками на основе локально-линейных данных: применение к прогнозированию химической токсичности.
Гебхард, Л. (2021). Планирование расширения низковольтных сетей с использованием оптимизации муравьиной колонии Ausbauplanung von Niederspannungsnetzen mithilfe eines Ameisenalgorithmus.
Ма, X., Чжоу, Х. и Ли, З. (2021). Оптимальный дизайн для взаимозависимостей между водородными и энергетическими системами. Транзакции IEEE для промышленных приложений.
де Курсо, TDC (2021). Эстудия модели Йохансена-Ледуа-Сорнетта по финансовым рынкам.
Ву Т., Лю Дж., Лю Дж., Хуан З., Ву Х., Чжан К., ... и Чжан Г. (2021). Новая платформа на основе искусственного интеллекта для оптимального планирования траектории с учетом угла обзора в беспроводных сенсорных сетях с использованием БПЛА. Транзакции IEEE по беспроводной связи.
Лю Х., Вэнь З. и Цай В. (август 2021 г.). FastPSO: к эффективному алгоритму роевого интеллекта на графических процессорах. На 50-й Международной конференции по параллельной обработке (стр. 1–10).
Махбуб, Р. (2020). Алгоритмы и методы оптимизации решения TSP.
Ли Дж., Чен Т., Лим К., Чен Л., Хан С.А., Се Дж. и Ван Х. (2019). Глубокое обучение ускорило синтез нанокластеров золота. Передовые интеллектуальные системы, 1(3), 1900029.