| Code: | function [dRow,dCol,action,mark] = solver( ...
mainMap,foodMap,myAntMap,opAntMap, ...
myScentMap,opScentMap,myDeathMap,opDeathMap)
% mainMap(mainMap==-1) = 0;
if ~isempty(find(mainMap>0,1))
foodMap(mainMap == 1) = 0;
end
mark = 0;
closeOpAntMap = opAntMap(2:4,2:4);
if any(any(closeOpAntMap>0)) || ...
opAntMap(1) || opAntMap(5) || opAntMap(20) || opAntMap(25)
action = -1;
dCol=0;
dRow=0;
return;
end
mainMap(isnan(mainMap)) = -1;
rand(1,5);
i35=3:5;
i24=2:4;
i02=0:2;
dirx = [-1,2,2,2,-1; 2,-1,-1,-1,2; 2,0,0,0,2; 2,1,1,1,2; 1,2,2,2,1];
diry = [-1,-1,0,1,1; -1,-1,0,1,1; -1,-1,0,1,1; -1,-1,0,1,1; -1,-1,0,1,1];
% find reachable regions
BAD=mainMap<0;
if BAD(7)||BAD(9)||BAD(17)||BAD(19)
if BAD(7)
BAD(1)=1;
BAD(2)=BAD(2)||BAD(8);
BAD(3)=BAD(3)||(BAD(8)&&BAD(9));
BAD(6)=BAD(6)||BAD(12);
BAD(11)=BAD(11)||(BAD(12)&&BAD(17));
end
if BAD(9)
BAD(4)=BAD(4)||BAD(8);
BAD(5)=1;
BAD(10)=BAD(10)||BAD(14);
end
if BAD(17)
BAD(16)=BAD(16)||BAD(12);
BAD(21)=1;
BAD(22)=BAD(22)||BAD(18);
end
if BAD(19)
BAD(15)=BAD(15)||(BAD(9)&&BAD(14));
BAD(20)=BAD(20)||(BAD(14));
BAD(23)=BAD(23)||(BAD(17)&&BAD(18));
BAD(24)=BAD(24)||(BAD(18));
BAD(25)=1;
end
% modify current board based on reachable regions
mainMap(BAD)=-1;
foodMap(BAD)=0;
myScentMap(BAD)=0;
end
BAD(13)=1;
findFood = 0;
moveHome = 0;
% Don't want to do this because multiple myAntMap will try to action the foodMap
% If you can get foodMap (foodMap(13)>0) action it away from foodMap
if (foodMap(13)>0 && mainMap(13) ~= 1)
leftOverFoodMap = foodMap(13)-myAntMap(13);
if leftOverFoodMap >= 0
action = 1;
moveHome = 1;
% elseif rand<((foodMap(13)+myAntMap(13))/2.1)/myAntMap(13)
elseif rand<(foodMap(13)*1.2)/myAntMap(13)
action = 1;
moveHome = 1;
else
action = 0;
findFood = 1;
end
else
action = 0;
findFood = 1;
end
toMark = 0;
if any(any(mainMap==1))
toMark = 200-myScentMap(13);
mark = floor(toMark/myAntMap(13))+(rand<rem(toMark,myAntMap(13))/myAntMap(13));
elseif any(any(myScentMap>175)) % Can see near home but not home
toMark = 150-myScentMap(13);
mark = floor(toMark/myAntMap(13))+(rand<rem(toMark,myAntMap(13))/myAntMap(13));
elseif any(any(myScentMap>125)) % Can see near home but not home
toMark = 100-myScentMap(13);
mark = floor(toMark/myAntMap(13))+(rand<rem(toMark,myAntMap(13))/myAntMap(13));
elseif any(any(myScentMap>75)) % Can see near home but not home
toMark = 50-myScentMap(13);
mark = floor(toMark/myAntMap(13))+(rand<rem(toMark,myAntMap(13))/myAntMap(13));
elseif any(any(myScentMap>18))
toMark = max(max(myScentMap))*9/10-myScentMap(13);
if toMark > 20
mark = floor(toMark/myAntMap(13))+(rand<rem(toMark,myAntMap(13))/myAntMap(13));
else
mark = 0;
end
elseif any(any(myScentMap>7))
toMark = 15-myScentMap(13);
mark = floor(toMark/myAntMap(13))+(rand<rem(toMark,myAntMap(13))/myAntMap(13));
% else
% mark = min(floor(min(myScentMap(myScentMap>0))/myAntMap(13))-2,floor(20/myAntMap(13)));
end
% if moveHome && (max(myScentMap(myScentMap>0))-min(myScentMap(myScentMap>0))>100)
% mark = 0;
% end
if findFood
% [yhome,xhome] = find(foodMap-myAntMap>0);
% dhere=min(min(abs(yhome-3),abs(xhome-3)));
if any(any(foodMap))
target = foodMap-myAntMap;
if mark == 0 && toMark == 0
toMark = 15-myScentMap(13);
mark = floor(toMark/myAntMap(13))+(rand<rem(toMark,myAntMap(13))/myAntMap(13));
end
% target = 1./(round(rand)*myScentMap+1E5*(mainMap>0)+1e-1);
% target = 1./(round(rand)*100*(myScentMap>20)+1E5*(mainMap>0)+1e-1);
% target = 1./(1E5*(mainMap>0)+round(rand)*(myScentMap>40)+1e-1);
else
if any(any(myScentMap(~BAD)<18))
target = myScentMap<18;
else
target = 1./((myScentMap>100)*1E3+1E5*(mainMap>0)+1e-1);
% target = rand(5,5);
end
end
% mark=10;
elseif moveHome
if any(any(myScentMap>17))
target = myScentMap+1E6*(mainMap>0);
else
target = rand(5,5);
end
end
target(BAD)=-1;
[y,x]=find(target==max(target(:)));
if (numel(y)>1)
r=ceil(rand*numel(y));
y=y(r);
x=x(r);
end
dCol = dirx(x,y);
if dCol<2
dRow = diry(x,y);
return;
end;
m(7,7)=0;
m(y+i02,x+i02)=1;
m=m(i35,i35);
t=target(i24,i24).*m+m;
[dRow,dCol]=find(t==max(t(:)));
r=ceil(rand*numel(dRow));
dRow=dRow(r)-2;
dCol=dCol(r)-2;
return; |