| Code: | function [dRow,dCol,action,mark] = solver_v0(mainMap,foodMap,myAntMap,opAntMap, ...
myScentMap,opScentMap,myDeathMap,opDeathMap)
% Move Map
moveMap = mainMap(2:4,2:4);
moveMap = moveMap + ones(3,3);
moveMap(2,2) = 0;
[tR,tC,tV] = find(moveMap);
tIndex = find(~isnan(tV));
pMove = [tR(tIndex),tC(tIndex)]-2;
numP = size(moveMap,1);
% Locate Home
[lR,lC] = find(mainMap==1);
L = [lR,lC];
numL = size(L,1);
% Locate Scent
MS = findMax(myScentMap);
% Locate Food
[FM,numF,maxFv] = findMax(foodMap-myAntMap);
if (maxFv < 0)
[FM,numF,maxFv] = findMax(foodMap);
end
% Locate Nearby Scent
[NMS,numNMS,maxNMS] = findMax(myScentMap(2:4,2:4));
% Actions
if (nnz(foodMap) == 0)
% Random Move
[dRow,dCol] = randSelect(pMove);
action = 0;
if (numL > 0)
mark = 100;
else
mark = 0;
end
else
if (foodMap(3,3) > 0)
% Carry
action = 1;
mark = 0;
if (numL == 0)
[dRow,dCol] = move2Max(pMove,MS);
else
[dRow,dCol] = move2Home(pMove,L);
end
else
action = 0;
[dRow,dCol] = move2Max(pMove,FM);
if (maxNMS > 100)
mark = 100;
elseif (maxNMS < 0)
mark = 0;
else
mark = maxNMS-1;
end
end
end
end
function [maxL,numCount,maxV] = findMax(matrixMap)
maxL = [];
numCount = 0;
maxV = -1;
[tempR,tempC,tempV] = find(matrixMap);
numCount = length(tempV);
if (numCount>0)
[maxV,tempIndex] = max(tempV);
maxL = [tempR(tempIndex),tempC(tempIndex)];
end
return;
end
function [dR,dC] = randSelect(moveMap)
numP = size(moveMap,1);
if (numP > 0)
rdSelect = round(rand*(numP-1))+1;
dR = moveMap(rdSelect,1);
dC = moveMap(rdSelect,2);
else
dR = 0;
dC = 0;
end
return;
end
function [dR,dC] = move2Home(moveMap,homeLocation)
dR = 0;
dC = 0;
numP = size(moveMap,1);
if (numP == 0)
return;
end
globalMin = min(sum((homeLocation-3).^2));
numL = size(homeLocation,1);
for k=1:numL
d = sum((repmat(homeLocation(k,:),numP,1)-(moveMap+3)).^2,2);
[mValue,mIndex] = min(d);
if (mValue<globalMin)
dR = moveMap(mIndex,1);
dC = moveMap(mIndex,2);
globalMin = mValue;
end
end
return;
end
function [dR,dC] = move2Max(moveMap,maxMatrix)
numM = size(maxMatrix,1);
if (numM>0)
desiredMove = sign(maxMatrix-3);
tempIndexR = find(moveMap(:,1)==desiredMove(1,1));
if (length(tempIndexR) > 0)
tempIndexC = find(moveMap(tempIndexR,2)==desiredMove(1,2));
if (length(tempIndexC) > 0)
dR = desiredMove(1,1);
dC = desiredMove(1,2);
return;
end
end
end
[dR,dC] = randSelect(moveMap);
return;
end
|