86 unsigned int _norders;
96 virtual void help(
void);
98 bool parse(
int& argc,
char* argv[]);
101 unsigned int size(
void)
const {
return _size; }
109 int*
loss(
void)
const {
return _loss; }
126 bool operator() (
int i,
int j) {
197 capacities(
opt.capacities()), ncapacities(
opt.ncapacities()),
198 maxcapacity(
opt.maxcapacity()), loss(
opt.loss()),
199 ncolors(
opt.ncolors()), orders(
opt.orders()),
202 slab(*this, norders, 0,nslabs-1),
203 slabload(*this, nslabs, 0,45),
204 slabcost(*this, nslabs, 0, Int::Limits::
max),
205 total_cost(*this, 0, Int::Limits::
max)
209 for (
unsigned int i = 0;
i < norders; ++
i) {
211 for (
int j = nslabs; j--; ) {
212 boolslab[j +
i*nslabs] = tmp[j] =
BoolVar(*
this, 0, 1);
218 for (
unsigned int s = 0; s < nslabs; ++s) {
221 for (
int i = norders;
i--; ) {
223 x[
i] = boolslab[s +
i*nslabs];
229 for (
unsigned int i = norders;
i-- ; )
236 for (
int c = ncolors;
c--; ) {
238 for (
int o = norders; o--; ) {
243 for (
unsigned int s = 0; s < nslabs; ++s) {
245 for (
int c = ncolors;
c--; ) {
249 for (
int o = norders; o--; ) {
251 hasc[
pos++] = boolslab[s + o*nslabs];
253 assert(
pos == nofcolor[
c]);
265 for (
int s = nslabs; s--; ) {
266 element(*
this,
l, slabload[s], slabcost[s]);
271 if (
opt.symmetry() == SYMMETRY_BRANCHING) {
274 }
else if (
opt.symmetry() == SYMMETRY_NONE) {
287 for (
unsigned int i = 0 ;
i < norders ;
i++)
291 for (
unsigned int i = 0 ;
i < norders ;
i++) {
292 sorted_orders[
i] = slab[indices[
i]];
301 os <<
"What slab=" << slab << std::endl;
302 os <<
"Slab load=" << slabload << std::endl;
303 os <<
"Slab cost=" << slabcost << std::endl;
304 os <<
"Total cost=" << total_cost << std::endl;
307 bool unassigned =
false;
308 for (
int i = nslabs;
i--; ) {
313 if (slabload[
i].
min()>0) ++nslabsused;
314 if (slabcost[
i].
min()>0) ++nslabscost;
317 os <<
"Number of slabs used=" << nslabsused
318 <<
", slabs with cost=" << nslabscost
326 capacities(s.capacities), ncapacities(s.ncapacities),
327 maxcapacity(s.maxcapacity), loss(s.loss),
328 ncolors(s.ncolors), orders(s.orders),
329 norders(s.norders), nslabs(s.nslabs) {
371 virtual size_t size(
void)
const {
377 e << alternatives() <<
pos << val;
392 const SteelMill& sm = static_cast<const SteelMill&>(home);
393 for (
unsigned int i = start;
i < sm.
norders; ++
i)
403 SteelMill& sm = static_cast<SteelMill&>(home);
408 unsigned int pos = start;
409 for (
unsigned int i = start;
i<sm.
norders; ++
i) {
422 unsigned int val = sm.
slab[
pos].min();
424 unsigned int firstzero = 0;
429 return new Choice(*
this, (val<firstzero) ? 2 : 1,
pos, val);
432 unsigned int alt;
int pos, val;
433 e >> alt >>
pos >> val;
439 SteelMill& sm = static_cast<SteelMill&>(home);
440 const Choice&
c = static_cast<const Choice&>(
_c);
451 std::ostream& o)
const {
452 const Choice&
c = static_cast<const Choice&>(
_c);
453 o <<
"slab[" <<
c.pos <<
"] " 454 << ((
a == 0) ?
"=" :
"!=")
467 return sizeof(*this);
485 Script::run<SteelMill,BAB,SteelMillOptions>(
opt);
493 std::cerr <<
"\t(string), optional" << std::endl
494 <<
"\t\tBenchmark to load." << std::endl
495 <<
"\t\tIf none is given, the standard CSPLib instance is used." 497 std::cerr <<
"\t(unsigned int), optional" << std::endl
498 <<
"\t\tNumber of orders to use, in the interval [0..norders]." 500 <<
"\t\tIf none is given, all orders are used." << std::endl;
508 std::cerr <<
"Too many arguments given, max two allowed (given={";
509 for (
int i = 1;
i < argc; ++
i) {
510 std::cerr <<
"\"" << argv[
i] <<
"\"";
511 if (
i < argc-1) std::cerr <<
",";
513 std::cerr <<
"})." << std::endl;
519 for (
int i = strlen(argv[argc-1]);
i-- && issize; )
520 issize &= (isdigit(argv[argc-1][
i]) != 0);
522 _size = atoi(argv[argc-1]);
524 std::ifstream instance(argv[argc-1]);
525 if (instance.fail()) {
526 std::cerr <<
"Argument \"" << argv[argc-1]
527 <<
"\" is neither an integer nor a readable file" 532 instance >> _ncapacities;
533 _capacities =
new int[_ncapacities];
535 for (
int i = 0;
i < _ncapacities; ++
i) {
536 instance >> _capacities[
i];
537 _maxcapacity =
std::max(_maxcapacity, _capacities[
i]);
539 instance >> _ncolors >> _norders;
540 _orders =
new int[_norders][2];
541 for (
unsigned int i = 0;
i < _norders; ++
i) {
550 _loss =
new int[_maxcapacity+1];
553 for (
int c = 1;
c < _maxcapacity; ++
c) {
554 if (
c > _capacities[currcap]) ++currcap;
555 _loss[
c] = _capacities[currcap] -
c;
563 if (_size == 0 || _size > _norders) {
564 std::cerr <<
"Size must be between 1 and " << _norders << std::endl;
int ncapacities
Number of capacities.
SteelMillBranch(Home home)
Construct brancher.
ModEvent nq(Space &home, int n)
Restrict domain values to be different from n.
static IntArgs create(int n, int start, int inc=1)
Allocate array with n elements such that for all .
IntVarArray slab
Slab assigned to order i.
int val
Value of variable.
order_t orders
The orders.
unsigned int csplib_maxcapacity
Maximum capacity.
int * loss
Loss for all sizes.
void linear(Home home, const FloatVarArgs &x, FloatRelType frt, FloatNum c)
Post propagator for .
int * capacities
Capacities.
void post(Home home, Term *t, int n, FloatRelType frt, FloatVal c)
Post propagator for linear constraint over floats.
void channel(Home home, FloatVar x0, IntVar x1)
Post propagator for channeling a float and an integer variable .
int size(void) const
Return size of array (number of elements)
const FloatNum max
Largest allowed float value.
void update(Space &home, bool share, VarImpVar< VarImp > &y)
Update this variable to be a clone of variable y.
virtual bool status(const Space &home) const
Check status of brancher, return true if alternatives left.
ModEvent eq(Space &home, int n)
Restrict domain values to be equal to n.
unsigned int norders
Number of orders.
order_t orders(void) const
Return orders.
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
int ncolors
Number of colors.
int ncapacities(void) const
Return number of capacities.
bool assigned(void) const
Test if all variables are assigned.
bool pos(const View &x)
Test whether x is postive.
virtual void help(void)
Print help text.
int maxcapacity
Maximum capacity.
struct Gecode::@511::NNF::@54::@55 b
For binary nodes (and, or, eqv)
Collection of symmetries.
IntVarBranch INT_VAR_SIZE_MIN(BranchTbl tbl)
Select variable with smallest domain size.
SortByWeight(order_t _orders)
Initialize orders.
int start
Cache of first unassigned value.
Multi _c(Gecode::IntArgs(3, 1, 2, 3))
virtual Actor * copy(Space &home, bool share)
Copy brancher.
const int order_weight
Weight-position in order-array elements.
unsigned int csplib_norders
Number of orders.
IntVarArray slabcost
Cost of slab j.
virtual Space * copy(bool share)
Copy during cloning.
Parametric base-class for scripts.
Base-class for both propagators and branchers.
SteelMillOptions(const char *n)
Initialize options for example with name n.
virtual void print(std::ostream &os) const
Print solution.
void update(Space &, bool share, VarArray< Var > &a)
Update array to be a clone of array a.
virtual IntVar cost(void) const
Return solution cost.
Gecode::FloatVal c(-8, 8)
Gecode::IntArgs i(4, 1, 2, 3, 4)
Base-class for branchers.
int maxcapacity(void) const
Return maximum of capacities.
void quicksort(Type *l, Type *r, Less &less)
Standard quick sort.
int n
Number of negative literals for node type.
Execution has resulted in failure.
static BrancherHandle post(Home home)
Post brancher.
SteelMillBranch(Space &home, bool share, SteelMillBranch &b)
Copy constructor.
int csplib_orders[][2]
Orders.
virtual void archive(Archive &e) const
Archive into e.
virtual ExecStatus commit(Space &home, const Gecode::Choice &_c, unsigned int a)
Perform commit for choice _c and alternative a.
int norders(void) const
Return number of orders.
IntValBranch INT_VAL_MIN(void)
Select smallest value.
unsigned int size(I &i)
Size of all ranges of range iterator i.
GECODE_FLATZINC_EXPORT FlatZincSpace * parse(const std::string &fileName, Printer &p, std::ostream &err=std::cerr, FlatZincSpace *fzs=NULL)
Parse FlatZinc file fileName into fzs and return it.
SymmetryHandle ValueSymmetry(const IntArgs &vs)
Values in v are interchangeable.
IntVar total_cost
Total cost.
int * loss(void) const
Return loss values.
virtual Choice * choice(const Space &, Archive &e)
Return choice from e.
int pos
Position of variable.
int csplib_capacities[]
Constants for CSPLib instance of the Steel Mill Slab Design Problem.
const int order_color
Color-position in order-array elements.
virtual Gecode::Choice * choice(Space &home)
Return choice.
int(* order_t)[2]
Order-specifications.
void element(Home home, IntSharedArray c, IntVar x0, IntVar x1, IntConLevel)
Post domain consistent propagator for .
unsigned int nslabs
Number of slabs.
Passing integer variables.
Passing integer arguments.
Passing Boolean variables.
int csplib_loss[]
Loss for all sizes.
struct Gecode::@511::NNF::@54::@56 a
For atomic nodes.
Boolean integer variables.
Choice(const Brancher &b, unsigned int a, int pos0, int val0)
void parse(int &argc, char *argv[])
Parse options from arguments argv (number is argc)
SteelMill(bool share, SteelMill &s)
Constructor for cloning s.
bool parse(int &argc, char *argv[])
Parse options from arguments argv (number is argc)
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
Integer view for integer variables.
SteelMill(const SteelMillOptions &opt)
Actual model.
Node * x
Pointer to corresponding Boolean expression node.
virtual void archive(Archive &e) const
Archive into e.
Choice for performing commit
virtual size_t size(void) const
Report size occupied.
virtual size_t dispose(Space &)
Delete brancher and return its size.
SteelMillOptions for examples with size option and an additional optional file name parameter.
bool assigned(View x, int v)
Whether x is assigned to value v.
void symmetry(int v)
Set default symmetry value.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVal n)
Propagates .
unsigned int size(void) const
Return size.
void solutions(unsigned int n)
Set default number of solutions to search for.
int ncolors(void) const
Return number of colors.
int * capacities(void) const
Return capacities.
Breaking symmetries with symmetry.
Gecode toplevel namespace
IntVarBranch INT_VAR_MAX_MIN(BranchTbl tbl)
Select variable with smallest max.
BrancherHandle 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.
Use LDSB for symmetry breaking.
Home class for posting propagators
unsigned int csplib_ncolors
Number of colors.
IntVarArray slabload
Load of slab j.
unsigned int csplib_ncapacities
Number of capacities.
Example: Steel-mill slab design problem
int main(int argc, char *argv[])
Main-function.
bool me_failed(ModEvent me)
Check whether modification event me is failed.
virtual void print(const Space &, const Gecode::Choice &_c, unsigned int a, std::ostream &o) const
Print explanation.
Custom brancher for steel mill slab design.
virtual void help(void)
Print help text.