本文简要介绍GA
(遗传算法)在矩形微带天线设计中的应用。程序采用Python
编写,应用Geatpy
遗传算法工具箱、scikit-rf
射频数据处理工具箱实现。
一、矩形微带天线
本例中将以最简单的矩形微带天线(图1)为例来演示遗传算法在天线优化设计中的应用。
图1 矩形微带天线
图2 优化参数
矩形微带天线设计参数
二、遗传算法简介
遗传算法是一种通过计算机来模拟自然界物种进化过程中的选择、交叉、变异等现象,来求解问题优质解的一种算法。因变异的存在,使得算法能够跳出局部最优解,故遗传算法为全局搜索算法。
图3 GA
三、环境配置
安装Geatpy、scikit-rf工具箱。
1、 Geatpy
Geatpy 是一个高性能实用型进化算法工具箱,提供许多已实现的进化算法中各项重要操作的库函数。 通过 pip install geatpy 进行安装即可。2、 scikit-rf
scikit-rf 用于对射频网络参数进行处理、变换。本例中用于处理HFSS 仿真产生的touchstone 文件。通过 pip install scikit-rf 安装即可。四、目标函数
优化变量为L0、W0、L1,定义遗传算法求解的目标函数:
五、代码编写
1、定义problem类
class GA4HFSS(ea.Problem): def __init__(self): name = 'Antenna' M = 1 maxormins = [-1] Dim = 3 varTypes = [0] * Dim lb = [20,32, 4] # 决策变量下界:L0,W0,L1 ub = [30, 40, 10] # 决策变量上界:L0,W0,L1 lbin = [1, 1,1] # 决策变量下边界 ubin = [1, 1,1] # 决策变量上边界 ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin) def calcSpecifyPointFunc(S): tempS11 = 0 for s in S: s11=s.s11.s_db[0][0][0] if s11 < -15: tempS11 += (-15/-15.0) elif -15 <= s11 <=-5: tempS11 += (s11/-15.0) elif -5 tempS11 += (0/-15.0) return tempS11 def fitness(self,**kwargs): for item in kwargs: hfss.setVariable(item, str(kwargs[item]) + 'mm') hfss.saveProject() hfss.analyze(setupName) hfss.saveProject() exSnpPath = hfss.exportSNP_NoRenomilation(setupName, sweepName, 'tempSNP.s1p', hfssProjectDirectory) antennaS11 = Network(exSnpPath) S_2p3_dB = antennaS11["2.3GHz"] fitTemp1 = self.calcSpecifyPointFunc(S_2p3_dB) S_2p4_dB = antennaS11["2.4GHz"] fitTemp2 = self.calcSpecifyPointFunc(S_2p4_dB) S_2p5_dB = antennaS11["2.5GHz"] fitTemp3 = self.calcSpecifyPointFunc(S_2p5_dB) fitTemp = 0.25*fitTemp1 + 0.5*fitTemp2 + 0.25*fitTemp3 return fitTemp def aimFunc(self, pop): # 目标函数 Vars = pop.Phen variableNameL0 = Vars[:, [0]] variableNameW0 = Vars[:, [1]] variableNameL1 = Vars[:, [2]] fit = np.zeros((len(pop), 1)) for i in range(len(pop)): fit[i, :] = self.fitness(L0=variableNameL0[i][0], W0=variableNameW0[i][0],L1=variableNameL1[i][0]) pop.ObjV = fit
2、增强精英保留的遗传算法
hfss = HFSS() hfss.hfssInterface() hfssProjectName = "Patch_Antenna.aedt" hfss.openProject(hfssProjectName) hfssProjectDirectory = hfss.getProjectDirectory() hfss.getActiveDesign() hfss.getModule("AnalysisSetup") setupName = hfss.getSetupNames()[0] sweepName = hfss.getSweepNames(setupName)[0] hfss.analyze(setupName) hfss.saveProject() exSnpPath = hfss.exportSNP_NoRenomilation(setupName, sweepName, 'tempSNP.s1p', hfssProjectDirectory) """===============================实例化问题对象===========================""" GA4PatchAntenna = GA4HFSS() # 生成问题对象 """=================================种群设置===============================""" Encoding = 'RI' # 编码方式 NIND = 10 # 种群规模 Field = ea.crtfld(Encoding, GA4PatchAntenna.varTypes, GA4PatchAntenna.ranges, GA4PatchAntenna.borders) population = ea.Population(Encoding, Field, NIND) """===============================算法参数设置=============================""" myAlgorithm = ea.soea_SEGA_templet(GA4PatchAntenna, population) myAlgorithm.mutOper.Pm = 0.05 # 修改变异算子的变异概率 myAlgorithm.recOper.XOVR = 0.8 # 修改交叉算子的交叉概率 myAlgorithm.selFunc='tour'# 修改选择算子,默认为‘tour’,通过import geatpy as ea;help(ea.selecting)查看帮助 myAlgorithm.MAXGEN = 10 # 最大进化代数 myAlgorithm.drawing=0 #设置绘图方式:0-不绘图,1-绘图,2-动态绘图 """==========================调用算法模板进行种群进化=======================""" [population, obj_trace, var_trace] = myAlgorithm.run() # 执行算法 population.save() best_gen = np.argmin(GA4PatchAntenna.maxormins * obj_trace[:, 1]) best_ObjV = obj_trace[best_gen, 1] """==========================导入最优解=======================""" for i in range(var_trace.shape[1]): print(var_trace[best_gen, i]) hfss.setVariable('L0', str(var_trace[best_gen, 0]) + 'mm') hfss.setVariable('W0', str(var_trace[best_gen, 1]) + 'mm') hfss.setVariable('L1', str(var_trace[best_gen, 2]) + 'mm') hfss.exportSNP_NoRenomilation(setupName, sweepName, 'bestAntenna.s1p', hfssProjectDirectory) hfss.saveProject() hfss.quitHFSS()
3、优化
经过50代优化,天线相对带宽优化至5%,此时W0=35.9mm,L0=27.2mm, L1=6.43mm
六、参考资料
http://geatpy.com/
https://scikit-rf-web.readthedocs.io/
Haupt, R. L. . (2013). Genetic Algorithms in Electromagnetics. IEEE Xplore.
https://www.neuraldesigner.com/blog/genetic_algorithms_for_feature_selection