clc
clear all
tic
%% 主函数
% 定义遗传算法参数
pcrossover=0.9; %交配概率
pmutation=0.2; %变异概率
maxgen=40; %最大代数
popsize=40; %个体数量
backrate=0.1; %进入返回车道的概率
avgfitness=[];
bestfitness=[];
besttrace=[maxgen,2]
% 初始化种群 (fitness 为适应度,information为车的信息 sequence为出车序列)
cars=struct('fitness',[],'information',[],'sequence',[]);
%读取数据 data是第一列为进车顺序 origin是对应原始车型数据
[data,origin]=xlsread('附件2.xlsx');
n=size(data,1); %n为总车数
cars.information=zeros(n,3); %car.information为车辆特征矩阵 其中第一列为车型第二列为动力第三列为驱动
% 转换为车型数据
for i=2:n+1
if origin{i,2}=='A'
cars.information(i,1)=1;
else
cars.information(i,1)=2;
end
if origin{i,3}=='混动'
cars.information(i,2)=1;
else
cars.information(i,2)=2;
end
if origin{i,4}=='两驱'
cars.information(i,3)=1;
else
cars.information(i,3)=2;
end
end
cars.information(1,:)=[]; %将information矩阵优化
%% 创建一个318*13*50的矩阵:其中318为318辆车13为进车道的两倍加上返车道。
cars.sequence=zeros(n,13,popsize);
for b=1:popsize
for a = 1:n
while sum(cars.sequence(a,1:6,b))~=1
cars.sequence(a,1:6,b)=round(rand(1,6));
end
if rand<backrate %选择回车道概率(这里为假定)
cars.sequence(a,7,b)=1;
while sum(cars.sequence(a,8:13,b))~=1
cars.sequence(a,8:13,b)=round(rand(1,6));
end
end
end
end
%% 找到最好的个体
for i=1:popsize
cars.fitness(i)=fitness(i,cars,n);
end
cars.fitness=cars.fitness';
[bestfitness,bestindex]=max(cars.fitness); %最好的染色体
bestcars=cars.sequence(:,:,bestindex); %最好的染色体平均适应度
avgfitness=sum(cars.fitness)/popsize;
%记录每一代的最优个体和平均适应度
besttrace=[avgfitness,bestfitness];
for i=1:maxgen
%% 选择函数
cars=choose(cars,popsize);
%% 交叉操作
cars=jiaocha(cars,popsize,n);
cars.sequence
%% 变异操作
cars=variation(cars,popsize,pmutation,n,backrate);
%% 计算适应度
for x=1:popsize
[cars.fitness(x)]=fitness(x,cars,n);
end
%% 找到最优个体以及他们的位置
[newbestfitness,newbestindex]=max(cars.fitness);
%% 替代上次中最好的染色体
if bestfitness<newbestfitness
bestfitness=newbestfitness;
bestcars=cars.sequence(:,:,newbestindex);
end
avgfitness=sum(cars.fitness)/popsize;
besttrace=[besttrace;avgfitness bestfitness];
end
toc