| 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
|