优化分配基于matlab粒子群算法求解火车票分配优化问题含Matlab源码 1137期
Posted 紫极神光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优化分配基于matlab粒子群算法求解火车票分配优化问题含Matlab源码 1137期相关的知识,希望对你有一定的参考价值。
一、简介
粒子群算法源于复杂适应系统(Complex Adaptive System,CAS)。CAS理论于1994年正式提出,CAS中的成员称为主体。比如研究鸟群系统,每个鸟在这个系统中就称为主体。主体有适应性,它能够与环境及其他的主体进行交流,并且根据交流的过程“学习”或“积累经验”改变自身结构与行为。整个系统的演变或进化包括:新层次的产生(小鸟的出生);分化和多样性的出现(鸟群中的鸟分成许多小的群);新的主题的出现(鸟寻找食物过程中,不断发现新的食物)。
所以CAS系统中的主体具有4个基本特点(这些特点是粒子群算法发展变化的依据):
首先,主体是主动的、活动的。
主体与环境及其他主体是相互影响、相互作用的,这种影响是系统发展变化的主要动力。
环境的影响是宏观的,主体之间的影响是微观的,宏观与微观要有机结合。
最后,整个系统可能还要受一些随机因素的影响。
粒子群算法就是对一个CAS系统---鸟群社会系统的研究得出的。
粒子群算法( Particle Swarm Optimization, PSO)最早是由Eberhart和Kennedy于1995年提出,它的基本概念源于对鸟群觅食行为的研究。设想这样一个场景:一群鸟在随机搜寻食物,在这个区域里只有一块食物,所有的鸟都不知道食物在哪里,但是它们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢?最简单有效的就是搜寻目前离食物最近的鸟的周围区域。
PSO算法就从这种生物种群行为特性中得到启发并用于求解优化问题。在PSO中,每个优化问题的潜在解都可以想象成d维搜索空间上的一个点,我们称之为“粒子”(Particle),所有的粒子都有一个被目标函数决定的适应值(Fitness Value ),每个粒子还有一个速度决定他们飞翔的方向和距离,然后粒子们就追随当前的最优粒子在解空间中搜索。Reynolds对鸟群飞行的研究发现。鸟仅仅是追踪它有限数量的邻居但最终的整体结果是整个鸟群好像在一个中心的控制之下.即复杂的全局行为是由简单规则的相互作用引起的。
二、源代码
clc,clear,close all
warning off
format longG
tic;
global Nseat Dab Dbc Dac fab fbc fac ti ta tb
% 加载参数
parameters; % 系统的参数
% 第index_t期
index_t = 10;
Vt_last = 0;
% PSO 参数
c1 = 1.4995;
c2 = 1.4995;
Vmin = -1;
Vmax = 1;
maxiter = 30; % 迭代次数
sizepop = 50; % 种群数量
nvar = 3; % 3个变量
popmin = 0; popmax = max([ta(index_t),tb(index_t)]); % x
% 初始化种群
for i=1:sizepop
pop(i,:) = popmin + (popmax-popmin).*rand(1,nvar);
fitness(i) = fun(pop(i,:), Vt_last, index_t);
V(i,1:3) = 0;
end
% 记录一组最优值
[bestfitness,bestindex]=min(fitness);
zbest=pop(bestindex,:); % 全局最佳
gbest=pop; % 个体最佳
fitnessgbest=fitness; % 个体最佳适应度值
fitnesszbest=bestfitness; % 全局最佳适应度值
wmax = 0.9; wmin = 0.4;
% 迭代寻优
for i=1:maxiter
for j=1:sizepop
% 自适应权重1
% w = wmin + (wmax-wmin)*(fitnessgbest(j)-min(fitness))/( max(fitness)-min(fitness) );
% 自适应权重2
% w = wmin - (wmax-wmin)*(fitnessgbest(j)-min(fitness))/( mean(fitness)-min(fitness) );
% 自适应权重3
if fitnessgbest(j)<=mean(fitness)
w = wmin - (wmax-wmin)*(fitnessgbest(j)-min(fitness))/( mean(fitness)-min(fitness) );
else
w = wmax;
end
% 速度更新
V(j,:) = w*V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
% V--防止越界
for k=1:nvar
if V(j,k)>Vmax
V(j,k)=Vmax;
end
if V(j,k)<Vmin
V(j,k)=Vmin;
end
end
% 个体更新
pop(j,:) = pop(j,:) + 0.5 * V(j,:);
% x 越界限制
for k=1:nvar
if pop(j,k)>popmax
pop(j,k)=popmax;
end
if pop(j,k)<popmin
pop(j,k)=popmin;
end
end
% 适应度更新
fitness(j) = fun(pop(j,:), Vt_last, index_t);
% 比较 个体间比较
if fitness(j)<fitnessgbest(j)
fitnessgbest(j) = fitness(j);
gbest(j,:) = pop(j,:);
end
if fitness(j)<bestfitness
bestfitness = fitness(j);
zbest = pop(j,:);
end
end
fitness_iter(i) = bestfitness;
end
function [zbest,fitness_iter,bestfitness] = APSO_Vt(index_t,Vt_last, maxiter,sizepop )
global Nseat Dab Dbc Dac fab fbc fac ti ta tb
% 加载参数
% parameters; % 系统的参数
% 第index_t期
% index_t = 10;
% Vt_last = 0;
% PSO 参数
c1 = 1.4995;
c2 = 1.4995;
Vmin = -1;
Vmax = 1;
% maxiter = 20; % 迭代次数
% sizepop = 20; % 种群数量
nvar = 3; % 3个变量
popmin = 0; popmax = max([ta(index_t),tb(index_t)]); % x
% 初始化种群
for i=1:sizepop
pop(i,:) = fix(popmin + (popmax-popmin).*rand(1,nvar));
fitness(i) = fun(pop(i,:), Vt_last, index_t);
V(i,1:3) = 0;
end
% 记录一组最优值
[bestfitness,bestindex]=min(fitness);
zbest=pop(bestindex,:); % 全局最佳
gbest=pop; % 个体最佳
fitnessgbest=fitness; % 个体最佳适应度值
fitnesszbest=bestfitness; % 全局最佳适应度值
wmax = 0.9; wmin = 0.4;
% 迭代寻优
for i=1:maxiter
for j=1:sizepop
% 自适应权重1
% w = wmin + (wmax-wmin)*(fitnessgbest(j)-min(fitness))/( max(fitness)-min(fitness) );
% 自适应权重2
% w = wmin - (wmax-wmin)*(fitnessgbest(j)-min(fitness))/( mean(fitness)-min(fitness) );
% 自适应权重3
if fitnessgbest(j)<=mean(fitness)
w = wmin - (wmax-wmin)*(fitnessgbest(j)-min(fitness))/( mean(fitness)-min(fitness) );
else
w = wmax;
end
% 速度更新
V(j,:) = w*V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
% V--防止越界
for k=1:nvar
if V(j,k)>Vmax
V(j,k)=Vmax;
end
if V(j,k)<Vmin
V(j,k)=Vmin;
end
end
% 个体更新
pop(j,:) = fix(pop(j,:) + 0.5 * V(j,:));
% x 越界限制
for k=1:nvar
if pop(j,k)>popmax
pop(j,k)=popmax;
end
if pop(j,k)<popmin
pop(j,k)=popmin;
end
end
function y = fun(x, Vt_last, index_t )
global Nseat Dab Dbc Dac fab fbc fac ti ta tb
xab = x(1);
xbc = x(2);
xac = x(3);
gt = fab*min(Dab(index_t),xab) + fbc*min(Dbc(index_t),xbc) + fac*min(Dac(index_t),xac);
Vt = gt + Vt_last; % 目标值越大越好
if( (xab+xac<=ta(index_t)) && (xbc+xac<=tb(index_t)) )
y = 1./Vt; % 求最小值,y越小越好
else
y = 1e6; % 不满足约束条件,则y为极大值
end
三、运行结果
四、备注
版本:2014a
以上是关于优化分配基于matlab粒子群算法求解火车票分配优化问题含Matlab源码 1137期的主要内容,如果未能解决你的问题,请参考以下文章
单目标优化求解基于matlab粒子群混沌混合蝴蝶优化算法求解最优目标问题(HPSOBOA)含Matlab源码 1538期
优化指派基于matlab粒子群算法求解指派优化问题(工作质量)含Matlab源码 2390期
优化覆盖基于matlab粒子群算法优化无人机编队布局求解车载网络通信覆盖优化问题含Matlab源码 2021期
优化算法基于matlab量子粒子群算法求解单目标优化问题含Matlab源码 2203期