ID:49945
Title:17_AdvDefAdvAdvRandAnt
Author:Abhisek Ukil
Date:2008-11-06 10:25:21
Score:24168.8700
Result:24113.91 (cyc: 12, node: 876)
CPU Time:93.8312
Status:Passed
Comments:
Based on:none
Code:
function [dRow,dCol,action,mark] = solver(mainMap,foodMap,myAntMap,opAntMap, ...
    myScentMap,opScentMap,myDeathMap,opDeathMap)

dRow   = round(rand*2) - 1;
dCol   = round(rand*2) - 1;
action=0;
mark=10;

%look for home
[hi,hj]=find(mainMap==1);
if isempty(hi),hi=0;end
if isempty(hj),hj=0;end


path=[hi hj];

%if there is enemy, stay still and kill, effective
if opAntMap(3,3)>0
    dRow=0;
    dCol=0;
    action=-1;
    mark=5;
    %return
end

% if we start at food and with no enemy
if foodMap(3,3)>0 & opAntMap(3,3)==0
    if path(1,1)>0 & path(1,1)~=3 & path(1,2)>0 & path(1,2)~=3 %try to move to home
        %[dRow,dCol]=definitemove(path(1,1),path(1,2));
        [dRow,dCol]=definitemoveadv(path(1,1),path(1,2),mainMap);
        %[dRow,dCol,action,mark]=randommove();
        %[dRow,dCol,action,mark]=randommoveadv(mainMap,opAntMap,myDeathMap);
    else
        %[dRow,dCol]=findpath(path);
        %[dRow,dCol,action,mark]=randommove();
        %[dRow,dCol,action,mark]=randommove2(mainMap);
        [dRow,dCol,action,mark]=randommoveadv(mainMap,opAntMap,myDeathMap);
    end
    action=1;
    mark=50;
    %return
end

% if we start at home, explore further
%[foodR,foodC]=find(foodMap>0);
if hi==3 & hj==3 %current position is home
    [dRow,dCol,action,mark]=foodsearch(foodMap,mainMap,opAntMap,myDeathMap);
end


%do something for other conditions
%disp('Other Condition')



end

%----------------------------------

function [dRow,dCol,action,mark]=foodsearch(foodMap,mainMap,opAntMap,myDeathMap)
[foodR,foodC]=find(foodMap>0);
if ~isempty(foodR) %and there is food, go for it
    dist=distance([3,3],[foodR,foodC]);
    if numel(dist)>1
        dist(dist==0)=10000; %needed for min, max

        [foodval,foodindex]=min(dist); %nearest food, good 23604

        %foodindex=ceil(rand*numel(foodR)); %random food, good 23573

        %[foodval,foodindex]=max(dist); %farthest food, not good, 24191

        fi=foodR(foodindex);
        fj=foodC(foodindex);
        %[dRow,dCol]=definitemove(fi,fj); action=0; mark=10;
        [dRow,dCol]=definitemoveadv(fi,fj,mainMap); action=0; mark=10;
        %[dRow,dCol,action,mark]=randommoveadv(mainMap,opAntMap,myDeathMap);
    else
        %[dRow,dCol]=findpath(path); action=0; mark=10;
        %[dRow,dCol,action,mark]=randommove();
        %[dRow,dCol,action,mark]=randommove2(mainMap);
        [dRow,dCol,action,mark]=randommoveadv(mainMap,opAntMap,myDeathMap);
    end
else %there is no food in sight
    %[dRow,dCol]=findpath(path); action=0; mark=10;
    %[dRow,dCol,action,mark]=randommove();
    %[dRow,dCol,action,mark]=randommove2(mainMap);
    [dRow,dCol,action,mark]=randommoveadv(mainMap,opAntMap,myDeathMap);
end
end

%----------------------------------

function d=distance(x,y)

d=[];
for i=1:size(y,1)
    d(end+1)=(x(1)-y(i,1))^2+(x(2)-y(i,2))^2;
end
end

%----------------------------------
function [dRow,dCol,action,mark]=randommove()
dRow   = round(rand*2) - 1;
dCol   = round(rand*2) - 1;
action = 0;
mark   = 10; % scent


end

%----------------------------------
function [dRow,dCol,action,mark]=randommove2(mainMap)
dRow   = round(rand*2) - 1;
dCol   = round(rand*2) - 1;
action = 0;
mark   = 10; % scent

dR=dRow; dC=dCol;
if isnan(mainMap(dRow+3,dCol+3)) %it won't be a move
    dRow=dR; dCol=0;
else
    return
end

if isnan(mainMap(dRow+3,dCol+3)) %it won't be a move
    dRow=0; dCol=dC;
else
    return
end

if isnan(mainMap(dRow+3,dCol+3)) %it won't be a move
    dRow=dR; dCol=dC; %can be better
else
    return
end

end

%-------------------------------------------------------------------
function [dRow,dCol,action,mark]=randommoveadv(mainMap,opAntMap,myDeathMap)
action = 0;
mark   = 10;
dRow=-10000; dCol=-10000;
iter=0;
deathrate=mean(myDeathMap(:));
while dRow==-10000 & dCol==-10000 & iter<100
    iter=iter+1;
    dRow   = round(rand*2) - 1;
    dCol   = round(rand*2) - 1;
    if isnan(mainMap(dRow+3,dCol+3)) | opAntMap(dRow+3,dCol+3)>0 | myDeathMap(dRow+3,dCol+3)>deathrate %not suitable
        dRow=-10000; dCol=-10000;
    end
end

if iter==100 & dRow==-10000 & dCol==-10000
    dRow=0; dCol=0;
end
end


%----------------------------------
function [dRow,dCol]=definitemove(fi,fj)
di=fi-3;
dj=fj-3;
if di~=0, dRow=di/abs(di); end
if di==0, dRow=di; end
if dj~=0, dCol=dj/abs(dj); end
if dj==0,dCol=dj; end
end

%----------------------------------
function [dRow,dCol]=definitemoveadv(fi,fj,mainMap)
di=fi-3;
dj=fj-3;
if di~=0, dRow=di/abs(di); end
if di==0, dRow=di; end
if dj~=0, dCol=dj/abs(dj); end
if dj==0,dCol=dj; end

dR=dRow; dC=dCol;
if isnan(mainMap(dRow+3,dCol+3)) %it won't be a move
    dRow=dR; dCol=0;
else
    return
end

if isnan(mainMap(dRow+3,dCol+3)) %it won't be a move
    dRow=0; dCol=dC;
else
    return
end

if isnan(mainMap(dRow+3,dCol+3)) %it won't be a move
    dRow=dR; dCol=dC; %can be better
else
    return
end
end