Wonderw_ 2023-02-09 22:39 采纳率: 80%
浏览 21
已结题

遗传算法路径初始化出错,求纠错!!

使用matlab进行多行程路径优化的遗传算法运算,但是在初始化路径的时候会漏掉一些任务点,比如本来应该是100个任务点,但是初始化后得到的路径中总共只有90多个,求问各位问题出在那一步?代码如下:

%% 初始化路径
%输入cusnum   顾客数量 1-100
%输入a        左时间窗 [a,b],最早允许开始服务时间
%输入demands  每个顾客的需求量
%输入cap      车辆最大载货量
%输入v_num    最大可用车辆数目
function [init_vc] = init(cusnum,a,demands,cap,v_num)
j=ceil(rand*cusnum);                    %从所有顾客中随机选择一个顾客
k=1;                                    %使用车辆数目,初始设置为1
r=1;                                    %最大行程数,初始设置为1
init_vc=cell(r,k);
% 按照如下序列,遍历每个顾客,并执行以下步骤
if j==1
    seq=1:cusnum;
elseif j==cusnum
    seq=[cusnum,1:j-1];
else
    seq1=1:j-1;
    seq2=j:cusnum;
    seq=[seq2,seq1];
end
% 开始遍历
route=[];       %存储每条路径上的顾客
load=0;         %初始路径上在仓库的装载量为0
i=1;
while i<=cusnum
    %如果没有超过容量约束,则按照左时间窗大小,将顾客添加到当前路径
    if load+demands(seq(i))<=cap         
        load=load+demands(seq(i));          %初始在仓库的装载量增加
        %如果当前路径为空,直接将顾客添加到路径中
        if isempty(route)
            route=[seq(i)];
        %如果当前路径只有一个顾客,再添加新顾客时,需要根据左时间窗大小进行添加
        elseif length(route)==1
            if a(seq(i))<=a(route(1))
                route=[seq(i),route];   
            else
                route=[route,seq(i)];
            end
        else
            lr=length(route);       %当前路径长度,则有lr-1对连续的顾客
            flag=0;                 %标记是否存在这样1对顾客,能让seq(i)插入两者之间
            %遍历这lr-1对连续的顾客的中间插入位置
            for m=1:lr-1
                if (a(seq(i))>=a(route(m)))&&(a(seq(i))<=a(route(m+1)))
                    route=[route(1:m),seq(i),route(m+1:end)];
                    flag=1;
                    break
                end
            end
            %如果不存在这样1对顾客,能让seq(i)插入两者之间,也就是flag=0,则需要将seq(i)插到route末尾
            if flag==0
                route=[route,seq(i)];
            end
        end
        %如果遍历到最后一个顾客,则更新init_vc,并跳出程序
        if i==cusnum
            init_vc{r,k}=route;
            break
        end
        i=i+1;
    elseif k>v_num   %如果k大于最大使用车辆数目则需要增加车辆运行行程
        init_vc{r,k}=route;
        r=r+1;
        route=[];
        load=0;
        k=1;
        i=i+1;
    else
        init_vc{r,k}=route;
        route=[];
        load=0;
        k=k+1;
        i=i+1;
 
    end
end
end

  • 写回答

2条回答 默认 最新

  • 社区专家-Monster-XH 2023-02-09 23:19
    关注

    从代码来看,没有看出有什么明显的问题,需要通过调试的方式进一步排查。

    具体的,可以添加一些输出语句来打印出 "seq" 序列,以及 "route" 路径序列的内容,看是否有什么顾客没有被加入到路径中。另外,也可以考虑在初始化路径之前,打印一下 "cusnum","a","demands","cap","v_num" 的内容,以确保每个输入参数都是正确的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月18日
  • 已采纳回答 2月10日
  • 创建了问题 2月9日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效