82 unsigned int _norders;
92 virtual void help(
void);
94 bool parse(
int& argc,
char* argv[]);
97 unsigned int size(
void)
const {
return _size; }
105 int*
loss(
void)
const {
return _loss; }
206 for (
unsigned int i = 0; i <
norders; ++i) {
208 for (
int j =
nslabs; j--; ) {
215 for (
unsigned int s = 0; s <
nslabs; ++s) {
226 for (
unsigned int i =
norders; i-- ; )
240 for (
unsigned int s = 0; s <
nslabs; ++s) {
248 hasc[pos++] = boolslab[s + o*
nslabs];
250 assert(pos == nofcolor[c]);
251 hascolor[c] =
BoolVar(*
this, 0, 1);
262 for (
int s =
nslabs; s--; ) {
284 for (
unsigned int i = 0 ; i <
norders ; i++)
288 for (
unsigned int i = 0 ; i <
norders ; i++) {
289 sorted_orders[i] =
slab[indices[i]];
298 os <<
"What slab=" <<
slab << std::endl;
299 os <<
"Slab load=" <<
slabload << std::endl;
300 os <<
"Slab cost=" <<
slabcost << std::endl;
301 os <<
"Total cost=" <<
total_cost << std::endl;
304 bool unassigned =
false;
305 for (
int i =
nslabs; i--; ) {
314 os <<
"Number of slabs used=" << nslabsused
315 <<
", slabs with cost=" << nslabscost
399 unsigned int size = sm.
norders;
401 unsigned int pos =
start;
408 }
else if (sm.
slab[i].
size() < size) {
415 unsigned int val = sm.
slab[pos].min();
417 unsigned int firstzero = 0;
422 return new Choice(*
this, (val<firstzero) ? 2 : 1, pos, val);
425 unsigned int alt;
int pos, val;
426 e >> alt >> pos >> val;
427 return new Choice(*
this, alt, pos, val);
444 std::ostream& o)
const {
446 o <<
"slab[" << c.pos <<
"] "
447 << ((
a == 0) ?
"=" :
"!=")
460 return sizeof(*this);
476 if (!opt.
parse(argc,argv))
486 std::cerr <<
"\t(string), optional" << std::endl
487 <<
"\t\tBenchmark to load." << std::endl
488 <<
"\t\tIf none is given, the standard CSPLib instance is used."
490 std::cerr <<
"\t(unsigned int), optional" << std::endl
491 <<
"\t\tNumber of orders to use, in the interval [0..norders]."
493 <<
"\t\tIf none is given, all orders are used." << std::endl;
498 Options::parse(argc,argv);
501 std::cerr <<
"Too many arguments given, max two allowed (given={";
502 for (
int i = 1; i < argc; ++i) {
503 std::cerr <<
"\"" << argv[i] <<
"\"";
504 if (i < argc-1) std::cerr <<
",";
506 std::cerr <<
"})." << std::endl;
512 for (
int i = strlen(argv[argc-1]); i-- && issize; )
513 issize &= (isdigit(argv[argc-1][i]) != 0);
515 _size = atoi(argv[argc-1]);
517 std::ifstream instance(argv[argc-1]);
518 if (instance.fail()) {
519 std::cerr <<
"Argument \"" << argv[argc-1]
520 <<
"\" is neither an integer nor a readable file"
525 instance >> _ncapacities;
526 _capacities =
new int[_ncapacities];
528 for (
int i = 0; i < _ncapacities; ++i) {
529 instance >> _capacities[i];
530 _maxcapacity = std::max(_maxcapacity, _capacities[i]);
532 instance >> _ncolors >> _norders;
533 _orders =
new int[_norders][2];
534 for (
unsigned int i = 0; i < _norders; ++i) {
543 _loss =
new int[_maxcapacity+1];
546 for (
int c = 1; c < _maxcapacity; ++c) {
547 if (c > _capacities[currcap]) ++currcap;
548 _loss[c] = _capacities[currcap] - c;
556 if (_size == 0 || _size > _norders) {
557 std::cerr <<
"Size must be between 1 and " << _norders << std::endl;
struct Gecode::@603::NNF::@65::@66 b
For binary nodes (and, or, eqv)
int n
Number of negative literals for node type.
struct Gecode::@603::NNF::@65::@67 a
For atomic nodes.
Base-class for both propagators and branchers.
Passing Boolean variables.
Boolean integer variables.
Base-class for branchers.
Choice for performing commit
virtual void archive(Archive &e) const
Archive into e.
unsigned int alternatives(void) const
Return number of alternatives.
Parametric base-class for scripts.
static void run(const Options &opt, Script *s=NULL)
Home class for posting propagators
Passing integer arguments.
static IntArgs create(int n, int start, int inc=1)
Allocate array with n elements such that for all .
Passing integer variables.
Integer view for integer variables.
ModEvent nq(Space &home, int n)
Restrict domain values to be different from n.
ModEvent eq(Space &home, int n)
Restrict domain values to be equal to n.
Collection of symmetries.
bool assigned(void) const
Test if all variables are assigned.
int size(void) const
Return size of array (number of elements)
void update(Space &home, VarArray< Var > &a)
Update array to be a clone of array a.
void update(Space &home, VarImpVar< VarImp > &y)
Update this variable to be a clone of variable y.
SortByWeight(order_t _orders)
Initialize orders.
bool operator()(int i, int j)
Sort order.
order_t orders
The orders.
SteelMillOptions for examples with size option and an additional optional file name parameter.
unsigned int size(void) const
Return size.
int ncapacities(void) const
Return number of capacities.
int maxcapacity(void) const
Return maximum of capacities.
int ncolors(void) const
Return number of colors.
int * capacities(void) const
Return capacities.
order_t orders(void) const
Return orders.
int norders(void) const
Return number of orders.
int * loss(void) const
Return loss values.
virtual void help(void)
Print help text.
SteelMillOptions(const char *n)
Initialize options for example with name n.
bool parse(int &argc, char *argv[])
Parse options from arguments argv (number is argc)
virtual void archive(Archive &e) const
Archive into e.
Choice(const Brancher &b, unsigned int a, int pos0, int val0)
int val
Value of variable.
int pos
Position of variable.
Custom brancher for steel mill slab design.
int start
Cache of first unassigned value.
virtual size_t dispose(Space &)
Delete brancher and return its size.
virtual void print(const Space &, const Gecode::Choice &_c, unsigned int a, std::ostream &o) const
Print explanation.
virtual Actor * copy(Space &home)
Copy brancher.
virtual ExecStatus commit(Space &home, const Gecode::Choice &_c, unsigned int a)
Perform commit for choice _c and alternative a.
SteelMillBranch(Space &home, SteelMillBranch &b)
Copy constructor.
virtual Gecode::Choice * choice(Space &home)
Return choice.
SteelMillBranch(Home home)
Construct brancher.
static void post(Home home)
Post brancher.
virtual bool status(const Space &home) const
Check status of brancher, return true if alternatives left.
virtual Choice * choice(const Space &, Archive &e)
Return choice from e.
Example: Steel-mill slab design problem
int ncapacities
Number of capacities.
SteelMill(const SteelMillOptions &opt)
Actual model.
unsigned int norders
Number of orders.
virtual void print(std::ostream &os) const
Print solution.
virtual IntVar cost(void) const
Return solution cost.
int main(int argc, char *argv[])
Main-function.
IntVarArray slab
Slab assigned to order i.
virtual Space * copy(void)
Copy during cloning.
int maxcapacity
Maximum capacity.
unsigned int nslabs
Number of slabs.
IntVarArray slabcost
Cost of slab j.
IntVar total_cost
Total cost.
@ SYMMETRY_BRANCHING
Breaking symmetries with symmetry.
@ SYMMETRY_LDSB
Use LDSB for symmetry breaking.
@ SYMMETRY_NONE
Simple symmetry.
int * loss
Loss for all sizes.
int ncolors
Number of colors.
IntVarArray slabload
Load of slab j.
int * capacities
Capacities.
SteelMill(SteelMill &s)
Constructor for cloning s.
void parse(int argc, char *argv[])
Parse commandline arguments.
bool me_failed(ModEvent me)
Check whether modification event me is failed.
void branch(Home home, const FloatVarArgs &x, FloatVarBranch vars, FloatValBranch vals, FloatBranchFilter bf=nullptr, FloatVarValPrint vvp=nullptr)
Branch over x with variable selection vars and value selection vals.
void linear(Home home, const FloatVarArgs &x, FloatRelType frt, FloatVal c)
Post propagator for .
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVar x1)
Post propagator for .
@ IRT_LQ
Less or equal ( )
void quicksort(Type *l, Type *r, Less &less)
Standard quick sort.
Gecode toplevel namespace
SymmetryHandle ValueSymmetry(const IntArgs &v)
Values in v are interchangeable.
void channel(Home home, FloatVar x0, IntVar x1)
Post propagator for channeling a float and an integer variable .
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
void element(Home home, IntSharedArray n, IntVar x0, IntVar x1, IntPropLevel ipl=IPL_DEF)
Post domain consistent propagator for .
IntVarBranch INT_VAR_MAX_MIN(BranchTbl tbl=nullptr)
Select variable with smallest max.
IntValBranch INT_VAL_MIN(void)
Select smallest value.
@ ES_OK
Execution is okay.
@ ES_FAILED
Execution has resulted in failure.
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
IntVarBranch INT_VAR_SIZE_MIN(BranchTbl tbl=nullptr)
Select variable with smallest domain size.
Post propagator for SetVar x
unsigned int csplib_maxcapacity
Maximum capacity.
const int order_weight
Weight-position in order-array elements.
int csplib_capacities[]
Constants for CSPLib instance of the Steel Mill Slab Design Problem.
unsigned int csplib_ncolors
Number of colors.
const int order_color
Color-position in order-array elements.
int csplib_orders[][2]
Orders.
unsigned int csplib_norders
Number of orders.
int csplib_loss[]
Loss for all sizes.
int(* order_t)[2]
Order-specifications.
unsigned int csplib_ncapacities
Number of capacities.