ID:50381
Title:solver_v0
Author:Z
Date:2008-11-08 02:15:22
Score:52822.8505
Result:37122.70 (cyc: 8, node: 587)
CPU Time:179.4596
Status:Passed
Comments:
Based on:none
Code:
function [dRow,dCol,action,mark] = solver_v0(mainMap,foodMap,myAntMap,opAntMap, ...
                                          myScentMap,opScentMap,myDeathMap,opDeathMap)

% Move Map
moveMap = mainMap(2:4,2:4);
moveMap = moveMap + ones(3,3);
moveMap(2,2) = 0;
[tR,tC,tV] = find(moveMap);
tIndex = find(~isnan(tV));
pMove = [tR(tIndex),tC(tIndex)]-2;
numP = size(moveMap,1);

% Locate Home
[lR,lC] = find(mainMap==1);
L = [lR,lC];
numL = size(L,1);

% Locate Scent
MS = findMax(myScentMap);

% Locate Food
[FM,numF,maxFv] = findMax(foodMap-myAntMap);
if (maxFv < 0)
   [FM,numF,maxFv] = findMax(foodMap);
end

% Locate Nearby Scent
[NMS,numNMS,maxNMS] = findMax(myScentMap(2:4,2:4));


% Actions
if (nnz(foodMap) == 0)    
    % Random Move 
    [dRow,dCol] = randSelect(pMove);
    action = 0;
    if (numL > 0)
        mark = 100;
    else
        mark = 0;
    end
else
    if (foodMap(3,3) > 0)
        % Carry 
        action = 1;
        mark = 0;
        if (numL == 0)
            [dRow,dCol] = move2Max(pMove,MS);
        else
            [dRow,dCol] = move2Home(pMove,L); 
        end
    else
        
        action = 0;
        [dRow,dCol] = move2Max(pMove,FM);
        if (maxNMS > 100)
            mark = 100;
        elseif (maxNMS < 0)
            mark = 0;
        else
            mark = maxNMS-1;
        end        
    end    
end

end

function [maxL,numCount,maxV] = findMax(matrixMap)

maxL = [];
numCount = 0;
maxV = -1;
[tempR,tempC,tempV] = find(matrixMap);
numCount = length(tempV);
if (numCount>0)
    [maxV,tempIndex] = max(tempV);
    maxL = [tempR(tempIndex),tempC(tempIndex)];
end
return;

end

function [dR,dC] = randSelect(moveMap)

numP = size(moveMap,1);
if (numP > 0)
    rdSelect = round(rand*(numP-1))+1;
    dR = moveMap(rdSelect,1);
    dC = moveMap(rdSelect,2);
else
    dR = 0;
    dC = 0;
end

return;

end


function [dR,dC] = move2Home(moveMap,homeLocation)

dR = 0;
dC = 0;
numP = size(moveMap,1);
if (numP == 0)
    return;
end
globalMin = min(sum((homeLocation-3).^2));
numL = size(homeLocation,1);

for k=1:numL
    d = sum((repmat(homeLocation(k,:),numP,1)-(moveMap+3)).^2,2);
    [mValue,mIndex] = min(d);
    if (mValue<globalMin)
        dR = moveMap(mIndex,1);
        dC = moveMap(mIndex,2);
        globalMin = mValue;
    end 
end

return;

end

function [dR,dC] = move2Max(moveMap,maxMatrix)

numM = size(maxMatrix,1);
if (numM>0)
    desiredMove = sign(maxMatrix-3);
    tempIndexR = find(moveMap(:,1)==desiredMove(1,1));
    if (length(tempIndexR) > 0)
        tempIndexC = find(moveMap(tempIndexR,2)==desiredMove(1,2));
        if (length(tempIndexC) > 0)
            dR = desiredMove(1,1);
            dC = desiredMove(1,2);
            return;
        end
    end
end
[dR,dC] = randSelect(moveMap);

return;

end