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