:- lib(ic). :- lib(branch_and_bound). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% problem :- HardwareArea is 1024, % hardware area CiInst = [3, 5, 6, 2, 2, 1], % number of instances CiFreq = [ [1, 2, 1], % 4 [4, 3, 5, 2, 3], % 17 [1, 4, 2, 1, 3, 5], % 16 [3, 4], % 7 [3, 4], % 7 [1] % 1 ], % the frequency of each instance in part CiGain = [6, 4, 3, 7, 11, 9], % performance CiArea = [35, 40, 37, 29, 43, 49], % area CiProb = [0.06, 0.01, 0.05, 0.03, 0.04, 0.07], % probability % boolean variables build_bool_vars(CiInst, X, Y), % hardware area constraint (foreach(Yi, Y), foreach(Area, CiArea), foreach(Prod, ProdList) do Prod $= Yi * Area), sum(ProdList) $=< HardwareArea, % optimization goal Obj $= 1 - reliability_csp(CiProb, CiFreq, X), % probabiliy of failure writeln("#######################################"), writeln("#######################################"), bb_min(pb_search(X, Y, Obj), Obj, bb_options{strategy : restart}), % print result write("X:"), writeln(X), write("Y:"), writeln(Y). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :- mode reliability_csp(+, +, +, -). reliability_csp(CiProb, CiFreq, X, Rel) :- (foreach(Pi, CiProb), foreach(FreqList, CiFreq), foreach(XList, X), foreach(Prod, ProdList) do (foreach(Freq, FreqList), foreach(BoolVar, XList), foreach(El, List) do El $= BoolVar * Freq), FF $= sum(List), Prod $= (1 - Pi) ^ FF, write("FF: "), writeln(FF), write("PP: "), writeln(Prod), writeln("------------------") ), write("ProdList: "), writeln(ProdList), Rel $= prod(ProdList), write("Rel: "), writeln(Rel). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :- mode prod(+, -). prod(L, P) :- prod(L, 1, P). :- mode prod(+, +, -). prod([H | T], S, P) :- S1 $= H * S, prod(T, S1, P). prod([], P, P). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% build_bool_vars(CiInst, X, Y) :- (foreach(Ci, CiInst), foreach(Xi, X), foreach(Yi, Y) do length(Xi, Ci), Xi #:: [0 .. 1], Yi #= (sum(Xi) > 0)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% pb_search(X, Y, Obj) :- (foreach(Xi, X) do search(Xi, 0, first_fail, indomain, complete, [])), write("!! X: "), writeln(X), write("!! Y: "), writeln(Y), write("!! Obj: "), writeln(Obj).