华为杯C题遗传算法求解---主函数部分

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

   
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值