Code covered by the BSD License  

Highlights from
Cops and Robber Software

from Cops and Robber Software by Athanasios Kehagias
Functions to compute optimal schedules for a team of cops chasing a robber on a graph

[EC,ER]=CRcheq(C,R,P)
function [EC,ER]=CRcheq(C,R,P)
% function [EC,ER]=CRcheq(C,R,P)
% check if C, R are solutions of the (adversarial or drunk) optimality equations
%
% C:	cop cost matrix
% R:	robber cost matrix (use empty matrix for drunk optim. equations)
% E:	satisfaction matrix
%		EC(mc,mr)=0 iff (mc,mr) cop eq. is satisfied
%		ER(mc,mr)=0 iff (mc,mr) rob eq. is satisfied
NC=size(C);
NR=size(R);

N=NC(1);
if	max(NR)>0  & length(NC)==2			% adv.  robber, one cop
	[EC,ER]=CRcheqA2(C,R,P,N);
elseif	max(NR)==0 & length(NC)==2			% drunk robber, one cop
	[EC,ER]=CRcheqD2(C,R,P,N);
elseif	max(NR)>0  & length(NC)==3			% adv.  robber, two cops
	[EC,ER]=CRcheqA3(C,R,P,N);
elseif	max(NR)==0 & length(NC)==3			% drunk robber, two cops
	[EC,ER]=CRcheqD3(C,R,P,N);
else
	EC=[];
	ER=[];
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [EC,ER]=CRcheqA2(C,R,P,N)
EC=zeros(N,N);
ER=zeros(N,N);
PP=P+eye(N);
for mc=1:N
	for mr=1:N
		if 	mc==mr
			if C(mc,mr)==0; EC(mc,mr)=0; end
			if R(mc,mr)==0; ER(mc,mr)=0; end
		else
			Nc=find(PP(mc,:)>0);
			minR=min(R(Nc,mr));
			EC(mc,mr)=abs(C(mc,mr)-1-minR);
			Nr=find(PP(mr,:)>0);
			maxC=max(C(mc,Nr));
			ER(mc,mr)=abs(R(mc,mr)-maxC);
		end
	end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [EC,ER]=CRcheqD2(C,R,P,N)
EC=zeros(N,N);
ER=[];
PP=P+eye(N);
for mc=1:N
	for mr=1:N
		if 	mc==mr
			if C(mc,mr)==0; EC(mc,mr)=0; end
		else
			Nc=find(PP(mc,:)>0);
			CC=ones(1,N)*1e15;
			for nc=Nc
				CC(nc)=1;
				P1=P; P1(nc,:)=0; P1(:,nc)=0;
				Nr=find(P1(mr,:)>0);
				for nr=Nr
					CC(nc)=CC(nc)+P1(mr,nr)*C(nc,nr);
				end
			end
			minC=min(CC);
			EC(mc,mr)=abs(C(mc,mr)-minC);
		end
	end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [EC,ER]=CRcheqA3(C,R,P,N)
EC=zeros(N,N,N);
ER=zeros(N,N,N);
PP=P+eye(N);
for mc1=1:N
	for mc2=1:N
		for mr=1:N
			if 	mc1==mr || mc2==mr
				if C(mc1,mc2,mr)==0; EC(mc1,mc2,mr)=0; end
				if R(mc1,mc2,mr)==0; ER(mc1,mc2,mr)=0; end
			else
				Nc1=find(PP(mc1,:)>0);
				Nc2=find(PP(mc2,:)>0);
				minR=min(min(R(Nc1,Nc2,mr)));
				EC(mc1,mc2,mr)=abs(C(mc1,mc2,mr)-1-minR);
				Nr=find(PP(mr,:)>0);
				maxC=max(C(mc1,mc2,Nr));
				ER(mc1,mc2,mr)=abs(R(mc1,mc2,mr)-maxC);
			end
		end
	end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [EC,ER]=CRcheqD3(C,R,P,N)
EC=zeros(N,N,N);
ER=[];
PP=P+eye(N);
for mc1=1:N
	for mc2=1:N
		for mr=1:N
			if 	mc1==mr || mc2==mr
				if C(mc1,mc2,mr)==0; EC(mc1,mc2,mr)=0; end
			else
				Nc1=find(PP(mc1,:)>0);
				Nc2=find(PP(mc2,:)>0);
				CC=ones(N,N)*1e15;
				for nc1=Nc1
					for nc2=Nc2
						CC(nc1,nc2)=1;
						P1=P; P1(nc1,:)=0; P1(:,nc1)=0; P1(nc2,:)=0; P1(:,nc2)=0;
						Nr=find(P1(mr,:)>0);
						for nr=Nr
							CC(nc1,nc2)=CC(nc1,nc2)+P1(mr,nr)*C(nc1,nc2,nr);
						end
					end
				end
				minC=min(min(CC));
				EC(mc1,mc2,mr)=abs(C(mc1,mc2,mr)-minC);
			end
		end
	end
end

Contact us