ID:49902
Title:FisrtAttempt
Author:j b
Date:2008-11-06 00:09:59
Score:25031.6553
Result:24881.73 (cyc: 22, node: 941)
CPU Time:108.3363
Status:Passed
Comments:
Based on:none
Code:
function [dRow,dCol,action,mark] = solver(mainMap,foodMap,myAntMap,opAntMap, ...
                                          myScentMap,opScentMap,myDeathMap,opDeathMap)


[mainMap foodMap myScentMap]=adjMaps(mainMap,foodMap,myScentMap);

homeMap = zeros(5);
homeMap(mainMap==1)=1;

% 3 modes:
%   1 take food home
%   2 attack
%   3 find food

% scale scent map for ease of use
scentMap = myScentMap/max([1; myScentMap(:)]);
scentRing = scentMap;
scentRing(2:4,2:4)=0;
if ~homeMap(3,3) && foodMap(3,3)/myAntMap(3,3)>=rand
    % take food home
    action = 1;
    field = 1e5*homeMap + scentRing;
    field(3,3)=0;
    field(isfinite(mainMap)) = field(isfinite(mainMap)) + .5*randn(sum(isfinite(mainMap(:))),1);
    [dRow dCol] = fieldToCmd(field);
    mark = 0;
elseif opAntMap(3,3)/myAntMap(3,3)>=rand
    % attack
    action = -1;
    dRow = 0;
    dCol = 0;
    mark = 0;
else
    % find food
    field = (1-scentRing) + 10*max(0,foodMap-myAntMap);
    field(homeMap==1)=0;
    field(~isfinite(mainMap))=0;
    field(isfinite(mainMap)) = field(isfinite(mainMap)) + .5*randn(sum(isfinite(mainMap(:))),1);
    action = 0;
    [dRow dCol] = fieldToCmd(field);
    if myScentMap(3,3)<100
        mark=5;
    else
        mark=0;
    end
end

if any(any(foodMap))
    mark=0;
elseif any(myScentMap(:)>1000) && myScentMap(3,3)<900
    mark = min(100,(900-myScentMap(3,3))/myAntMap(3,3));
elseif any(myScentMap(:)>900) && myScentMap(3,3)<800
    mark = min(100,(800-myScentMap(3,3))/myAntMap(3,3));
elseif any(myScentMap(:)>800) && myScentMap(3,3)<700
    mark = min(100,(700-myScentMap(3,3))/myAntMap(3,3));
elseif any(myScentMap(:)>700) && myScentMap(3,3)<600
    mark = min(100,(600-myScentMap(3,3))/myAntMap(3,3));
elseif any(myScentMap(:)>600) && myScentMap(3,3)<500
    mark = min(100,(500-myScentMap(3,3))/myAntMap(3,3));
end
if any(homeMap(:))
    mark = 100;
end

if action~=-1 && dCol==0 && dRow==0 || ~isfinite(mainMap(3+dRow,3+dCol))
    dCol = round(2*rand)-1;
    dRow = round(2*rand)-1;        
end


end
   
function [dRow dCol] = fieldToCmd(field)

        aa=[-2:2]'*ones(1,5);
        bb=ones(5,1)*[-2:2];
        tmp = sum([field(:).*bb(:) field(:).*aa(:)],1);
        tmp=round(tmp/abs(tmp(1)+i*tmp(2)));
        dCol=tmp(1);
        dRow=tmp(2);

        if ~isfinite(dCol+dRow) || dCol==0 && dRow==0
            dCol = round(2*rand)-1;
            dRow = round(2*rand)-1;
        end
end
    
function [mainMap foodMap myScentMap]=adjMaps(mainMap,foodMap,myScentMap)    
    if any(any(~isfinite(mainMap(2:4,2:4))))
        tmp = ones(5);
        nonFinites = ~isfinite(mainMap);

        if nonFinites(2,2)
            tmp(1,1)=0; if nonFinites(2,3), tmp(1,2)=0; end
        end
        if nonFinites(2,3), tmp(1,3)=0; end
        if nonFinites(2,4)
            tmp(1,5)=0; if nonFinites(2,3), tmp(1,4)=0; end
        end
        
        if nonFinites(2,4)
            tmp(1,5)=0; if nonFinites(3,4), tmp(2,5)=0; end
        end
        if nonFinites(3,4), tmp(3,5)=0; end
        if nonFinites(4,4)
            tmp(5,5)=0; if nonFinites(3,4), tmp(4,5)=0; end
        end
        
        if nonFinites(4,2)
            tmp(5,1)=0; if nonFinites(4,3), tmp(5,2)=0; end
        end
        if nonFinites(4,3), tmp(5,3)=0; end
        if nonFinites(4,4)
            tmp(5,5)=0; if nonFinites(4,3), tmp(5,4)=0; end
        end
        
        if nonFinites(2,2)
            tmp(1,1)=0; if nonFinites(3,2), tmp(2,1)=0; end
        end
        if nonFinites(3,2), tmp(3,1)=0; end
        if nonFinites(4,2)
            tmp(5,1)=0; if nonFinites(3,2), tmp(4,1)=0; end
        end
        
        foodMap=foodMap.*tmp;
        myScentMap=myScentMap.*tmp;
        mainMap=mainMap./tmp;
    end
end