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 설치 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 Selection_tournament(algorithm, Tourn_size):FitV = Algorithm.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
sko.GA에서 numpy를 np로 가져오기 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)를 가져옵니다. 등록(operator_name='crossover', 연산자=crossover.crossover_2point). 레지스터(operator_name='돌연변이', 연산자=돌연변이.돌연변이)
이제 평소대로 GA를 수행하세요.
-> 데모 코드: example/demo_ga_udf.py#s5
best_x, best_y = ga.run()print('best_x:', best_x, 'n', 'best_y:', best_y)
지금까지 GA scikit-opt의 udf 지원
crossover
,mutation
,selection
,ranking
12개의 연산자를 제공했습니다. 여기를 참조하세요.
고급 사용자의 경우:
-> 데모 코드: example/demo_ga_udf.py#s6
class MyGA(GA):def Selection(self, Tourn_size=3):FitV = self.FitVsel_index = []for i in range(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, :] # 차세대return self.Chromranking = 순위.순위demo_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번의 반복에 대한 알고리즘을 실행한 다음 이전 10번의 반복을 바탕으로 또 다른 20번의 반복을 실행합니다.
sko.GA에서 가져오기 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에서 안정적인 GPU 계산을 개발 중입니다.
예는 이미 사용 가능합니다: https://github.com/guofei9987/scikit-opt/blob/master/examples/demo_ga_gpu.py
1단계 : 문제 정의
-> 데모 코드: example/demo_de.py#s1
'''최소 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 = 사전 회전 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]
Step2 : 차등진화를 하라
-> 데모 코드: example/demo_de.py#s2
sko.DE에서 가져오기 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, Constraint_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', '최고_y:', 최고_y)
-> 데모 코드: example/demo_ga.py#s3
팬더를 pdimport matplotlib.pyplot as 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(축=1).cummin().plot(kind='line')plt.show()
GA_TSP
를 가져오면 TSP를 해결하기 위해 mutation
, crossover
가 오버로드됩니다.
1단계 : 문제를 정의합니다. 포인트 좌표와 거리 매트릭스를 준비하십시오.
여기에서는 데모로 데이터를 무작위로 생성합니다.
-> 데모 코드: example/demo_ga_tsp.py#s1
import numpy as npfrom scipy import Spatialimport matplotlib.pyplot as pltnum_points = 50points_coordinate = np.random.rand(num_points, 2) # points의 좌표 생성distance_matrix = 공간적.distance.cdist(points_coordinate, points_coordinate, metric='euclidean')def cal_total_distance( 루틴):'''목표 기능. 입력 루틴, 총 거리를 반환합니다. cal_total_distance(np.arange(num_points)) '''num_points, = routine.shapereturn sum([distance_matrix[routine[i % num_points], routine[(i + 1) % num_points]] for i in range(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
그림, 도끼 = plt.subplots(1, 2)best_points_ = np.concatenate([best_points, [best_points[0]]])best_points_coordinate = points_coordinate[best_points_, :]ax[0].plot(best_points_coordinate[:, 0] , 최고_점_좌표[:, 1], '또는')ax[1].plot(ga_tsp. Generation_best_Y)plt.show()
1단계 : 문제 정의:
-> 데모 코드: example/demo_pso.py#s1
def 데모_func(x):x1, x2, x3 = xreturn x1 ** 2 + (x2 - 0.05) ** 2 + x3 ** 2
2단계 : PSO 수행
-> 데모 코드: example/demo_pso.py#s2
sko.PSO에서 가져오기 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
과 같은 비선형 제약 조건이 필요한 경우
코드는 다음과 같습니다:
Constraint_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
데모_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을 plt로 가져오기 pdplt.plot(pd.DataFrame(sa.best_y_history).cummin(axis=0))plt.show()로 팬더 가져오기
또한 scikit-opt는 Fast, Boltzmann, Cauchy의 3가지 유형의 Simulated Annealing을 제공합니다. 자세히 보기
1단계 : 아, 네, 문제를 정의하세요. 이 단계를 복사하는 것은 지루합니다.
2단계 : TSP에 대한 SA 실행
-> 데모 코드: example/demo_sa_tsp.py#s2
sko.SA import 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 = points_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], marker='o', markerfacecolor='b', color='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, alpha=0.95)best_points, best_distance = ia_tsp.run()print('best 루틴:', best_points, '최고_거리:', 최고_거리)
-> 데모 코드: 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, delta=0.5)best_x, best_y = afsa.run()print(best_x, best_y)
Yu, J., He, Y., Yan, Q., & Kang, X. (2021). SpecView: 단일 스펙트럼 변환을 사용하는 악성코드 스펙트럼 시각화 프레임워크. 정보 법의학 및 보안에 관한 IEEE 거래, 16, 5093-5107.
Zhen, H., Zhai, H., Ma, W., Zhao, L., Weng, Y., Xu, Y., ... & He, X.(2021). 강화학습 기반 최적 전력 흐름 솔루션 생성기 설계 및 테스트. 에너지 보고서.
Heinrich, K., Zschech, P., Janiesch, C., & Bonin, M. (2021). 프로세스 데이터 속성의 중요성: 딥 러닝을 통한 다음 이벤트 예측을 위한 GCNN(Gated Convolutional Neural Network) 및 KVP(키-값 예측 주의 네트워크)를 도입합니다. 의사결정 지원 시스템, 143, 113494.
Tang, HK 및 Goh, SK(2021). Yi Jing의 철학에서 영감을 받은 새로운 비인구 기반 메타 휴리스틱 옵티마이저. arXiv 사전 인쇄 arXiv:2104.08564.
Wu, G., Li, L., Li, X., Chen, Y., Chen, Z., Qiao, B., ... & Xia, L.(2021). EBSN 추천을 위한 그래프 임베딩 기반 실시간 소셜 이벤트 매칭. 월드와이드웹, 1-22.
Pan, X., Zhang, Z., Zhang, H., Wen, Z., Ye, W., Yang, Y., ... & Zhao, X. (2021). 이중 손실 기능을 갖춘 순환 신경망을 갖춘 Attention 메커니즘을 기반으로 하는 빠르고 강력한 혼합 가스 식별 및 농도 감지 알고리즘입니다. 센서 및 액추에이터 B: 화학, 342, 129982.
카스텔라 발셀, M.(2021). WindCrete 부유식 해상 풍력 터빈을 위한 스테이션 유지 시스템 최적화.
Zhai, B., Wang, Y., Wang, W., & Wu, B. (2021). 안개 상태에서 고속도로 구간에 대한 최적의 가변 속도 제한 제어 전략. arXiv 사전 인쇄 arXiv:2107.14406.
넵, XH(2021). 국소 선형 데이터에 대한 다중 라벨 분류: 화학적 독성 예측에 적용.
게브하르트, L. (2021). 개미 군집 최적화를 사용한 저전압 그리드 확장 계획 Ausbauplanung von Niederspannungsnetzen mithilfe eines Ameisenalgorithmus.
Ma, X., Zhou, H., & Li, Z.(2021). 수소와 전력 시스템 간의 상호의존성을 위한 최적의 설계. 산업 응용 분야에 대한 IEEE 거래.
드 쿠르소, TDC(2021). Estudo do modelo Johansen-Ledoit-Sornette de bolhas Financeiras.
Wu, T., Liu, J., Liu, J., Huang, Z., Wu, H., Zhang, C., ... & Zhang, G. (2021). UAV 지원 무선 센서 네트워크에서 AoI 최적의 궤적 계획을 위한 새로운 AI 기반 프레임워크입니다. 무선 통신에 대한 IEEE 트랜잭션.
Liu, H., Wen, Z., & Cai, W.(2021년 8월). FastPSO: GPU의 효율적인 Swarm Intelligence 알고리즘을 향하여. 제50차 병렬처리 국제회의(pp. 1-10).
마부브, R. (2020). TSP 해결을 위한 알고리즘 및 최적화 기법.
Li, J., Chen, T., Lim, K., Chen, L., Khan, SA, Xie, J., & Wang, X. (2019). 딥러닝으로 금나노클러스터 합성을 가속화했습니다. 고급 지능형 시스템, 1(3), 1900029.