ID:50036
Title:Try
Author:Vishal Mahulkar
Date:2008-11-06 18:16:13
Score:37117.4641
Result:36957.19 (cyc: 39, node: 735)
CPU Time:107.6138
Status:Passed
Comments:
Based on:none
Code:
function [dy,dx,carry,mark] = house_solver(main,food,ants,opAntMap, ...
                                          scent,opScentMap,myDeathMap,opDeathMap)
% main(main==-1) = 0;
try
    if ~isempty(find(main>0,1))
        food(main == 1) = 0;
    end
catch
    0;
end

mark = 0;
if opAntMap(13)>0 
    carry = -1;    
    dx=0;
    dy=0;
    return;
end
main(isnan(main)) = -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=main<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
    main(BAD)=-1;
    food(BAD)=0;
    scent(BAD)=0;
end
BAD(13)=1;

findFood = 0;
moveHome = 0;
% Don't want to do this because multiple ants will try to carry the food
% If you can get food (food(13)>0) carry it away from food
if (food(13)>0 && main(13) ~= 1)
    leftOverAnts = food(13)-ants(13);
    if leftOverAnts >= 0
        carry = 1;
        moveHome = 1;
    elseif rand<((food(13)+ants(13))/2)/ants(13)
        carry = 1;
        moveHome = 1;
    else
        carry = 0;
        findFood = 1;
    end
else
    carry = 0;
    findFood = 1;
end

if findFood
%     [yhome,xhome] = find(food-ants>0);
%     dhere=min(min(abs(yhome-3),abs(xhome-3)));
    target = food-ants;
%     mark=10;
elseif moveHome
    target = scent+1E5*(main>0);
end

if any(any(main==1))
    mark = 10;
elseif findFood && scent(13) < 10
    mark = ceil(mean(scent(:))*.01);
else
    mark=0;
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

dx = dirx(x,y);
if dx<2
    dy = 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;
[dy,dx]=find(t==max(t(:)));
r=ceil(rand*numel(dy));
dy=dy(r)-2;
dx=dx(r)-2;


return;