当前位置:首页>java>代码分享 | 基于Q-learning的三维路径规划算法

代码分享 | 基于Q-learning的三维路径规划算法

  • 2026-01-29 14:45:32
代码分享 | 基于Q-learning的三维路径规划算法

一、算法整体框架

该代码实现了基于Q-learning的三维路径规划算法,核心逻辑是通过强化学习(Reinforcement Learning, RL)让智能体在离散的三维网格环境中,学习从起点到终点的最优可行路径。Q-learning作为无模型RL算法的典型代表,通过学习“状态-动作对”的Q值(动作价值函数),指导智能体选择最优动作,最终生成满足地形、高度等约束的路径。

二、Q-learning核心数学基础

Q-learning的核心是动作价值函数 Q(s,a),表示“在状态 s 下执行动作 a 后,能获得的长期奖励期望”。其更新遵循时序差分学习(Temporal Difference, TD)规则,公式如下:

符号说明:

st:当前状态(三维网格中的节点坐标 (xt,yt,zt));

at:当前动作(向某一邻居状态的转移方向);

R(st,at):执行动作 at 后的即时奖励;

α∈(0,1]:学习率,控制Q值更新的幅度(α越大,对新奖励越敏感);

γ∈(0,1]:折扣因子,权衡“即时奖励”与“未来奖励”的重要性(γ越大,越重视未来奖励);

st+1:执行动作 at 后转移到的下一状态;

maxat+1Q(st+1,at+1):下一状态 st+1 下所有可能动作的最大Q值,代表未来能获得的最大长期奖励。

三、状态空间与离散化

算法将三维环境(范围 1≤x≤MAX X ,1≤y≤MAX Y,1≤z≤MAX Z)离散为网格状状态空间,每个状态对应一个网格节点 (x,y,z)。为了高效存储Q值,使用线性索引将三维坐标转换为一维状态索引,公式为:

意义:将三维坐标映射到一维数组位置,便于构建Q矩阵(大小为“总状态数 × 动作数”)。其中,动作数固定为27(对应3×3×3的邻域方向,即当前状态的上下、左右、前后等26个方向加自身)。

四、奖励函数设计:引导路径最优性

奖励函数是Q-learning的“指挥棒”,直接决定智能体的学习方向。代码中的奖励函数综合考虑环境收益、目标导向、动作成本,公式如下:

分项解析:

1.环境收益项 Renv:对应代码中的 solar3dim(...),表示智能体在“下一状态”能获得的环境收益(如太阳能、电能等),是正向激励。

2.终点引导项 Rgoal:公式为 15×(distancelast−distancenext),其中:

distancelast=(xt−xgoal)2+(yt−ygoal)2+(zt−zgoal)2(当前状态到终点的欧氏距离);

distancenext=(xt+1−xgoal)2+(yt+1−ygoal)2+(zt+1−zgoal)2(下一状态到终点的欧氏距离)。

该项的意义:鼓励智能体向终点移动——若下一状态更靠近终点(distancelast>distancenext),则获得正奖励;否则惩罚。系数15调节该项的权重。

3.高度惩罚项 Rheight:公式为 −5×∣zt+1−zt∣,其中 ∣zt+1−zt∣ 是当前状态与下一状态的高度差绝对值。该项惩罚高度剧烈变化(如无人机爬升需额外能耗),系数5控制惩罚强度。

4.终点奖励 Rterminal:若下一状态是终点(xt+1=xgoal,yt+1=ygoal,zt+1=zgoal),则 R(x)=150,是强正向激励,引导智能体到达终点。

五、探索与利用:平衡未知与已知

强化学习的关键是平衡探索(Exploration)与利用(Exploitation):

探索:尝试新动作,发现潜在更优路径;

利用:选择已知Q值最大的动作,使用已有知识。

代码中采用ε-greedy策略(通过参数 yip 控制),逻辑如下:

当随机数 rand<yip 时,利用:选择当前状态下Q值最大的动作(maxaQ(st,a));

当 rand≥yip 时,探索:随机选择一个可行动作。

学习阶段划分:

前期(Q矩阵稀疏):使用 noyip 函数(yip=0,完全随机探索),快速填充Q矩阵;

后期(Q矩阵密集):使用 haveyip 函数(逐步增加 yip 至0.9),减少探索,增加利用,直到找到稳定路径。

六、状态转移与约束处理

智能体的状态转移需满足环境约束,确保路径可行。代码中对“下一状态(邻居状态)”的筛选条件如下:

边界约束:下一状态坐标 (xt+1,yt+1,zt+1) 必须在环境范围内(1≤x≤MAXX,1≤y≤MAXY,1≤z≤MAXZ);

障碍约束:下一状态不能是障碍(arena_m(xt+1,yt+1,zt+1)=−1);

重复约束:下一状态不能是已访问过的状态(alreadyacc(state_ind)=1),避免路径循环。

七、Q表更新与路径生成

Q表初始化:Q矩阵初始化为全0,表示未学习的状态-动作对;

Q表更新:每当智能体执行动作 at,转移到 st+1,获得奖励 R 后,按Q-learning公式更新Q值;

路径生成:当Q矩阵足够密集(非零元素>500000),使用greedy策略生成路径:从起点出发,每次选择当前状态Q值最大的动作,直到到达终点。生成的路径需满足:

路径长度稳定(连续迭代的长度差<5);

路径点数合适(<100点);

低空约束(路径高度≥地形高度+1000m,即 规划高度=地形高度+1000)。

八、约束验证:确保路径可行性

路径生成后,需验证其符合实际应用约束(如低空飞行、地形避让)。代码中通过计算每个路径点的:

1.地形高度:Terrain_Data(x,y)(路径点对应的地形海拔);

2.规划高度:qwaypoints(z)×100+MIN_Final_Data(智能体规划的飞行高度);

3.低空限制高度:地形高度+1000(飞行高度必须高于此值,确保安全)。

通过绘制三者的曲线,验证规划路径是否满足“规划高度≥低空限制高度≥地形高度”的约束。

九、总结

该算法的核心是Q-learning的动作价值函数更新,结合了环境收益、目标导向和约束条件,确保路径的最优性(向终点靠近、低能耗)与可行性(无碰撞、无循环)。其数学基础是时序差分学习公式,通过探索与利用的平衡,最终生成满足实际需求的三维路径。

这种方法在无人机航迹规划、机器人路径导航等领域具有广泛应用前景,关键在于奖励函数的合理设计和约束条件的精准融入。

代码

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Qlearning路径规划算法主函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clcclear all;close all;begintime = tic;fprintf('程序运行中,请稍后\n');load ('MapData.mat');% 返回的arena数据结构有六个参数,分别是MAX_X,MAX_Y,MAX_Z,arena_m,src,desarena = importArena(MAPMAX_XMAX_YMAX_Z);alpha = 0.9;gamma = 0.7;goalstateind = sub2ind(size(arena.arena_m), arena.des(1), arena.des(2), arena.des(3));[Q, docroutelength, qwaypoints, times, maplength, qnumber] = learnQMatrix(arena, alpha, gamma, solar3dim, Display_Data);figure(4)a = docroutelength(:1);b = docroutelength(:2);plot(a, b, '-');save('qMatrix.mat''Q');%load('qMatrix');figure(5)a = qnumber(:1);b = qnumber(:2);plot(a, b, '-');runtime=toc(begintime);fprintf('greedy qlearning results\n');fprintf('运行时间: %.2f s\n', runtime);fprintf('迭代次数:%d次\n',times);fprintf('规划路径点个数:%d个\n', size(qwaypoints, 1));fprintf('规划路径长度:%.2f m\n'100*docroutelength(times-12));fprintf('规划路径地面投影长度:%.2f m\n', maplength*100);% 作图fprintf('正在绘图\n');angle = {[0,90],[60,70]};ttl = {'Qlearning算法三维路径规划俯视图','Qlearning算法三维路径规划图'};for i = 1:2    figure(i)    axis([1 MAX_X 1 MAX_Y 1 MAX_Z]); % 设置坐标轴范围为1MAX_X,1MAX_Y,1MAX_Z    plot3(qwaypoints(:,1),qwaypoints(:,2),qwaypoints(:,3),'b','linewidth',2);    hold on    plot3(20,20,7,'+k','LineWidth',8);    hold on    plot3(90,70,5,'*r','LineWidth',8);    hold on    legend(['\fontname{宋体}轨迹'],['\fontname{宋体}起点'],['\fontname{宋体}终点']);    legend('AutoUpdate','off');    surf(Display_Data(1:100,1:100)','linestyle','none'); % 创建一个曲面图,并将 Z 中元素的列索引和行索引用作 x 坐标和 y 坐标    set(gca,'xticklabel',{'0','10','20','30','40','50','60','70','80','90','100'});    set(gca,'yticklabel',{'0','10','20','30','40','50','60','70','80','90','100'});    set(gca,'zticklabel',{'2000','4000','6000','4000','5000','6000','7000','8000','9000','10000'});    xlabel(['\fontname{Times new roman}x\fontname{宋体}方向节点']);    ylabel(['\fontname{Times new roman}y\fontname{宋体}方向节点']);    zlabel(['\fontname{宋体}高度\fontname{Times new roman}(m)']);    set(gca,'fontsize',12,'fontname','Times new roman');    %%%%%%%%%%%%%%%%绘制异常天气区,绿色为异常天气区    figure(i)    [a,z]=ndgrid((0:.05:1)*2*pi,0:.05:20);    x=7.5*cos(a)+60;    y=7.5*sin(a)+70;    surf(x,y,z,x*0,'linestyle','none','Facealpha',0.7,'FaceColor','g')    hold on    % 对异常区域封顶    [a,r]=ndgrid((0:.05:1)*2*pi,[0 1]);    x=7.5*cos(a).*r+60;    y=7.5*sin(a).*r+70;    surf(x,y,x*0,x*0,'linestyle','none','Facealpha',0.7,'FaceColor','g')    surf(x,y,x*0+20,x*0,'linestyle','none','Facealpha',0.7,'FaceColor','g')    hold off    grid on    set(gca, 'XTick', 0:10:100);    set(gca, 'YTick', 0:10:100);    set(gca, 'GridLineStyle', 'none');    set(gca, 'GridAlpha', 0);    view(angle{i});    title(ttl{i},'FontSize',13,'FontWeight', 'bold');end% 证明轨迹符合低空要求及地形要求% 注意map中的50是地形最低点起之上的50Terrain_Data = Final_Data(301:400,101:200);num = size(qwaypoints, 1);figset = [];MIN_Final_Data = min(min(Final_Data(301:400,101:200)));for i = 1:num    figset(i, 1) = i;    figset(i, 2) = Terrain_Data(qwaypoints(i, 1), qwaypoints(i, 2));    figset(i, 3) = qwaypoints(i, 3) * 100 + MIN_Final_Data;    figset(i, 4) = Terrain_Data(qwaypoints(i, 1), qwaypoints(i, 2)) + 1000;endfigure(3)h1 = plot(figset(:, 1), figset(:, 2), '-g', 'linewidth',1);hold onh2 = plot(figset(:, 1), figset(:, 3), '-b', 'linewidth',1);hold onh3 = plot(figset(:, 1), figset(:, 4), '--r','linewidth',1);set(gca,'xtick',0:10:110)legend(['\fontname{宋体}航迹对应地形高度'],['\fontname{宋体}规划航迹高度'],['\fontname{宋体}航迹对应低空限制高度']);legend('AutoUpdate','off');title('Qlearning','FontSize',13,'FontWeight', 'bold');xlabel(['\fontname{宋体}路径点']);ylabel(['\fontname{宋体}高度\fontname{Times new roman}(m)']);set(gca,'fontsize',12,'fontname','Times new roman');hold offfprintf('规划完毕\n');function nextsub = qind2sub(nextState, currState)% 给出27个nextState中选出的一个,以及当前状态的sub,返回对应变化的m,j,k以及对应sub[m, j, k] = ind2sub([3 3 3], nextState);m = m - 2;j = j - 2;k = k - 2;nextsub = currState + 100*100*k + 100* j + m;endfunction [Q, routelength] = noyip(arena, alpha, gamma, solar3dim, Q, Display_Data)[arSizeR, arSizeC, arSizeZ] = size(arena.arena_m);alreadyacc = zeros(arSizeR*arSizeC*arSizeZ, 1);currstatesub = [arena.src(1), arena.src(2), arena.src(3)];qwaypoints = [arena.src(1), arena.src(2), arena.src(3)];while true    currstateind = sub2ind([arSizeR arSizeC arSizeZ], currstatesub(1), currstatesub(2), currstatesub(3));    [a, b, c] = ind2sub([arSizeR arSizeC arSizeZ], currstateind);    neighbor = [];    for i = -1:1:1        for j = -1:1:1            for k = -1:1:1                neighbor(size(neighbor, 1)+1, :) = [a+i, b+j, c+k];            end        end    end    % 检查有无元素溢出规定矩阵    outRangetest = [];    for i = 1:size(neighbor, 1)        outRangetest(i) = (neighbor(i,1)<1) || (neighbor(i,1)>100) || (neighbor(i,2)<1) || (neighbor(i,2)>100) || (neighbor(i,3)<1) || (neighbor(i,3)>10+Display_Data(neighbor(i,1), neighbor(i,2)));    end    locate = find(outRangetest>0);    neighbor(locate,:)=[];    % 判断地形是否不可达    terr = [];    for i = 1:size(neighbor, 1)        terr(i) = arena.arena_m(neighbor(i, 1), neighbor(i, 2), neighbor(i, 3));    end    locate = find(terr == -1);    neighbor(locate,:)=[];    % 不走重复点    alreadyacc(currstateind, 1)=1; %判断是否走了重复点    neighborIndex = sub2ind([arSizeR arSizeC arSizeZ],neighbor(:,1),neighbor(:,2),neighbor(:,3));    locate = find(alreadyacc(neighborIndex(:, 1), 1) == 1);    neighbor(locate,:)=[];    % 进入死胡同的处理    if isempty(neighbor)==1%走入死胡同退出        alreadyacc=zeros(arSizeR*arSizeC*arSizeZ, 1);        routelength = 0;        break;    end    % R值的计算    for x=1:size(neighbor, 1)        distancelast = sqrt((a-arena.des(1))^2 + (b-arena.des(2))^2 + (c-arena.des(3))^2);        distancenext = sqrt((neighbor(x,1)-arena.des(1))^2 + (neighbor(x,2)-arena.des(2))^2 + (neighbor(x,3)-arena.des(3))^2);        detah = abs(neighbor(x, 3) - c);        %distancebetween = sqrt((neighbor(x,1)-a)^2 + (neighbor(x,2)-b)^2 + (neighbor(x,3)-c)^2);        R(x)=solar3dim(neighbor(x,1), neighbor(x,2), neighbor(x,3)) + 15*(distancelast - distancenext) - 5*detah; % R是获得的能量减去这一步的成本        if neighbor(x, 1)==arena.des(1) && neighbor(x,2)==arena.des(2) && neighbor(x,3)==arena.des(3)            R(x)=150;        end    end    % 随机选择下一个状态    randnum = randi(size(neighbor, 1));    nextstatesub = neighbor(randnum, :);    qwaypoints(size(qwaypoints, 1)+1, :) = [nextstatesub(1),nextstatesub(2),nextstatesub(3)];    nextstateind = sub2ind([arSizeR arSizeC arSizeZ],nextstatesub(1),nextstatesub(2),nextstatesub(3));    r = R(randnum);    % 找出下一个状态的相应action    x = nextstatesub(1) - a;    y = nextstatesub(2) - b;    z = nextstatesub(3) - c;    actionind = sub2ind([3 3 3], x+2, y+2, z+2);    % 更新Q表    maxQ=max(Q(nextstateind, :));    Q(currstateind, actionind)=Q(currstateind, actionind)+alpha*(r+gamma*maxQ-Q(currstateind, actionind));    currstatesub = nextstatesub;    R=[];    if currstatesub(1)==arena.des(1) && currstatesub(2)==arena.des(2) && currstatesub(3)==arena.des(3)        alreadyacc=zeros(arSizeR*arSizeC*arSizeZ, 1);        routelength = 0;        for i = 1:size(qwaypoints, 1)-1            routelength = routelength + sqrt((qwaypoints(i+1,1)-qwaypoints(i,1))^2 + (qwaypoints(i+1,2)-qwaypoints(i,2))^2 + (qwaypoints(i+1,3)-qwaypoints(i,3))^2);        end        break;    endendendfunction [Q, docroutelength, returnpoints, times, maplength, qnumber] = learnQMatrix(arena, alpha, gamma, solar3dim, Display_Data)[arSizeR, arSizeC, arSizeZ] = size(arena.arena_m);Q = zeros(arSizeR*arSizeC*arSizeZ, 27);times = 0;docroutelength = [];qnumber = [];while true    times = times + 1;    if length(find(Q~=0)) < 500000        fprintf('Q矩阵稀疏,no greedy qlearning进行中,迭代次数%d次\n', times);        [Q, routelength] = noyip(arena, alpha, gamma, solar3dim, Q, Display_Data);        qnumber(size(qnumber,1)+1, :) = [times, length(find(Q~=0))];    else        fprintf('greedy qlearning进行中,迭代次数%d次\n', times)         yip = 0.9;        [qwaypoints, routelength] = haveyip(yip, arena, alpha, gamma, solar3dim, Q, Display_Data);        if routelength~=0 && size(qwaypoints, 1) <100 && abs(routelength - docroutelength(size(docroutelength, 1), 2)) < 5            yip = 1;            [qwaypoints, routelength] = haveyip(yip, arena, alpha, gamma, solar3dim, Q, Display_Data);            returnpoints = qwaypoints;            maplength = 0;            for i = 1:size(qwaypoints, 1)-1                maplength = maplength + sqrt((qwaypoints(i+1,1)-qwaypoints(i,1))^2 + (qwaypoints(i+1,2)-qwaypoints(i,2))^2);            end            break;        end    end    docroutelength(size(docroutelength, 1)+1, :) = [times, routelength];endendfunction arena = importArena(map, MAX_X, MAX_Y, MAX_Z)% arena数据结构有六个参数,分别是MAX_X,MAX_Y,MAX_Z,arena_m,src,des% 意义分别是活动区域范围x,y,z,地图标记矩阵,起点所在位置,终点所在位置arena.MAX_X = MAX_X;arena.MAX_Y = MAX_Y;arena.MAX_Z = MAX_Z;arena.arena_m = map; arena.src = [20, 20, 7];arena.des = [90, 70, 5];endfunction [qwaypoints, routelength] = haveyip(yip, arena, alpha, gamma, solar3dim, Q, Display_Data)[arSizeR, arSizeC, arSizeZ] = size(arena.arena_m);alreadyacc = zeros(arSizeR*arSizeC*arSizeZ, 1);currstatesub = [arena.src(1), arena.src(2), arena.src(3)];qwaypoints = [arena.src(1), arena.src(2), arena.src(3)];while true    currstateind = sub2ind([arSizeR arSizeC arSizeZ], currstatesub(1), currstatesub(2), currstatesub(3));    [a, b, c] = ind2sub([arSizeR arSizeC arSizeZ], currstateind);    neighbor = [];    for i = -1:1:1        for j = -1:1:1            for k = -1:1:1                neighbor(size(neighbor, 1)+1, :) = [a+i, b+j, c+k];            end        end    end    % 检查有无元素溢出规定矩阵    outRangetest = [];    for i = 1:size(neighbor, 1)        outRangetest(i) = (neighbor(i,1)<1) || (neighbor(i,1)>100) || (neighbor(i,2)<1) || (neighbor(i,2)>100) || (neighbor(i,3)<1) || (neighbor(i,3)>10+Display_Data(neighbor(i,1), neighbor(i,2)));    end    locate = find(outRangetest>0);    neighbor(locate,:)=[];    % 判断地形是否不可达    terr = [];    for i = 1:size(neighbor, 1)        terr(i) = arena.arena_m(neighbor(i, 1), neighbor(i, 2), neighbor(i, 3));    end    locate = find(terr == -1);    neighbor(locate,:)=[];    % 不走重复点    alreadyacc(currstateind, 1)=1; %distance标志位判断是否走了重复点    neighborIndex = sub2ind([arSizeR arSizeC arSizeZ],neighbor(:,1),neighbor(:,2),neighbor(:,3));    locate = find(alreadyacc(neighborIndex(:, 1), 1) == 1);    neighbor(locate,:)=[];    % 进入死胡同的处理    if isempty(neighbor)==1%走入死胡同退出        alreadyacc=zeros(arSizeR*arSizeC*arSizeZ, 1);        routelength = 0;        break;    end    % R值的计算    for x=1:size(neighbor, 1)        distancelast = sqrt((a-arena.des(1))^2 + (b-arena.des(2))^2 + (c-arena.des(3))^2);        distancenext = sqrt((neighbor(x,1)-arena.des(1))^2 + (neighbor(x,2)-arena.des(2))^2 + (neighbor(x,3)-arena.des(3))^2);        detah = abs(neighbor(x, 3) - c);        %distancebetween = sqrt((neighbor(x,1)-a)^2 + (neighbor(x,2)-b)^2 + (neighbor(x,3)-c)^2);        R(x)=solar3dim(neighbor(x,1), neighbor(x,2), neighbor(x,3)) + 15*(distancelast- distancenext) - 5*detah; % R是获得的能量减去这一步的成本        if neighbor(x, 1)==arena.des(1) && neighbor(x,2)==arena.des(2) && neighbor(x,3)==arena.des(3)            R(x)=150;        end    end    % 按照greedy选择下一状态    if rand < yip        nextstateset = find(Q(currstateind, :) == max(Q(currstateind, :))); % 这里是否应该使用向量的第一个值        nextstate = nextstateset(randi(size(nextstateset,2)));        nextstateind = qind2sub(nextstate, currstateind);        [nxtR, nxtC, nxtZ] = ind2sub(size(arena.arena_m), nextstateind);        x = nxtR - a;        y = nxtC - b;        z = nxtZ - c;        while(arena.arena_m(nxtR, nxtC, nxtZ) == -1 || nextstateind < 1 || nextstateind > 500000 || nxtZ>10+Display_Data(nxtR, nxtC) || x+2>3 ||x+2<1 ||y+2>3 ||y+2<1 ||z+2>3 ||z+2<1)            num = randi(size(nextstateset,2));            nextstate = nextstateset(num);            nextstateind = qind2sub(nextstate, currstateind);            [nxtR, nxtC, nxtZ] = ind2sub(size(arena.arena_m), nextstateind);            x = nxtR - a;            y = nxtC - b;            z = nxtZ - c;            nextstateset(num) = [];            if size(nextstateset, 2)==0 && (arena.arena_m(nxtR, nxtC, nxtZ)==-1 || nextstateind < 1 || nextstateind > 500000 || nxtZ>10+Display_Data(nxtR, nxtC) || x+2>3 ||x+2<1 ||y+2>3 ||y+2<1 ||z+2>3 ||z+2<1)                break;            end        end        if size(nextstateset, 2)==0 && (arena.arena_m(nxtR, nxtC, nxtZ)==-1 || nextstateind < 1 || nextstateind > 500000 || nxtZ>10+Display_Data(nxtR, nxtC) || x+2>3 ||x+2<1 ||y+2>3 ||y+2<1 ||z+2>3 ||z+2<1)            routelength = 0;            break;        end        actionind = sub2ind([3 3 3], x+2, y+2, z+2);        Q(currstateind, actionind) = -inf;        qwaypoints(size(qwaypoints, 1)+1,:) = [nxtR, nxtC, nxtZ];        currstatesub = [nxtR, nxtC, nxtZ];        R = [];    else        % 随机选择下一个状态        randnum = randi(size(neighbor, 1));        nextstatesub = neighbor(randnum, :);        qwaypoints(size(qwaypoints, 1)+1, :) = [nextstatesub(1),nextstatesub(2),nextstatesub(3)];        nextstateind = sub2ind([arSizeR arSizeC arSizeZ],nextstatesub(1),nextstatesub(2),nextstatesub(3));        r = R(randnum);        % 找出下一个状态的相应action        x = nextstatesub(1) - a;        y = nextstatesub(2) - b;        z = nextstatesub(3) - c;        actionind = sub2ind([3 3 3], x+2, y+2, z+2);        % 更新Q表        maxQ=max(Q(nextstateind, :));        Q(currstateind, actionind)=Q(currstateind, actionind)+alpha*(r+gamma*maxQ-Q(currstateind, actionind));        currstatesub = nextstatesub;        R=[];    end    if currstatesub(1)==arena.des(1) && currstatesub(2)==arena.des(2) && currstatesub(3)==arena.des(3)        alreadyacc=zeros(arSizeR*arSizeC*arSizeZ, 1);        routelength = 0;        for i = 1:size(qwaypoints, 1)-1            routelength = routelength + sqrt((qwaypoints(i+1,1)-qwaypoints(i,1))^2 + (qwaypoints(i+1,2)-qwaypoints(i,2))^2 + (qwaypoints(i+1,3)-qwaypoints(i,3))^2);        end        break;    endendend

计算结果

与我交流(为方便长期交流合作,加友请按要求备注行业/专业,不胜感激))

微信号wx18813053116

常用马甲|Grandfissure

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 15:39:13 HTTP/2.0 GET : https://f.mffb.com.cn/a/463058.html
  2. 运行时间 : 0.196140s [ 吞吐率:5.10req/s ] 内存消耗:4,679.95kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=a5faaab5a381fb4e7e3edacc10b5fbef
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000615s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000608s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000328s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000330s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000697s ]
  6. SELECT * FROM `set` [ RunTime:0.001325s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000548s ]
  8. SELECT * FROM `article` WHERE `id` = 463058 LIMIT 1 [ RunTime:0.002713s ]
  9. UPDATE `article` SET `lasttime` = 1770536353 WHERE `id` = 463058 [ RunTime:0.009120s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.008493s ]
  11. SELECT * FROM `article` WHERE `id` < 463058 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001647s ]
  12. SELECT * FROM `article` WHERE `id` > 463058 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002305s ]
  13. SELECT * FROM `article` WHERE `id` < 463058 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.009815s ]
  14. SELECT * FROM `article` WHERE `id` < 463058 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001705s ]
  15. SELECT * FROM `article` WHERE `id` < 463058 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.005548s ]
0.197706s