ID:49938
Title:CatHuntsAntsInTheDark
Author:SY
Date:2008-11-06 10:11:55
Score:10668.0442
Result:10034.03 (cyc: 49, node: 1581)
CPU Time:130.3277
Status:Passed
Comments:
Based on:none
Code:
function [dy,dx,carry,mark]=solver(main,food,ants,opants,scent,opscent,mydeadscent,opdeadscent)

%18372.39 or 18293.70
%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;
BAD=isnan(main); %SY
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;
    main(BAD)=NaN; %SY
    food(BAD)=0;
    scent(BAD)=0;
end
BAD(13)=1;
% setup game stats
scents=scent(scent>0);
maxscent=max(scents(:));
% mark this field
if (max(main(:)))
    sc13=scent(13);
    mark=rndround((400-scent(13))/ants(13));
    scent(13)=400;
    init=0;
    hills=find(main>0);
    scent(hills)=1e7;
    food(hills)=0;
    if isempty(scents)
        %maxscent=mark;
        maxscent=400-sc13;
    end
elseif (maxscent==min(scents(:))) % init phase
    %mark=maxscent-scent(13);
    mark=rndround((maxscent-scent(13))/ants(13));
    scent(13)=maxscent;
    init=1;
elseif isempty(scents) % nothing is marked
    %mark=98;
    mark=rndround(98/ants(13));
    scent(13)=scent(13)+98;
    %maxscent=mark;
    maxscent=98;
    init=1;
else
%    mark=maxscent-1-scent(13);
    mark=rndround((maxscent-1-scent(13))/ants(13));
    scent(13)=maxscent-1;
    init=0;
end

agr=0.8;
opsum=opants(7)+opants(8)+opants(9)+opants(12)+opants(14)+opants(17)+opants(18)+opants(19);
if opsum
    if rand*ants(13)<agr*opsum
        dy=0;
        dx=0;
        carry=-1;
        return
    end
end

% look around for food
if max(food(:))<1 ||init % nothing found or no way home, search
    target=maxscent-scent;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
    carry=food(13)>0;
    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;
end;
if (food(13)>1)&&rand<.95 % sit on a lot of food, go home
    target=scent;target(BAD)=-1;
    [y,x]=find(target==max(target(:)));
    if (numel(y)>1)
        y=y(1);
        x=x(1);
    end
    carry=1;
    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;
end;
if (food(13) >= 1) % sit on one food, build track
    target=scent;target(BAD)=-1;
    [yhome,xhome]=find(target==max(target(:)));
    lowfood=food;lowfood(scent>=scent(13))=0;
    carry=1;
    dhere=max(max(abs(yhome-3),abs(xhome-3)));
    runs=numel(lowfood(lowfood(:)>0));
    lowfood(i24,i24)=lowfood(i24,i24)*1e8;
    target=lowfood;target(BAD)=-1;
    while runs % fetch food behind
        [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);
        else
            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;
        end
        if ( min(max(abs(yhome-y),abs(xhome-x))) > dhere )
            carry=0;
            return;
        end
        target(y,x)=0;runs=runs-1;
    end
    if (carry) % go home
        target=scent;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;
    end
    return;
end;
target=max(food-ants,0);target(BAD)=-1000;
[y,x]=find(target==max(target(:)));
if (numel(y)>1)
    r=ceil(rand*numel(y));
    y=y(r);
    x=x(r);
end
carry=0;
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;


function r=rndround(a)
b=floor(a);
b1=(a-b)>rand;
r=b+b1;