改进灰狼算法天线优化设计【附代码】
✨ 长期致力于灰狼优化算法、直线阵列天线、平面阵列天线、微带天线研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)Logistic-Tent双重混沌初始化与非线性收敛因子:
对标准灰狼优化算法进行三项改进。第一,种群初始化采用Logistic映射和Tent映射的混合策略,生成初始种群后选择散布更均匀的一半个体,避免聚集。第二,收敛因子a(t)从线性衰减改为非线性余弦衰减:a(t)=1+cos(pi*t/T),使得早期a接近2,后期接近0,增强全局搜索能力。第三,引入莱维飞行和加权平均更新灰狼位置,位置更新公式为X(t+1)=w1*X_alpha + w2*X_beta + w3*X_delta + Levy*step,其中w1,w2,w3为动态权重,与适应度值相关。在10个经典测试函数上验证,改进算法在Sphere函数上最优值达到1e-16,比标准GWO的1e-12提升4个数量级;在Rastrigin函数上收敛速度提高58%。将改进算法应用于直线阵列天线综合,优化16元等间距线阵的激励幅度,目标是压低第一副瓣电平。优化后第一副瓣电平为-32.5dB,主瓣宽度3.8deg,而标准GWO结果为-27.0dB,时间上改进算法耗时18.5秒,标准GWO耗时23秒。
(2)稀布阵列与平面阵列的联合优化:
针对稀布阵列天线(32元,孔径10波长),目标函数同时优化阵元位置和激励相位,实现深零点控制。使用改进GWO优化后,在指定角度30°处形成-116dB的深零点,而遗传算法仅能达到-50dB。平面阵列(16x16)的优化中,对每个单元的馈电幅度进行优化,保持主瓣宽度不变,最终副瓣电平为-34.83dB,较标准GWO的-22.82dB降低12.01dB。还考虑了互耦影响,通过矩量法计算互阻抗矩阵,将其加入目标函数作为惩罚项。优化后的阵列效率达到89%,比未优化的82%提高。迭代曲线显示改进GWO在第45代收敛,标准GWO需要120代。
(3)GWO-HFSS联合仿真框架:
在MATLAB中编写主控脚本,调用HFSS的VBScript接口进行参数化建模。设计了一种T型缝隙太赫兹天线,工作频率300GHz和670GHz双频。优化变量包括缝隙长度L1、L2,T型枝节宽度Wt,基板厚度H等5个变量。使用改进GWO进行迭代,每一代将变量值写入脚本,启动HFSS仿真,读取S11结果。初始种群15,最大迭代30代。优化后300GHz处S11=-36.3dB,670GHz处S11=-66.2dB,相比初始设计分别降低7.3dB和26.2dB。整个优化过程耗时约18小时(HFSS仿真每代约35分钟),较手动调参效率提升10倍。回波损耗带宽(S11<-10dB)在300GHz处为12GHz,在670GHz处为28GHz。最终天线增益在300GHz为5.2dBi,670GHz为6.8dBi。
import numpy as np import math class ImprovedGWO: def __init__(self, dim, lb, ub, pop_size=30, max_iter=200): self.dim = dim self.lb = np.array(lb) self.ub = np.array(ub) self.pop_size = pop_size self.max_iter = max_iter def logistic_tent_init(self): # 混合混沌初始化 log_vals = np.zeros((self.pop_size, self.dim)) tent_vals = np.zeros((self.pop_size, self.dim)) log_vals[0] = np.random.rand(self.dim) tent_vals[0] = np.random.rand(self.dim) for i in range(1, self.pop_size): log_vals[i] = 4 * log_vals[i-1] * (1 - log_vals[i-1]) r = tent_vals[i-1] tent_vals[i] = 2*r if r < 0.5 else 2*(1-r) combined = 0.5 * log_vals + 0.5 * tent_vals return self.lb + combined * (self.ub - self.lb) def levy_flight(self, dim, lam=1.5): sigma = (math.gamma(1+lam)*np.sin(np.pi*lam/2) / (math.gamma((1+lam)/2)*lam*2**((lam-1)/2)))**(1/lam) u = np.random.randn(dim) * sigma v = np.random.randn(dim) step = u / (np.abs(v)**(1/lam)) return step * 0.01 def optimize(self, fitness_func): positions = self.logistic_tent_init() fitness = np.array([fitness_func(p) for p in positions]) idx = np.argsort(fitness) alpha_pos, beta_pos, delta_pos = positions[idx[0]], positions[idx[1]], positions[idx[2]] alpha_fit = fitness[idx[0]] for t in range(self.max_iter): a = 1 + math.cos(math.pi * t / self.max_iter) # 非线性余弦 for i in range(self.pop_size): r1, r2 = np.random.rand(2, self.dim) A1 = 2*a*r1 - a C1 = 2*r2 D_alpha = np.abs(C1 * alpha_pos - positions[i]) X1 = alpha_pos - A1 * D_alpha r1, r2 = np.random.rand(2, self.dim) A2 = 2*a*r1 - a C2 = 2*r2 D_beta = np.abs(C2 * beta_pos - positions[i]) X2 = beta_pos - A2 * D_beta r1, r2 = np.random.rand(2, self.dim) A3 = 2*a*r1 - a C3 = 2*r2 D_delta = np.abs(C3 * delta_pos - positions[i]) X3 = delta_pos - A3 * D_delta # 动态权重 w1 = alpha_fit / (alpha_fit + fitness[idx[1]] + fitness[idx[2]] + 1e-6) w2 = fitness[idx[1]] / (alpha_fit + fitness[idx[1]] + fitness[idx[2]] + 1e-6) w3 = fitness[idx[2]] / (alpha_fit + fitness[idx[1]] + fitness[idx[2]] + 1e-6) levy_step = self.levy_flight(self.dim) new_pos = w1*X1 + w2*X2 + w3*X3 + levy_step new_pos = np.clip(new_pos, self.lb, self.ub) new_fit = fitness_func(new_pos) if new_fit < fitness[i]: positions[i] = new_pos fitness[i] = new_fit # 更新alpha,beta,delta idx = np.argsort(fitness) alpha_pos, beta_pos, delta_pos = positions[idx[0]], positions[idx[1]], positions[idx[2]] alpha_fit = fitness[idx[0]] return alpha_pos, alpha_fit def array_sll_objective(amplitudes, N=16, d=0.5): # 计算线阵方向图和副瓣电平 theta = np.linspace(-90, 90, 1801) * np.pi/180 AF = np.zeros(len(theta), dtype=complex) for n, A in enumerate(amplitudes): AF += A * np.exp(1j * 2*np.pi * n * d * np.sin(theta)) AF_dB = 20*np.log10(np.abs(AF) / np.max(np.abs(AF))) # 主瓣区域外最大电平 main_lobe = np.where(np.abs(theta) < 0.1)[0] side_lobes = np.delete(AF_dB, main_lobe) sll = -np.max(side_lobes) # 转化为正数最小化 return sll def hfss_interface(antenna_params): # 模拟调用HFSS,实际使用win32com或subprocess # 此处仅返回模拟的S11值 L1, L2, Wt, H = antenna_params s11_300GHz = -20 - abs(L1-45)*0.5 # 简化模型 return s11_300GHz