40 #if defined(GECODE_HAS_QT) && defined(GECODE_HAS_GIST)
42 #if QT_VERSION >= 0x050000
47 using namespace Gecode;
95 for (
int n=
x.size();
n--; ) {
99 start =
x[start].val();
107 unsigned int min =
x[
n].size();
111 if (
x[iv.
val()].size() <
min) {
117 return new Choice(*
this, start,
n);
137 std::ostream& o)
const {
139 o <<
"x[" <<
c.pos <<
"] "
140 << ((
a == 0) ?
"=" :
"!=")
154 return sizeof(*this);
177 int f(
int x,
int y)
const {
190 static const int moves[8][2] = {
191 {-2,-1}, {-2,1}, {-1,-2}, {-1,2}, {1,-2}, {1,2}, {2,-1}, {2,1}
193 int nbs[8];
int n_nbs = 0;
194 for (
int m=0; m<8; m++) {
195 int nx =
x(
i) + moves[m][0], ny =
y(
i) + moves[m][1];
196 if ((nx >= 0) && (nx <
n) && (ny >= 0) && (ny <
n))
197 nbs[n_nbs++] =
f(nx,ny);
204 switch (
opt.branching()) {
208 case BRANCH_WARNSDORFF:
220 int* jump =
new int[
n*
n];
223 for (
int i=0;
i<
n*
n;
i++) {
224 jump[j]=
i; j=succ[j].min();
228 for (
int i = 0;
i <
n;
i++) {
229 for (
int j = 0; j <
n; j++) {
231 os << jump[
f(
i,j)] <<
" ";
233 os << std::endl <<
"\t";
259 for (
int i = nn;
i--; ) {
261 IntVar j(*
this,0,nn-1); jump[
i]=j;
271 for (
int f = 0;
f < nn;
f++) {
275 expr(*
this, (jump[
i.val()]-jump[
f] == 1)),
277 expr(*
this, (jump[
i.val()]-jump[
f] == 1-nn)),
278 expr(*
this, (succ[
f] ==
i.val())));
279 dom(*
this, pred[
f], ds);
280 dom(*
this, succ[
f], ds);
311 for (
int f = 0;
f <
n*
n;
f++)
312 dom(*
this, succ[
f], neighbors(
f));
329 #if defined(GECODE_HAS_QT) && defined(GECODE_HAS_GIST)
334 QGraphicsScene* scene;
338 static const int unit = 30;
341 KnightsInspector(
void) : scene(NULL), mw(NULL) {}
343 virtual void inspect(
const Space& s) {
348 QList <QGraphicsItem*> itemList = scene->items();
349 foreach (QGraphicsItem*
i, scene->items()) {
350 scene->removeItem(
i);
354 for (
int i=0;
i<k.
n;
i++) {
355 for (
int j=0; j<k.
n; j++) {
356 scene->addRect(
i*unit,j*unit,unit,unit);
358 QPen pen(Qt::black, 2);
360 pen.setColor(Qt::red);
361 pen.setStyle(Qt::DotLine);
365 int ky = xv.val() % k.
n;
366 int kx = xv.val() / k.
n;
367 scene->addLine(
i*unit+unit/2,j*unit+unit/2,
368 kx*unit+unit/2,ky*unit+unit/2,
378 void initialize(
void) {
379 mw =
new QMainWindow();
380 scene =
new QGraphicsScene();
381 QGraphicsView* view =
new QGraphicsView(scene);
382 view->setRenderHints(QPainter::Antialiasing);
383 mw->setCentralWidget(view);
384 mw->setAttribute(Qt::WA_QuitOnClose,
false);
385 mw->setAttribute(Qt::WA_DeleteOnClose,
false);
386 QAction* closeWindow =
new QAction(
"Close window", mw);
387 closeWindow->setShortcut(QKeySequence(
"Ctrl+W"));
388 mw->connect(closeWindow, SIGNAL(triggered()),
390 mw->addAction(closeWindow);
394 virtual std::string name(
void) {
return "Board"; }
396 virtual void finalize(
void) {
418 #if defined(GECODE_HAS_QT) && defined(GECODE_HAS_GIST)
426 Script::run<KnightsReified,DFS,SizeOptions>(
opt);
428 Script::run<KnightsCircuit,DFS,SizeOptions>(
opt);
struct Gecode::@602::NNF::@65::@66 b
For binary nodes (and, or, eqv)
int p
Number of positive literals for node type.
BoolVar expr(Home home, const BoolExpr &e, const IntPropLevels &ipls)
Post Boolean expression and return its value.
int n
Number of negative literals for node type.
Node * x
Pointer to corresponding Boolean expression node.
struct Gecode::@602::NNF::@65::@67 a
For atomic nodes.
Base-class for both propagators and branchers.
void parse(int &argc, char *argv[])
Parse options from arguments argv (number is argc)
Base-class for branchers.
Choice for performing commit
virtual void archive(Archive &e) const
Archive into e.
Parametric base-class for scripts.
Abstract base class for inspectors.
Home class for posting propagators
Value iterator for integer sets.
Passing integer variables.
Value iterator for integer variables.
Value iterator for integer views.
int val(void) const
Return current value.
void click(Gist::Inspector *i)
Add inspector that reacts on node double clicks.
void propagation(int v)
Set default propagation value.
void iterations(unsigned int i)
Set default number of iterations.
void branching(int v)
Set default branching value.
class Gecode::Options::_I inspect
Script mode to run.
Options for scripts with additional size parameter
bool assigned(void) const
Test if all variables are assigned.
void update(Space &home, VarArray< Var > &a)
Update array to be a clone of array a.
Example: n-Knights tour (model using circuit)
KnightsCircuit(KnightsCircuit &s)
Constructor for cloning s.
virtual Space * copy(void)
Copy during cloning.
KnightsCircuit(const SizeOptions &opt)
Example: n-Knight's tour (simple model)
KnightsReified(const SizeOptions &opt)
virtual Space * copy(void)
Copy during cloning.
KnightsReified(KnightsReified &s)
Constructor for cloning s.
Base-class for knight's tour example.
int main(int argc, char *argv[])
Main-function.
@ PROP_REIFIED
Use reified constraints.
@ PROP_CIRCUIT
Use single circuit constraints.
const int n
Size of board.
int x(int f) const
Return x coordinate at field f.
virtual void print(std::ostream &os) const
Print board.
IntSet neighbors(int i)
Compute set of neighbour fields.
IntVarArray succ
Maps board field to successor field.
Knights(const SizeOptions &opt)
Constructor.
Knights(Knights &s)
Constructor for cloning s.
int f(int x, int y) const
Return field at position x, y.
@ BRANCH_WARNSDORFF
Use Warnsdorff's rule.
@ BRANCH_NAIVE
Use naive, lexicographical branching.
int y(int f) const
Return y coordinate at field f.
int pos
Position of variable.
Choice(const Brancher &b, int pos0, int val0)
int val
Value of variable.
virtual void archive(Archive &e) const
Archive into e.
Custom brancher for knight's tours using Warnsdorff's rule.
virtual Actor * copy(Space &home)
Copy brancher.
static void post(Home home, const IntVarArgs &x)
Post brancher.
Warnsdorff(Space &home, Warnsdorff &b)
Copy constructor.
ViewArray< Int::IntView > x
Views of the brancher.
virtual size_t dispose(Space &)
Delete brancher and return its size.
virtual ExecStatus commit(Space &home, const Gecode::Choice &_c, unsigned int a)
Perform commit for choice _c and alternative a.
virtual Gecode::Choice * choice(Space &)
Return choice.
virtual Choice * choice(const Space &, Archive &e)
Return choice.
Warnsdorff(Home home, ViewArray< Int::IntView > &xv)
Construct brancher.
int start
Next variable to branch on.
virtual bool status(const Space &) const
Check status of brancher, return true if alternatives left.
virtual void print(const Space &, const Gecode::Choice &_c, unsigned int a, std::ostream &o) const
Print explanation.
@ ES_OK
Execution is okay.
@ ES_FAILED
Execution has resulted in failure.
void channel(Home home, FloatVar x0, IntVar x1)
Post propagator for channeling a float and an integer variable .
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
void circuit(Home home, int offset, const IntVarArgs &x, IntPropLevel ipl)
Post propagator such that x forms a circuit.
void distinct(Home home, const IntVarArgs &x, IntPropLevel ipl)
Post propagator for for all .
Post propagator for SetVar SetOpType SetVar y
bool me_failed(ModEvent me)
Check whether modification event me is failed.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVal n)
Propagates .
IntValBranch INT_VAL_MIN(void)
Select smallest value.
IntVarBranch INT_VAR_NONE(void)
Select first unassigned variable.
bool pos(const View &x)
Test whether x is postive.
const FloatNum min
Smallest allowed float value.
bool assigned(View x, int v)
Whether x is assigned to value v.
unsigned int size(I &i)
Size of all ranges of range iterator i.
Gecode::FloatVal c(-8, 8)
Gecode::IntArgs i({1, 2, 3, 4})
Multi _c(Gecode::IntArgs({1, 2, 3}))