57 Play(
void) : h(0),
a(0), g(0) {}
77 int gn(
int h,
int a)
const {
78 return teams*(h-1) +
a;
82 return plays[
p*weeks() + w];
110 RRS(
int t) : teams(
t), plays(new
Play[periods()*weeks()]) {
117 for (
int p=1;
p<periods();
p++) {
118 play(
p,0).h = (
p + 1) + 1;
119 play(
p,0).a = teams - (
p + 1 - 2);
120 play(
p,0).g = gn(play(
p,0).h,play(
p,0).
a);
124 for (
int w=1; w<weeks(); w++) {
125 for (
int p=0;
p<periods();
p++) {
126 if (play(
p,w-1).h == teams)
128 else if (play(
p,w-1).h == 1)
131 play(
p,w).h = play(
p,w-1).h + 1;
132 if (play(
p,w-1).
a == teams)
135 play(
p,w).a = play(
p,w-1).a + 1;
138 if (play(
p,w).h > play(
p,w).
a)
139 std::swap(play(
p,w).h,play(
p,w).
a);
141 play(
p,w).g = gn(play(
p,w).h,play(
p,w).
a);
148 for (
int p=0;
p<periods();
p++) {
195 return home[
p*teams + w];
199 return home[
p*teams + w];
203 return away[
p*teams + w];
207 return away[
p*teams + w];
211 return game[
p*weeks() + w];
215 return game[
p*weeks() + w];
222 home(*this, periods() * teams, 1, weeks()),
223 away(*this, periods() * teams, 2, weeks()+1),
224 game(*this, weeks()*periods(), 2, teams*weeks())
230 for (
int w=0; w<weeks(); w++) {
231 IntArgs rh(periods()),
ra(periods()), rg(periods());
238 for (
int p=0;
p<periods();
p++) {
246 for (
int p=0;
p<periods();
p++)
247 for (
int w=0; w<teams; w++)
253 for (
int p=0;
p<periods();
p++)
263 for (
int w=0; w<teams; w++) {
265 for (
int p=0;
p<periods();
p++) {
266 c[2*
p] = h(
p,w);
c[2*
p+1] =
a(
p,w);
272 for (
int p=0;
p<periods();
p++) {
274 for (
int t=0;
t<teams;
t++) {
279 for (
int i=1;
i<=teams;
i++)
285 for (
int p=0;
p<periods();
p++)
286 for (
int w=0; w<weeks(); w ++)
287 rel(*
this, teams * h(
p,w) +
a(
p,w) - g(
p,w) == teams);
295 :
Script(share, s), teams(s.teams) {
306 virtual void print(std::ostream& os)
const {
309 for (
int p=0;
p<periods();
p++) {
316 for (
int w=0; w<weeks(); w++) {
320 for (
int p=0;
p<periods();
p++) {
322 os << h(
p,w).val() <<
'-';
324 os <<
a(
p,w).val() <<
" ";
341 if (
opt.size() < 5) {
342 std::cerr<<
"No Solution for less than 5 teams!" << std::endl;
345 if (
opt.size() % 2 != 0) {
346 std::cerr <<
"Number of teams has to be even!" << std::endl;
349 Script::run<SportsLeague, DFS,SizeOptions>(
opt);
const int teams
Number of teams.
Options for scripts with additional size parameter
int periods(void) const
Return number of periods.
IntVarBranch INT_VAR_NONE(void)
Select first unassigned variable.
Play * plays
Play information.
IntVarArray away
away teams
const IntVar & g(int p, int w) const
Return game number for game in period p and week w.
const IntVar & a(int p, int w) const
Away team in period p and week w.
IntVar & a(int p, int w)
Away team in period p and week w.
int main(int argc, char *argv[])
Main-function.
virtual Space * copy(bool share)
Copy during cloning.
RRS(int t)
Build a feasible schedule.
virtual void print(std::ostream &os) const
Print solution.
Parametric base-class for scripts.
IntVar & g(int p, int w)
Return game number for game in period p and week w.
void update(Space &, bool share, VarArray< Var > &a)
Update array to be a clone of array a.
Gecode::FloatVal c(-8, 8)
int p
Number of positive literals for node type.
Gecode::IntArgs i(4, 1, 2, 3, 4)
Entry in round robin schedule.
const IntVar & h(int p, int w) const
Home team in period p and week w.
int n
Number of negative literals for node type.
unsigned int size(I &i)
Size of all ranges of range iterator i.
SportsLeague(bool share, SportsLeague &s)
Constructor for cloning s.
SportsLeague(const SizeOptions &opt)
Setup model.
Example: Sports league scheduling
void element(Home home, IntSharedArray c, IntVar x0, IntVar x1, IntConLevel)
Post domain consistent propagator for .
~RRS(void)
Delete schedule.
Passing integer variables.
Passing integer arguments.
struct Gecode::@511::NNF::@54::@56 a
For atomic nodes.
void parse(int &argc, char *argv[])
Parse options from arguments argv (number is argc)
void values(Home home, const IntVarArgs &x, IntSet y, IntConLevel icl=ICL_DEF)
Post constraint .
int g
game number Default constructor
void count(Home home, const IntVarArgs &x, int n, IntRelType irt, int m, IntConLevel)
Post propagator for .
int periods(void) const
Return number of periods.
void rel(Home home, FloatVar x0, FloatRelType frt, FloatVal n)
Propagates .
Play & play(int p, int w)
Play for period p and week w.
void distinct(Home home, const IntVarArgs &x, IntConLevel icl)
Post propagator for for all .
void hag(int w, IntArgs &h, IntArgs &a, IntArgs &g)
Home, away, and game information.
int gn(int h, int a) const
Game number for game between home team h and away team a.
const int teams
number of teams
IntValBranch INT_VAL_SPLIT_MIN(void)
Select values not greater than mean of smallest and largest value.
Gecode toplevel namespace
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.
IntVarArray game
game numbers
int weeks(void) const
Return number of weeks.
void icl(IntConLevel i)
Set default integer consistency level.
Domain propagation or consistency.
int weeks(void) const
Return number of weeks.
IntVarArray home
home teams
IntVar & h(int p, int w)
Home team in period p and week w.