Documente Academic
Documente Profesional
Documente Cultură
Gecode
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 16
Overview
Program model as script
declare variables
post constraints (creates propagators)
define branching
Solve script
basic search strategy
Gist: interactive visual search
Program Model as Script
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 18
Script: Overview
Script is class inheriting from class Space
members store variables regarded as solution
Script constructor
initialize variables
post propagators for constraints
define branching
Copy constructor and copy function
copy a Script object during search
Exploration takes Script object as input
returns object representing solution
Main function
invokes search engine
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 19
Script for SMM: Structure
#include <gecode/int.hh>
#include <gecode/search.hh>
using namespace Gecode;
class SendMoreMoney : public Space {
protected:
IntVarArray l; // Digits for the letters
public:
// Constructor for script
SendMoreMoneyvod
// Constructor for cloning
SendMoreMoney(bool share, SendMoreMoney s
// Perform copying during cloning
virtual Space* copy(bool share
// Print solution
vod prntvod
};
constructor: initialize
variables, post
constraints, define
branching
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 22
Script for SMM: Structure
#include <gecode/int.hh>
#include <gecode/search.hh>
using namespace Gecode;
class SendMoreMoney : public Space {
protected:
IntVarArray l; // Digits for the letters
public:
// Constructor for script
SendMoreMoneyvod
// Constructor for cloning
SendMoreMoney(bool share, SendMoreMoney s
// Perform copying during cloning
virtual Space* copy(bool share
// Print solution
vod prntvod
};
// Post branchings
}
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 24
Script for SMM: Constructor
SendMoreMoney(void) : l(*this, 8, 0, 9) {
IntVar s(l[0]), e(l[1]), n(l[2]), d(l[3]),
m(l[4]), o(l[5]), r(l[6]), y(l[7]);
// Post constraints
// Post branchings
}
variables
created in this
script (space)
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 25
Script for SMM: Constructor
SendMoreMoney(void) : l(*this, 8, 0, 9) {
IntVar s(l[0]), e(l[1]), n(l[2]), d(l[3]),
m(l[4]), o(l[5]), r(l[6]), y(l[7]);
// Post constraints
// Post branchings
}
8 variables
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 26
Script for SMM: Constructor
SendMoreMoney(void) : l(*this, 8, 0, 9) {
IntVar s(l[0]), e(l[1]), n(l[2]), d(l[3]),
m(l[4]), o(l[5]), r(l[6]), y(l[7]);
// Post constraints
// Post branchings
}
take values
between 0 and 9
(digits)
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 27
Script for SMM: Constructor
SendMoreMoney(void) : l(*this, 8, 0, 9) {
IntVar s(l[0]), e(l[1]), n(l[2]), d(l[3]),
m(l[4]), o(l[5]), r(l[6]), y(l[7]);
// Post constraints
// Post branchings
}
refer to variables
by their letters
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 28
Script for SMM: Constructor
SendMoreMoney(void) : l(*this, 8, 0, 9) {
IntVar s(l[0]), e(l[1]), n(l[2]), d(l[3]),
m(l[4]), o(l[5]), r(l[6]), y(l[7]);
// No leading zeros (IRT: integer relation type)
rel(*this, s, IRT_NQ, 0);
rel(*this, m, IRT_NQ, 0);
// All letters must take distinct digits
distinct(*this, l);
// The linear equation must hold
}
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 29
Posting Constraints
Defined in namespace Gecode
Check documentation for available
constraints
Take script reference as first argument
where is the propagator for the constraint to be posted!
script is a subclass of Space (computation space)
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 30
Linear Equations and Linear Constraints
Equations of the form
c
1
x
1
+ . + c
n
x
n
= d
integer constants: c
i
and d
integer variables: x
i
In Gecode specified by arrays
integers (IntArgs) c
i
variables (IntVarArray, IntVarArgs) x
i
Not only equations
IRT_EQ, IRT_NQ, IRT_LE, IRT_GR, IRT_LQ, IRT_GQ
equality, disequality, inequality (less, greater, less or equal, greater or
equal)
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 31
Script for SMM: Constructor
SendMoreMoney(void) : l(*this, 8, 0, 9) {
}
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 32
Linear Expressions
Other options for posting linear constraints
are available: minimodeling support
linear expressions
Boolean expressions
matrix classes
.
See the examples that come with Gecode
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 33
Script for SMM: Constructor
#include <gecode/minimodel.hh>
SendMoreMoney(void) : l(*this, 8, 0, 9) {
}
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 34
Script for SMM: Constructor
SendMoreMoney(void) : l(*this, 8, 0, 9) {
// Print solution
void print(void) {
std::cout << l << std::endl;
}
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 42
Summary: Script
Variables
declare as members
initialize in constructor
update in copy constructor
Posting constraints
Create branching
Provide copy constructor and copy function
Solving Scripts
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 44
Available Search Engines
Returning solutions one by one for script
DFS depth-first search
BAB branch-and-bound
Restart, LDS
Interactive, visual search
Gist
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 45
Main Method: First Solution
}
Argument b refers to so far best solution
only take values from b
never mix variables!
Invoked on object to be constrained
3445647638 9:334;6<43=)!.&($%('#)>1.?@%0=)9!A=)BAC 8J
F&20&)L"&)>HHWW
H"4.&3%)H,"')$,#2.43"#E$,#2.)963$(i)\=K)>
$,#2.)9(#':,2.:,#(;i)=)e)
2.3."$\$32.*$,#2.)9(#':,2.:,#(;i1E\=K8
?#.@34 (E%OQPKF)#E%ORPKF)5E%OTPKF),E%OUPKF);E%OLPK8
?#.@34 =\(E=/%OQPKF)=\#E=/%ORPKF)=\5E=/%OTPKF)
=\,E=/%OUPKF)=\;E=/%OLPK8
"#. 5,#(;)e)EQMMMMI=\5/H3%EKcQMMMI=\,/H3%EKcQMMI=\#/H3%EKc
QMI=\(/H3%EKc=\;/H3%EKK8
6,2.EI.0"2F)QMMMMI5cQMMMI,cQMMI#cQMI(c; 1)5,#(;K8
J
value of any next solution
value of current best solution b
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 59
Main Method: All Solutions
}
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 72
Script: Constraints
Queens(void) : q(*this,8,0,7) {
distinct(*this, q);
for (int i=0; i<8; i++)
for (int j=i+1; j<8; j++) {
post(*this, x[i]-i != x[j]-j);
post(*this, x[i]-j != x[j]-i);
}
}
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 73
Script: Branching
Queens(void) : q(*this,8,0,7) {
branch(*this, q,
INT_VAR_NONE,
INT_VAL_MIN);
}
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 74
Good Branching?
Nave is not a good strategy for branching
Try the following (see assignment)
first fail
place queen as much in the middle of a row
place queen in knight move fashion
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 75
Summary 8 Queens
Variables
model should require few variables
good: already impose constraints
Constraints
do not post same constraint twice
try to find "big constraints subsuming many small
constraints
more efficient
often, more propagation (to be discussed)
Grocery
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 77
Grocery
Kid goes to store and buys four items
Cashier: that makes $7.11
Kid: pays, about to leave store
Cashier: hold on, I multiplied!
let me add!
wow, sum is also $7.11
You: prices of the four items?
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 78
Model
Variables
for each item A, B, C, D
take values between {0, ., 711}
compute with cents: allows integers
Constraints
A + B + C + D = 711
A * B * C * D = 711 * 100 * 100 * 100
The unique solution (upon the symmetry breaking of slide 87) is:
A=120, B=125, C=150, D=316.
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 79
Script
class Grocery : public Space {
protected:
IntVarArray abcd;
const int s = 711;
const int p = s * 100 * 100 * 100;
public:
6roceryvod
}
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 80
Script: Variables
Grocery(void) : abcd(*this,4,0,711) {
}
2010-03-25 ID2204-L02, Christian Schulte, ICT, KTH 81
Script: Sum