1 简介
为了提高分类的准确性,该模型引入具有全局寻优特点的头脑风暴优化算法,用于模拟人类提出创造性思维解决问题的过程,具有强大的全局搜索和局部搜索的能力,同时利用BP神经网络所具有良好的非线性映射能力,学习适应能力和容错性,最大程度上考虑到海洋水质评价因素的非线性和非平稳的关系,得到BP神经网络的各层权值,阈值的最优解,实验结果表明该评价模型能够克服局部极小问题,分类结果准确性较高,并具有一定的实用性.
2 部分代码
function best_fitness = bso2(fun,n_p,n_d,n_c,rang_l,rang_r,max_iteration)% fun = fitness_function% n_p; population size% n_d; number of dimension% n_c: number of clusters% rang_l; left boundary of the dynamic range% rang_r; right boundary of the dynamic rangeprob_one_cluster = 0.8; % probability for select one cluster to form new individual;stepSize = ones(1,n_d); % effecting the step size of generating new individuals by adding random valuespopu = rang_l + (rang_r - rang_l) * rand(n_p,n_d); % initialize the population of individualspopu_sorted = rang_l + (rang_r - rang_l) * rand(n_p,n_d); % initialize the population of individuals sorted according to clustersn_iteration = 0; % current iteration number% initialize cluster probability to be zerosprob = zeros(n_c,1);best = zeros(n_c,1); % index of best individual in each clustercenters = rang_l + (rang_r - rang_l) * rand(n_c,n_d); % initialize best individual in each clustercenters_copy = rang_l + (rang_r - rang_l) * rand(n_c,n_d); % initialize best individual-COPY in each cluster FOR the purpose of introduce random bestbest_fitness = 1000000*ones(max_iteration,1);fitness_popu = 1000000*ones(n_p,1); % store fitness value for each individualfitness_popu_sorted = 1000000*ones(n_p,1); % store fitness value for each sorted individualindi_temp = zeros(1,n_d); % store temperary individual% calculate fitness for each individual in the initialized populationfor idx = 1:n_pfitness_popu(idx,1) = fun(popu(idx,:));endwhile n_iteration < max_iterationcluster = kmeans(popu, n_c,'Distance','cityblock','Start',centers,'EmptyAction','singleton'); % k-mean cluster% clusteringfit_values = 100000000000000000000000000.0*ones(n_c,1); % assign a initial big fitness value as best fitness for each cluster in minimization problemsnumber_in_cluster = zeros(n_c,1); % initialize 0 individual in each clusterfor idx = 1:n_pnumber_in_cluster(cluster(idx,1),1)= number_in_cluster(cluster(idx,1),1) + 1;% find the best individual in each clusterif fit_values(cluster(idx,1),1) > fitness_popu(idx,1) % minimizationfit_values(cluster(idx,1),1) = fitness_popu(idx,1);best(cluster(idx,1),1) = idx;endend% form population sorted according to clusterscounter_cluster = zeros(n_c,1); % initialize cluster counter to be 0acculate_num_cluster = zeros(n_c,1); % initialize accumulated number of individuals in previous clustersfor idx =2:n_cacculate_num_cluster(idx,1) = acculate_num_cluster((idx-1),1) + number_in_cluster((idx-1),1);end%start form sorted populationfor idx = 1:n_pcounter_cluster(cluster(idx,1),1) = counter_cluster(cluster(idx,1),1) + 1 ;temIdx = acculate_num_cluster(cluster(idx,1),1) + counter_cluster(cluster(idx,1),1);popu_sorted(temIdx,:) = popu(idx,:);fitness_popu_sorted(temIdx,1) = fitness_popu(idx,1);end% record the best individual in each clusterfor idx = 1:n_ccenters(idx,:) = popu(best(idx,1),:);endif (rand() < 0.2) % select one cluster center to be replaced by a randomly generated centercenIdx = ceil(rand()*n_c);centers(cenIdx,:) = rang_l + (rang_r - rang_l) * rand(1,n_d);end% calculate cluster probabilities based on number of individuals in each clusterfor idx = 1:n_cprob(idx,1) = number_in_cluster(idx,1)/n_p;if idx > 1prob(idx,1) = prob(idx,1) + prob(idx-1,1);endend% generate n_p new individuals by adding Gaussian random valuesfor idx = 1:n_pr_1 = rand(); % probability for select one cluster to form new individualif r_1 < prob_one_cluster % select one clusterr = rand();for idj = 1:n_cif r < prob(idj,1)if rand() < 0.4 % use the centerindi_temp(1,:) = centers(idj,:);else % use one randomly selected clusterindi_1 = acculate_num_cluster(idj,1) + ceil(rand() * number_in_cluster(idj,1));indi_temp(1,:) = popu_sorted(indi_1,:);endbreakendendelse % select two clusters% pick two clusterscluster_1 = ceil(rand() * n_c);indi_1 = acculate_num_cluster(cluster_1,1) + ceil(rand() * number_in_cluster(cluster_1,1));cluster_2 = ceil(rand() * n_c);indi_2 = acculate_num_cluster(cluster_2,1) + ceil(rand() * number_in_cluster(cluster_2,1));tem = rand();if rand() < 0.5 %use centerindi_temp(1,:) = tem * centers(cluster_1,:) + (1-tem) * centers(cluster_2,:);else % use randomly selected individuals from each clusterindi_temp(1,:) = tem * popu_sorted(indi_1,:) + (1-tem) * popu_sorted(indi_2,:);endendstepSize = logsig(((0.5*max_iteration - n_iteration)/20)) * rand(1,n_d);indi_temp(1,:) = indi_temp(1,:) + stepSize .* normrnd(0,1,1,n_d);% if better than the previous one, replace itfv = fun(indi_temp);if fv < fitness_popu(idx,1) % better than the previous one, replacefitness_popu(idx,1) = fv;popu(idx,:) = indi_temp(1,:);endend% keep the best for each clusterfor idx = 1:n_cpopu(best(idx,1),:) = centers_copy(idx,:);fitness_popu(best(idx,1),1) = fit_values(idx,1);endn_iteration = n_iteration +1;% record the best fitness in each iterationbest_fitness(n_iteration, 1) = min(fit_values);end
3 仿真结果

4 参考文献
[1]李海涛, 邵泽东. 基于头脑风暴优化算法与BP神经网络的海水水质评价模型研究[J]. 应用海洋学学报, 2020, 39(1):6.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。
844

被折叠的 条评论
为什么被折叠?



