%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%% VALVES LOCATION OPTIMIZATION %%%%%%% %%%%%%% FO: MAX MIN SATISFIED DEM. %%%%%%% %%%%%%% TYPE: PIPE REACHABILITY %%%%%%% %%%%%%% ANDREA PEANO 10/10/2012 %%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %just some tools %Symmetric pipe symm_pipe(A,B):- pipe(A,B). symm_pipe(B,A):- pipe(A,B). %We need a lexicographic order (there may be more than one worst isolation cases) less_ico(pipe(A,B), pipe(C,D)):- pipe(A,B), pipe(C,D), AB, valve(X,A). % %A pipe adjacent to the tank is reached, when a generic pipe is broken iff there is no valve between them. reached(pipe(A,B), broken(X,Y)):- tank(A), pipe(X,Y), pipe(A,B), not closed_valve(v(A,B), broken(X,Y)). reached(pipe(A,B), broken(X,Y)):- tank(B), pipe(X,Y), pipe(A,B), not closed_valve(v(B,A), broken(X,Y)). % %Can we recursively reach any tank?? reached(pipe(A,B), broken(X,Y)) :- adj(pipe(A,B), pipe(C,D), COM, U1, U2), %COM is not a tank! not closed_valve(v(COM,U1), broken(X,Y)), not closed_valve(v(COM,U2), broken(X,Y)), reached(pipe(C,D), broken(X,Y)). % %The broken pipe must be unreachable! :- pipe(A,B), reached(pipe(A,B), broken(A,B)). % % Pair-wise comparisons between delivered demand pipe isolation cases %lower(pipe(X,Y), pipe(W,Z)) :- pipe(X,Y), pipe(W,Z), % #sum [ reached(pipe(A,B), broken(X,Y))=Dn: dem(A,B,Dn), % reached(pipe(C,D), broken(W,Z))=-Dm: dem(C,D,Dm) ] 0. lower(pipe(X,Y), pipe(W,Z)) :- pipe(X,Y), pipe(W,Z), S1 = #sum { Dn,A,B,X,Y : reached(pipe(A,B), broken(X,Y)), dem(A,B,Dn) }, S2 = #sum { Dm,C,D,W,Z : reached(pipe(C,D), broken(W,Z)), dem(C,D,Dm) }, S1 - S2 = 0. % %Then the lower are... lower_lexico(pipe(X,Y), pipe(W,Z)) :- pipe(X,Y), pipe(W,Z), lower(pipe(X,Y), pipe(W,Z)), not lower(pipe(W,Z), pipe(X,Y)). lower_lexico(pipe(X,Y), pipe(X,Y)) :- pipe(X,Y), lower(pipe(X,Y), pipe(X,Y)). lower_lexico(pipe(X,Y), pipe(W,Z)) :- pipe(X,Y), pipe(W,Z), % with the same delivered demand lower(pipe(X,Y), pipe(W,Z)), lower(pipe(W,Z),pipe(X,Y)), less_ico(pipe(X,Y), pipe(W,Z)). % %And the worst isolation case is the one for which all lower_lexico are true %worst(pipe(X,Y)) :- pipe(X,Y), lower_lexico(pipe(X,Y),pipe(W,Z)) : pipe(W,Z). worst(pipe(X,Y)) :- pipe(X,Y), C = #count { W,Z : pipe(W,Z) }, D = #count{ X,Y,W,Z : lower_lexico(pipe(X,Y),pipe(W,Z)) , pipe(W,Z)}, C = D. worst_deliv_dem(pipe(A,B), D) :- dem(A,B,D), pipe(X,Y), reached(pipe(A,B), broken(X,Y)), worst(pipe(X,Y)). % %Worst isolation case' delivered demand maximization :~ pipe(A,B), not worst_deliv_dem(pipe(A,B),D). [D] %#maximize [ worst_deliv_dem(pipe(A,B), D)=D : pipe(A,B) ]. %#hide. %#show valve/2. %#show worst_deliv_dem/2.