Go to the documentation of this file.
40 #if defined(GECODE_HAS_QT) && defined(GECODE_HAS_GIST)
42 #if QT_VERSION >= 0x050000
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);
virtual Actor * copy(Space &home)
Copy brancher.
virtual void print(const Space &, const Gecode::Choice &_c, unsigned int a, std::ostream &o) const
Print explanation.
Post propagator for SetVar x
Post propagator for SetVar SetOpType SetVar y
Warnsdorff(Space &home, Warnsdorff &b)
Copy constructor.
Warnsdorff(Home home, ViewArray< Int::IntView > &xv)
Construct brancher.
void propagation(int v)
Set default propagation value.
bool me_failed(ModEvent me)
Check whether modification event me is failed.
Knights(const SizeOptions &opt)
Constructor.
IntVarBranch INT_VAR_NONE(void)
Select first unassigned variable.
void click(Gist::Inspector *i)
Add inspector that reacts on node double clicks.
ViewArray< Int::IntView > x
Views of the brancher.
int x(int f) const
Return x coordinate at field f.
virtual size_t dispose(Space &)
Delete brancher and return its size.
virtual Gecode::Choice * choice(Space &)
Return choice.
Passing integer variables.
unsigned int size(I &i)
Size of all ranges of range iterator i.
@ PROP_CIRCUIT
Use single circuit constraints.
Value iterator for integer variables.
bool assigned(View x, int v)
Whether x is assigned to value v.
Value iterator for integer views.
Abstract base class for inspectors.
Multi _c(Gecode::IntArgs({1, 2, 3}))
void branch(Home home, const FloatVarArgs &x, FloatVarBranch vars, FloatValBranch vals, FloatBranchFilter bf, FloatVarValPrint vvp)
Branch over x with variable selection vars and value selection vals.
void iterations(unsigned int i)
Set default number of iterations.
int start
Next variable to branch on.
Base-class for both propagators and branchers.
IntValBranch INT_VAL_MIN(void)
Select smallest value.
KnightsCircuit(KnightsCircuit &s)
Constructor for cloning s.
int val(void) const
Return current value.
static void post(Home home, const IntVarArgs &x)
Post brancher.
virtual void archive(Archive &e) const
Archive into e.
virtual Space * copy(void)
Copy during cloning.
bool assigned(void) const
Test if all variables are assigned.
@ PROP_REIFIED
Use reified constraints.
Gecode toplevel namespace
IntVarArray succ
Maps board field to successor field.
@ BRANCH_WARNSDORFF
Use Warnsdorff's rule.
int f(int x, int y) const
Return field at position x, y.
Base-class for branchers.
BoolVar expr(Home home, const BoolExpr &e, const IntPropLevels &ipls)
Post Boolean expression and return its value.
Home class for posting propagators
Parametric base-class for scripts.
void branching(int v)
Set default branching value.
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
void parse(int &argc, char *argv[])
Parse options from arguments argv (number is argc)
virtual void print(std::ostream &os) const
Print board.
KnightsCircuit(const SizeOptions &opt)
Example: n-Knight's tour (simple model)
void circuit(Home home, int offset, const IntVarArgs &x, IntPropLevel ipl)
Post propagator such that x forms a circuit.
struct Gecode::@602::NNF::@65::@66 b
For binary nodes (and, or, eqv)
virtual ExecStatus commit(Space &home, const Gecode::Choice &_c, unsigned int a)
Perform commit for choice _c and alternative a.
int pos
Position of variable.
struct Gecode::@602::NNF::@65::@67 a
For atomic nodes.
KnightsReified(const SizeOptions &opt)
int val
Value of variable.
IntSet neighbors(int i)
Compute set of neighbour fields.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVal n)
Propagates .
virtual bool status(const Space &) const
Check status of brancher, return true if alternatives left.
void channel(Home home, FloatVar x0, IntVar x1)
Post propagator for channeling a float and an integer variable .
Base-class for knight's tour example.
const int n
Size of board.
Knights(Knights &s)
Constructor for cloning s.
void update(Space &home, VarImpVar< VarImp > &y)
Update this variable to be a clone of variable y.
int main(int argc, char *argv[])
Main-function.
int y(int f) const
Return y coordinate at field f.
void distinct(Home home, const IntVarArgs &x, IntPropLevel ipl)
Post propagator for for all .
Choice(const Brancher &b, int pos0, int val0)
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
Post propagator for f(x \diamond_{\mathit{op}} y) \sim_r z \f$ void rel(Home home
Gecode::FloatVal c(-8, 8)
class Gecode::Options::_I inspect
Script mode to run.
@ BRANCH_NAIVE
Use naive, lexicographical branching.
virtual Space * copy(void)
Copy during cloning.
virtual Choice * choice(const Space &, Archive &e)
Return choice.
int n
Number of negative literals for node type.
Choice for performing commit
@ ES_FAILED
Execution has resulted in failure.
Custom brancher for knight's tours using Warnsdorff's rule.
Value iterator for integer sets.
KnightsReified(KnightsReified &s)
Constructor for cloning s.
Gecode::IntArgs i({1, 2, 3, 4})
bool pos(const View &x)
Test whether x is postive.
Example: n-Knights tour (model using circuit)
@ ES_OK
Execution is okay.
int p
Number of positive literals for node type.
virtual void archive(Archive &e) const
Archive into e.
void update(Space &home, VarArray< Var > &a)
Update array to be a clone of array a.
Options for scripts with additional size parameter