1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
/* TABLIX, PGA general timetable solver */
/* Copyright (C) 2002 Tomaz Solc */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 2 of the License, or */
/* (at your option) any later version. */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* You should have received a copy of the GNU General Public License */
/* along with this program; if not, write to the Free Software */
/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/* $Id: timeplace.c,v 1.8 2006-08-29 14:32:24 avian Exp $ */
/** @module
*
* @author Tomaz Solc
* @author-email tomaz.solc@tablix.org
*
* @brief Adds a weight whenever two events are scheduled in the same room at
* the same time.
*
* @ingroup School scheduling, Multiweek scheduling
*/
#include <stdlib.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "module.h"
int module_fitness(chromo **c, ext **e, slist **s)
{
int a,b,m;
int n;
int sum;
slist *list;
chromo *time, *room;
list=s[0];
room=c[0];
time=c[1];
sum=0;
for(m=0;m<time->gennum;m++) {
a=time->gen[m];
for(n=0;n<list->tuplenum[a];n++) if(list->tupleid[a][n]<m) {
b=list->tupleid[a][n];
if (room->gen[m]==room->gen[b]) {
sum++;
}
}
}
return(sum);
}
int module_precalc(moduleoption *opt)
{
resourcetype *time, *room;
time=restype_find("time");
room=restype_find("room");
if(dat_tuplenum>(time->resnum*room->resnum)) {
error(_("Too many events for the defined number of time slots and rooms"));
return -1;
}
return 0;
}
int module_init(moduleoption *opt)
{
fitnessfunc *fitness;
precalc_new(module_precalc);
fitness=fitness_new("time-place",
option_int(opt, "weight"),
option_int(opt, "mandatory"),
module_fitness);
if(fitness==NULL) return -1;
if(fitness_request_chromo(fitness, "room")) return -1;
if(fitness_request_chromo(fitness, "time")) return -1;
if(fitness_request_slist(fitness, "time")) return -1;
return(0);
}
|