| Code: | function [dRow,dCol,action,mark] = solver( ...
mainMap,foodMap,myAntMap,opAntMap, ...
myScentMap,opScentMap,myDeathMap,opDeathMap)
foodMap=max(foodMap-1e6.*double(mainMap==1),0);
mark=0;
if ~isempty(find(foodMap<=myAntMap & foodMap>0,1))
mark=(25-max(myScentMap(3,3)-1,0))/myAntMap(3,3)+rand-0.5;
end
if ~isempty(find(foodMap<=myAntMap & foodMap>0,1)) && ~isempty(find(myScentMap>=40 & myScentMap<=55,1))
if myAntMap(3,3)>foodMap(3,3)
mark=(45-max(myScentMap(3,3)-1,0))/myAntMap(3,3)+rand-0.5;
end
end
if sum(sum(foodMap))>sum(sum(myAntMap))
mark=(85+fnEvaluaComida(foodMap,myAntMap)-max(myScentMap(3,3)-1,0))/myAntMap(3,3)+rand-0.5;
end
if ~isempty(find(mainMap==1,1))
mark=(50-max(myScentMap(3,3)-1,0))/myAntMap(3,3)+rand-0.5;
end
fProbNido=foodMap(3,3)/myAntMap(3,3);
fAleatorio=rand;
if fAleatorio<fProbNido
action=1;
IrNido=1;
else
action=0;
IrNido=0;
end
bCercaNido=0;
if IrNido
[r,c]=find(mainMap==1);
if isempty(r)
[r,c]=find(myScentMap>=45 & myScentMap<=55);
end
if isempty(r)
[r,c]=find(myScentMap>=37 & myScentMap<=55);
end
if isempty(r)
[r,c]=find(myScentMap>=30 & myScentMap<=55);
end
if isempty(r)
bCercaNido=0;
dRow = round(rand*2) - 1;
dCol = round(rand*2) - 1;
while isnan(mainMap(3+dRow,3+dCol)) || (dRow==0 && dCol==0)
dRow = round(rand*2) - 1;
dCol = round(rand*2) - 1;
end
else
bCercaNido=1;
[kk,imin]=min((r-3).^2+(c-3).^2);
iRow=r(imin(1))-3;
iCol=c(imin(1))-3;
dRow=fnlimit(iRow,-1,1);
dCol=fnlimit(iCol,-1,1);
while isnan(mainMap(3+dRow,3+dCol)) || (dRow==0 && dCol==0)
dRow = round(rand*2) - 1;
dCol = round(rand*2) - 1;
end
end
else
[r,c]=find(foodMap-opAntMap>0);
if isempty(r)
[r,c]=find(myScentMap>=90);
end
if isempty(r)
[r,c]=find(myScentMap>=80);
end
if isempty(r)
[r,c]=find(myScentMap>=70);
end
if isempty(r)
dRow = round(rand*2) - 1;
dCol = round(rand*2) - 1;
while isnan(mainMap(3+dRow,3+dCol)) || (dRow==0 && dCol==0)
dRow = round(rand*2) - 1;
dCol = round(rand*2) - 1;
end
else
[kk,imin]=min((r-3).^2+(c-3).^2);
dRow=fnlimit(r(imin(1))-3,-1,1);
dCol=fnlimit(c(imin(1))-3,-1,1);
end
end
fProbAtacar=sum(sum(opAntMap(2:4,2:4)))/sum(sum(myAntMap(2:4,2:4)));
fAleatorio=rand;
if fAleatorio<fProbAtacar
dRow=0;
dCol=0;
action=-1;
end
mark=fnlimit(round(mark),0,100);
end
function [Output]=fnlimit(fNumber,fMin,fMax)
Output=max(min(fNumber,fMax),fMin);
end
function [Output]=fnEvaluaComida(foodMap,myAntMap)
aTemp=foodMap-myAntMap;
Output=sum(sum(aTemp(2:4,2:4)))+sum(sum(aTemp))/3;
end
function [Output]=fnEvaluaNido(myScentMap)
aTemp=abs(myScentMap(find(myScentMap(myScentMap>35 & myScentMap<55)))-50);
Output=50-0.;
end
|