⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 focusddstar.m

📁 通过研讨Stentz的Focussed D*文章
💻 M
📖 第 1 页 / 共 2 页
字号:

    if (flag ==1)
        h=plot(X.x, X.y, 'ro');drawnow;
        legend('Start','Goal','OPEN','CLOSED');
    end
%    
    Ylist = GetNeighbour8(X);
    for j = 1 : 8
        Y = Ylist(j); 
        if Y.x<1 | Y.y<1 | Y.x>Xmax | Y.y>Ymax
            continue;
        end
        Ynext = Var.B(Y.y, Y.x);
        Cxy = C(X,Y,map);

        
        %************comment of IF*****************************************
        %if Y is a NEW node, then insert Y into OPEN
        %or when Y points to X but H(y) dosen't equal to H(x) plus
        %Cost(X,y), this means X state or map(X) is changed, then re-insert
        %Y into OPEN. Or Y dosen't point to X, but X may be is on the
        %optimal next point of Y.
        if Var.Tag(Y.y, Y.x)==0 ... % a NEW state
                | (isequal(Ynext, X) & Var.H(Y.y, Y.x)~=Var.H(X.y, X.x)+Cxy) ...%Y指向了X但代价不一致
            Var.B(Y.y, Y.x) = X;
            INSERT(Y, Var.H(X.y,X.x)+Cxy);
        else
            if (~isequal(Ynext, X) & Var.H(Y.y, Y.x)>Var.H(X.y, X.x)+Cxy)
                if Var.H(X.y, X.x) > K_old
                    if Var.Tag(X.y, X.x)==2 INSERT(X, Var.H(X.y, X.x)); end
                else
                    Var.B(Y.y, Y.x) = X;
                    INSERT(Y, Var.H(X.y,X.x)+Cxy);                   
                end
            else
                if ~isequal(Ynext, X) & Var.H(X.y, X.x)>Var.H(Y.y, Y.x)+Cxy%Cxy=Cyx
                    if Var.H(Y.y, Y.x) > K_old
                        if Var.Tag(Y.y, Y.x)==2 INSERT(Y, Var.H(Y.y, Y.x)); end
                    else
                        Var.B(X.y, X.x) = Y;
                        INSERT(X, Var.H(Y.y, Y.x)+Cxy);
                    end
                end
            end
        end
    end
  
    val = GET_MIN_VAL();
    return; 

    
 %GET_MIN_STATE: Return the state on the OPEN list with minimum k(*) value,
 %NULL if the list is empty. Since OPEN is ordered degressive, so the 
 %last element is the minimal state
function state = GET_STATE()
    global Var;
    if isempty(Var.OPEN)
        state = [];
        disp(1)
    else
        state = Var.OPEN(end);
    end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       
 

 
 %DELETE(X): Deletes state X from the OPEN list and set Tag(X)=CLOSED
function DELETE(X)
    global Var;
    Var.Tag(X.y, X.x) = 2;

    num = length(Var.OPEN);
    while num~=0 & ~(Var.OPEN(num).x==X.x & Var.OPEN(num).y==X.y)
        num = num - 1;
    end
    % 不考虑状态增大或者减小吗?
    Var.OPEN = [Var.OPEN(1:num-1), Var.OPEN(num+1:end)];

        
 %INSERT(X): set Tag(X) = 1(OPEN), compute k(X) from H(X) and Pre(X), and places
 % or re-positions state X on the OPEN list sorted by K(*)
function pos = INSERT(X, hnew)
    global Var;


    Var.Rcur = Var.R;

    if Var.Tag(X.y, X.x)==0 %X is in NEW state
       Var.K(X.y, X.x) = hnew;
    else
       if Var.Tag(X.y,X.x)==1 % X is in OPEN state
            Var.K(X.y,X.x) = min(Var.K(X.y,X.x), hnew);
            DELETE(X);
       else % X in in CLOSED state
            Var.K(X.y,X.x) = min(Var.H(X.y,X.x), hnew);
       end
    end

    Var.H(X.y, X.x) = hnew;
    Var.r(X.y, X.x) = Var.Rcur;
    Var.f(X.y, X.x) = Var.K(X.y, X.x)+Get_gVal(X, Var.Rcur);;
    Var.fB(X.y, X.x) = Var.f(X.y, X.x)+Var.Dcur;
    
    %Uncomment this line to watch which nodes are put into OPEN
%     persistent h;
%     if ishandle(h) delete(h);end
%     h = plot(X.x, X.y, 'bo'); drawnow;
    
    pos = PUT_STATE(X);
%            
function  pos = PUT_STATE(X)
   global Var;
   % OPEN is null
    if isempty(Var.OPEN)
       Var.OPEN = X;
       pos = 1;

    % X is in NEW or CLOSED state    
    elseif Var.Tag(X.y, X.x)~=1 % ~= OPEN
        num = length(Var.OPEN);
        while num>0 & Var.fB(Var.OPEN(num).y, Var.OPEN(num).x)<Var.fB(X.y, X.x)
              num = num - 1;
        end
        while num>0 & Var.fB(Var.OPEN(num).y, Var.OPEN(num).x)==Var.fB(X.y, X.x) ...
                    & Var.f(Var.OPEN(num).y, Var.OPEN(num).x)<Var.f(X.y, X.x)
              num = num - 1;
        end
        while num>0 & Var.fB(Var.OPEN(num).y, Var.OPEN(num).x)==Var.fB(X.y, X.x) ...
                    & Var.f(Var.OPEN(num).y, Var.OPEN(num).x)==Var.f(X.y, X.x) ...
                    & Var.K(Var.OPEN(num).y, Var.OPEN(num).x)<Var.K(X.y, X.x)
              num = num - 1;
        end    
        Var.OPEN = [Var.OPEN(1:num), X, Var.OPEN(num+1:end)];
        pos = num+1;
        
    % X is in OPEN     
    else  %Tag(X.y, X.x)==1 %OPEN  %delete X from OPEN
        DELETE(X);
        pos = PUT_STATE(X);
   end

   Var.Tag(X.y, X.x) = 1;                
 
   
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %function s = S(X,Y)
      %  s=abs(Y.y-X.y)+abs(Y.x-X.x)+abs(Y.z-X.z);
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function val = MODIFY_COST(X,Y,cval)
    global Var;   
    %  cxy=cval;

    if Var.Tag(X.y, X.x)==2 
        pos = INSERT(X, Var.H(X.y,X.x));
    end
    val = GET_MIN_VAL();
    
    
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
function val = LESS(x,y)
    val = 0;
    if x(1)<y(1)
        val=1;
    elseif x(1)==y(1) & x(2)<y(2)
        val=1;
    else
        val=0;
    end
    
                
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function f_K = GET_MIN_VAL()
    global Var;
    X=GET_MIN_STATE();
    if isempty(X)
        f_K = [];
    else
        f_K = [Var.f(X.y,X.x), Var.K(X.y,X.x)];
    end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function state=GET_MIN_STATE()
    global Var;
    state = [];
    X = GET_STATE();
    while ~isempty(X)
        r = Var.r(X.y, X.x);
        R = Var.Rcur;
        if ~isequal(r, R)
           DELETE(X); INSERT(X, Var.H(X.y,X.x));
           X = GET_STATE();
        else
            state=X;
            return;
        end
    end
      
      
function Ylist = GetNeighbour8(X)
        Ylist = [];
        Y = X;
        for j = 1 : 8
            switch (j)
                case 1
                    Y.x = Y.x + 1;
                case 2
                    Y.y = Y.y + 1;
                case 3
                    Y.x = Y.x - 1;
                case 4
                    Y.x = Y.x - 1;
                case 5
                    Y.y = Y.y - 1;
                case 6
                    Y.y = Y.y - 1;
                case 7
                    Y.x = Y.x + 1;
                case 8
                    Y.x = Y.x + 1;
            end
            Ylist = [Ylist Y];
        end


function y = IsNodeOnPath(list, p)
%确认节点是否存在于列表中
    y = 0;
    num = length(list);
    while num~=0
        if list(num).x==p.x & list(num).y==p.y
            y=1;
            return
        end
        num = num-1;
    end
	return;


function InconsistentX = CheckBySensor(Center, r, map)
    global ori_map;
    [Ymax Xmax] = size(map);
    min_x = max(Center.x - r, 1);
    max_x = min(Center.x + r, Xmax);
    min_y = max(Center.y - r, 1);
    max_y = min(Center.y + r, Ymax);
    Dmap = map(min_y : max_y, min_x : max_x) ...
           - ori_map(min_y : max_y, min_x : max_x);
    [ty tx] = find(Dmap~=0);
    InconsistentX = [];
    for i=1:length(tx)
        InconsistentX(i).x = tx(i) + min_x - 1;
        InconsistentX(i).y = ty(i) + min_y - 1;
        ori_map(InconsistentX(i).y, InconsistentX(i).x) = map(InconsistentX(i).y, InconsistentX(i).x);
    end
    

function bInconsistency = Sensor(X, map)
    global Var;
    Ylist = GetNeighbour8(X);
    [Ymax Xmax] = size(map);
    bInconsistency = 0;
    for i = 1 : 8
        Y = Ylist(i);
        if Y.x<1 | Y.y<1 | Y.x>Xmax | Y.y>Ymax
            continue;
        end
        if Var.Tag(Y.y, Y.x)~=0
            Sxy = abs(Var.H(Y.y, Y.x)-Var.H(X.y, X.x));
            Cxy = C(X, Y, map);
            if Sxy~=Cxy
                bInconsistency = 1;
                return;
            end
        end
    end
                
function f_H = COST(X)
    global Var;
    f = Var.H(X.y, X.x) + Get_gVal(X, Var.Rcur);
    H = Var.H(X.y, X.x);
    f_H = [f, H];
    return;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -