您现在的位置是:首页 > 伤感句子

遗传算法求解选址问题(含matlab源码及视频教程)

作者:晨起时间:2024-04-16 08:01:28分类:伤感句子

简介  文章浏览阅读3k次,点赞6次,收藏43次。自己手写遗传算法求解选址问题代码,对于初学者很友好,算法通俗易懂,代码有注释,可以直接运行。内有算法手把手教学视频,逐行讲解代码,对于matlab初学者在理解和编程上有很大的帮助_遗传算法选址matlab

点击全文阅读

题目描述:

        现有20个客户点,7个可供配送的配送中心以及一个发件网点,客户点有不同数量的货物要求,现需要发件网点向若干个配送中心提供货物,再由配送中心提供给客户,保证每个客户由一个配送中心完成配送工作并且满足配送要求。目标为在保证客户要求的前提下达到成本最小,并给出具体的配送方案。

目标函数:

        其中,第一个目标函数是从发件网点到配送中心所运输成本,第二个约束函数为从配送中心到客户的运输成本,第三个约束为建立配送中心所需要的费用,第四个目标函数为每个配送中心的管理成本。

约束函数:

 符号意义:

求解:

        本文选择遗传算法进行求解,算法框图如下:

        算法编程难点在于对解集的建立和变换,对于这种复杂的解集,本文采用matlab的元胞数组建立解集,如下图所示。

        每一行代表一个个体,也就是一个解。

        对于每一行来说,第一个数字表示建立配送中心的个数

        第二个数组表示配送中心的编号,例如populationMat{1,2}=[3,5,1],代表的含义为选择第3,5,1号配送。

        第三列数组表示每个配送中心所服务的客户数目。例如populationMat{1,3}=[9,5,6],代表,3号配送中心服务9个客户,5号配送中心服务5个客户,1号配送中心服务6个客户。

        第四列数组代表客户的编号,populationMat{1,3}=[2   3   1   4   5  15   17   13   16   19   12    20   11   8   18   6   7   10   9   14],代表3号配送中心服务9个客户,客户编号分别是2 3 1 4 5 15 17 13 16。5号配送中心服务5个客户,分别是19 12 20 11 8,以此类推。

        以下是整个函数的主程序部分,函数总体是按照遗传算法框图不走来写的,初始化种群,计算适应度,选择,交叉,变异...

%% 清空变量clear;clc;%% 用户自定义数据[customerPosition,distriCenterPosition,sendPosition,distriCenterConstantCost,distriCenterVolume,... distriCenterManageCost,sendToDistriCenterPer,distriCenterToCustomerPer,customerRequirement] = DataFunction;probabilityMat = [0.01,0.05,0.3,0.3,0.2,0.1,0.04];% probabilityMat = ones(1,7)/7;% probabilityMat = [0 0 0 1 0 0 0];%% 用户不可修改数据M = size(distriCenterPosition,1);                       %配送中心的数目N = size(customerPosition,1);                           %客户的数目if length(probabilityMat)~=M || abs(sum(probabilityMat)-1)>=1e-6    error('参数probabilityMat的大小与配送中心数目不一致或probabilityMat加和不为1');end%% 遗传算法数据populationNumber = 50;                                  %种群数量pro = 0.1;                                              %变异概率populationMat = cell(populationNumber,4);               %种群数据矩阵iter = 1;                                               %当前迭代次数iterMax = 1000;                                         %最大迭代次数bestValue = inf;bestValueNow = inf;bestValueMat = zeros(populationNumber,1);bestSolve = cell(1,4);%% 初始化个体populationMat = InitializeIndividuality(populationMat,populationNumber,M,N,probabilityMat,customerRequirement,distriCenterVolume,distriCenterPosition,customerPosition);while iter<=iterMax    if iter<iterMax/2        pro = 0.5;    else        pro = 0.05;    end    %% 计算适应度    p = CalcuFitCapacity(populationMat,sendPosition,distriCenterPosition,sendToDistriCenterPer,customerPosition,distriCenterToCustomerPer,distriCenterConstantCost,distriCenterManageCost,populationNumber);        %% 选择    populationMat = SelectionFunction(populationMat,populationNumber,p);        %% 交叉    populationMat = CrossFunction(populationMat,populationNumber,customerRequirement,distriCenterVolume,distriCenterPosition,customerPosition,N);    %% 变异    populationMat = HeteromorphosisFunction(populationMat,probabilityMat,pro,populationNumber,M,N,customerRequirement,distriCenterVolume,distriCenterPosition,customerPosition);    %% 寻找最优解    [bestValueNow,bestSolveNow] = CalcuBestIndividuiality(populationMat,populationNumber,sendPosition,distriCenterPosition,sendToDistriCenterPer,customerPosition,distriCenterToCustomerPer,distriCenterConstantCost,distriCenterManageCost);        if bestValueNow<bestValue        bestValueMat(iter) = bestValueNow;        bestValue = bestValueNow;        bestSolve = bestSolveNow;    else        bestValueMat(iter) = bestValue;    end    iter = iter+1;end%% 画图DrawPicture(bestSolve,distriCenterPosition,customerPosition,sendPosition)%% 迭代关系图figureplot(1:iterMax,bestValueMat,'r-','LineWidth',1);xlabel('迭代次数(代)')ylabel('配送费用(万元)')title('迭代次数与每代最优解关系图')legend('每代最优解')grid on%% 输出结果disp(['选取的配送中心为:',num2str(bestSolve{1,2}),',总费用为:',num2str(bestValue),'万元']);numberMat = cumsum(bestSolve{1,3});for k1 = 1:bestSolve{1,1}    if k1 == 1        disp(['第',num2str(bestSolve{1,2}(k1)),'个配送中心对应的客户为:',num2str(bestSolve{1,4}(1:numberMat(k1)))]);    else        disp(['第',num2str(bestSolve{1,2}(k1)),'个配送中心对应的客户为:',num2str(bestSolve{1,4}(numberMat(k1-1)+1:numberMat(k1)))]);    endend

        以下是运行结果:

获取代码方式:遗传算法求解选址问题

        自己手写遗传算法求解选址问题代码,对于初学者很友好,算法通俗易懂,代码有注释,可以直接运行。内有算法手把手教学视频,逐行讲解代码,对于matlab初学者在理解和编程上有很大的帮助
        代码纯自己手动编写,支持原创,感谢配合。
        不支持售后,视频内容十分详细,有代码参数的讲解,代码编写的讲解,看完视频即可有对代码的全部理解。
        代码只可用来做日常学习,不可用于售卖以及商业用途,违者追究法律责任,望重视!!!

 

 

点击全文阅读

郑重声明:

本站所有活动均为互联网所得,如有侵权请联系本站删除处理

我来说两句