1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.sat4j;
29
30 import java.io.PrintWriter;
31
32 import org.sat4j.specs.ContradictionException;
33 import org.sat4j.specs.IOptimizationProblem;
34 import org.sat4j.specs.IProblem;
35 import org.sat4j.specs.TimeoutException;
36
37
38
39
40
41
42
43
44
45 public abstract class AbstractOptimizationLauncher extends AbstractLauncher {
46
47
48
49
50 private static final long serialVersionUID = 1L;
51
52 private static final String CURRENT_OPTIMUM_VALUE_PREFIX = "o ";
53
54 @Override
55 protected void displayResult() {
56 displayAnswer();
57
58 log("Total wall clock time (in seconds): "
59 + (System.currentTimeMillis() - getBeginTime()) / 1000.0);
60 }
61
62 protected void displayAnswer() {
63 if (solver == null)
64 return;
65 System.out.flush();
66 PrintWriter out = getLogWriter();
67 out.flush();
68 solver.printStat(out, COMMENT_PREFIX);
69 solver.printInfos(out, COMMENT_PREFIX);
70 ExitCode exitCode = getExitCode();
71 out.println(ANSWER_PREFIX + exitCode);
72 if (exitCode == ExitCode.SATISFIABLE
73 || exitCode == ExitCode.OPTIMUM_FOUND) {
74 out.print(SOLUTION_PREFIX);
75 getReader().decode(solver.model(), out);
76 out.println();
77 IOptimizationProblem optproblem = (IOptimizationProblem) solver;
78 if (!optproblem.hasNoObjectiveFunction()) {
79 log("objective function=" + optproblem.getObjectiveValue());
80 }
81 }
82 }
83
84 @Override
85 protected void solve(IProblem problem) throws TimeoutException {
86 boolean isSatisfiable = false;
87
88 IOptimizationProblem optproblem = (IOptimizationProblem) problem;
89
90 try {
91 while (optproblem.admitABetterSolution()) {
92 if (!isSatisfiable) {
93 if (optproblem.nonOptimalMeansSatisfiable()) {
94 setExitCode(ExitCode.SATISFIABLE);
95 if (optproblem.hasNoObjectiveFunction()) {
96 return;
97 }
98 log("SATISFIABLE");
99 }
100 isSatisfiable = true;
101 log("OPTIMIZING...");
102 }
103 log("Got one! Elapsed wall clock time (in seconds):"
104 + (System.currentTimeMillis() - getBeginTime())
105 / 1000.0);
106 getLogWriter().println(
107 CURRENT_OPTIMUM_VALUE_PREFIX
108 + optproblem.getObjectiveValue());
109 optproblem.discardCurrentSolution();
110 }
111 if (isSatisfiable) {
112 setExitCode(ExitCode.OPTIMUM_FOUND);
113 } else {
114 setExitCode(ExitCode.UNSATISFIABLE);
115 }
116 } catch (ContradictionException ex) {
117 assert isSatisfiable;
118 setExitCode(ExitCode.OPTIMUM_FOUND);
119 }
120 }
121
122 }