Back to index

fet  5.18.0
Public Member Functions | Public Attributes
ConstraintActivityPreferredTimeSlots Class Reference

This is a constraint. More...

#include <timeconstraint.h>

Inheritance diagram for ConstraintActivityPreferredTimeSlots:
Inheritance graph
[legend]
Collaboration diagram for ConstraintActivityPreferredTimeSlots:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 ConstraintActivityPreferredTimeSlots ()
 ConstraintActivityPreferredTimeSlots (double wp, int actId, int nPT_L, QList< int > d_L, QList< int > h_L)
bool computeInternalStructure (QWidget *parent, Rules &r)
 Computes the internal structure for this constraint.
bool hasInactiveActivities (Rules &r)
QString getXmlDescription (Rules &r)
 Returns an XML description of this constraint.
QString getDescription (Rules &r)
 Returns a small description string for this constraint.
QString getDetailedDescription (Rules &r)
 Returns a detailed description string for this constraint.
double fitness (Solution &c, Rules &r, QList< double > &cl, QList< QString > &dl, QString *conflictsString=NULL)
 The function that calculates the fitness of a solution, according to this constraint.
bool isRelatedToActivity (Rules &r, Activity *a)
 Returns true if this constraint is related to this activity.
bool isRelatedToTeacher (Teacher *t)
 Returns true if this constraint is related to this teacher.
bool isRelatedToSubject (Subject *s)
 Returns true if this constraint is related to this subject.
bool isRelatedToActivityTag (ActivityTag *s)
 Returns true if this constraint is related to this activity tag.
bool isRelatedToStudentsSet (Rules &r, StudentsSet *s)
 Returns true if this constraint is related to this students set.
bool hasWrongDayOrHour (Rules &r)
bool canRepairWrongDayOrHour (Rules &r)
bool repairWrongDayOrHour (Rules &r)

Public Attributes

int p_activityId
 Activity id.
int p_nPreferredTimeSlots_L
 The number of preferred times.
QList< int > p_days_L
 The preferred days.
QList< int > p_hours_L
 The preferred hour.
int p_activityIndex
 The index of the activity in the rules (from 0 to rules.nActivities-1) - it is not the id of the activity.
double weightPercentage
 The percentage weight of this constraint, 100% compulsory, 0% non-compulsory.
bool active
QString comments
int type
 Specifies the type of this constraint (using the above constants).

Detailed Description

This is a constraint.

It returns conflicts if the activity is scheduled in another interval than the preferred set of times.

Definition at line 2039 of file timeconstraint.h.


Constructor & Destructor Documentation

ConstraintActivityPreferredTimeSlots::ConstraintActivityPreferredTimeSlots ( double  wp,
int  actId,
int  nPT_L,
QList< int >  d_L,
QList< int >  h_L 
)

Definition at line 9034 of file timeconstraint.cpp.

       : TimeConstraint(wp)
{
       assert(d_L.count()==nPT_L);
       assert(h_L.count()==nPT_L);

       this->p_activityId=actId;
       this->p_nPreferredTimeSlots_L=nPT_L;
       this->p_days_L=d_L;
       this->p_hours_L=h_L;
       this->type=CONSTRAINT_ACTIVITY_PREFERRED_TIME_SLOTS;
}

Member Function Documentation

Implements TimeConstraint.

Definition at line 9308 of file timeconstraint.cpp.

{
       assert(hasWrongDayOrHour(r));
       
       return true;
}

Here is the call graph for this function:

bool ConstraintActivityPreferredTimeSlots::computeInternalStructure ( QWidget *  parent,
Rules r 
) [virtual]

Computes the internal structure for this constraint.

It returns false if the constraint is an activity related one and it depends on only inactive activities.

Implements TimeConstraint.

Definition at line 9047 of file timeconstraint.cpp.

{
       Activity* act;
       int i;
       for(i=0; i<r.nInternalActivities; i++){
              act=&r.internalActivitiesList[i];
              if(act->id==this->p_activityId)
                     break;
       }

       if(i==r.nInternalActivities){
              QMessageBox::warning(parent, tr("FET error in data"), 
                     tr("Following constraint is wrong (because it refers to invalid activity id. Please correct it (maybe removing it is a solution)):\n%1").arg(this->getDetailedDescription(r)));
              //assert(0);
              return false;
       }

       for(int k=0; k<p_nPreferredTimeSlots_L; k++){
              if(this->p_days_L[k] >= r.nDaysPerWeek){
                     QMessageBox::information(parent, tr("FET information"),
                      tr("Constraint activity preferred time slots is wrong because it refers to removed day. Please correct"
                      " and try again. Correcting means editing the constraint and updating information. Constraint is:\n%1").arg(this->getDetailedDescription(r)));
               
                     return false;
              }             
              if(this->p_hours_L[k] == r.nHoursPerDay){
                     QMessageBox::information(parent, tr("FET information"),
                      tr("Constraint activity preferred time slots is wrong because a preferred hour is too late (after the last acceptable slot). Please correct"
                      " and try again. Correcting means editing the constraint and updating information. Constraint is:\n%1").arg(this->getDetailedDescription(r)));
               
                     return false;
              }
              if(this->p_hours_L[k] > r.nHoursPerDay){
                     QMessageBox::information(parent, tr("FET information"),
                      tr("Constraint activity preferred time slots is wrong because it refers to removed hour. Please correct"
                      " and try again. Correcting means editing the constraint and updating information. Constraint is:\n%1").arg(this->getDetailedDescription(r)));
               
                     return false;
              }

              if(this->p_hours_L[k]<0 || this->p_days_L[k]<0){
                     QMessageBox::information(parent, tr("FET information"),
                      tr("Constraint activity preferred time slots is wrong because it has hour or day not specified for a slot (-1). Please correct"
                      " and try again. Correcting means editing the constraint and updating information. Constraint is:\n%1").arg(this->getDetailedDescription(r)));
               
                     return false;
              }
       }

       this->p_activityIndex=i;
       return true;
}

Here is the call graph for this function:

double ConstraintActivityPreferredTimeSlots::fitness ( Solution c,
Rules r,
QList< double > &  cl,
QList< QString > &  dl,
QString *  conflictsString = NULL 
) [virtual]

The function that calculates the fitness of a solution, according to this constraint.

We need the rules to compute this fitness factor. If conflictsString!=NULL, it will be initialized with a text explaining where this restriction is broken.

Implements TimeConstraint.

Definition at line 9200 of file timeconstraint.cpp.

{
       //if the matrices subgroupsMatrix and teachersMatrix are already calculated, do not calculate them again!
       if(!c.teachersMatrixReady || !c.subgroupsMatrixReady){
              c.teachersMatrixReady=true;
              c.subgroupsMatrixReady=true;
              subgroups_conflicts = c.getSubgroupsMatrix(r, subgroupsMatrix);
              teachers_conflicts = c.getTeachersMatrix(r, teachersMatrix);

              c.changedForMatrixCalculation=false;
       }

       int nbroken;

       assert(r.internalStructureComputed);
       
       Matrix2D<bool> allowed;
       allowed.resize(r.nDaysPerWeek, r.nHoursPerDay);
       //bool allowed[MAX_DAYS_PER_WEEK][MAX_HOURS_PER_DAY];
       for(int d=0; d<r.nDaysPerWeek; d++)
              for(int h=0; h<r.nHoursPerDay; h++)
                     allowed[d][h]=false;
       for(int i=0; i<this->p_nPreferredTimeSlots_L; i++){
              if(this->p_days_L[i]>=0 && this->p_hours_L[i]>=0)
                     allowed[this->p_days_L[i]][this->p_hours_L[i]]=true;
              else
                     assert(0);
       }

       nbroken=0;
       if(c.times[this->p_activityIndex]!=UNALLOCATED_TIME){
              int d=c.times[this->p_activityIndex]%r.nDaysPerWeek; //the day when this activity was scheduled
              int h=c.times[this->p_activityIndex]/r.nDaysPerWeek; //the hour
              for(int dur=0; dur<r.internalActivitiesList[this->p_activityIndex].duration; dur++)
                     if(!allowed[d][h+dur])
                            nbroken++;
       }

       if(conflictsString!=NULL && nbroken>0){
              QString s=tr("Time constraint activity preferred time slots broken for activity with id=%1 (%2) on %3 hours, increases conflicts total by %4",
               "%1 is the id, %2 is the detailed description of the activity.")
               .arg(this->p_activityId)
               .arg(getActivityDetailedDescription(r, this->p_activityId))
               .arg(nbroken)
               .arg(CustomFETString::number(weightPercentage/100*nbroken));
               
              dl.append(s);
              cl.append(weightPercentage/100*nbroken);
       
              *conflictsString+= s+"\n";
       }

       if(weightPercentage==100)
              assert(nbroken==0);
       return nbroken * weightPercentage/100;
}

Here is the call graph for this function:

Returns a small description string for this constraint.

Implements TimeConstraint.

Definition at line 9127 of file timeconstraint.cpp.

{
       QString begin=QString("");
       if(!active)
              begin="X - ";
              
       QString end=QString("");
       if(!comments.isEmpty())
              end=", "+tr("C: %1", "Comments").arg(comments);
              
       QString s;
       s+=tr("Act. id: %1 (%2)", "%1 is the id, %2 is the detailed description of the activity")
              .arg(this->p_activityId)
              .arg(getActivityDetailedDescription(r, this->p_activityId));
       s+=" ";

       s+=tr("has a set of preferred time slots:");
       s+=" ";
       for(int i=0; i<this->p_nPreferredTimeSlots_L; i++){
              if(this->p_days_L[i]>=0){
                     s+=r.daysOfTheWeek[this->p_days_L[i]];
                     s+=" ";
              }
              if(this->p_hours_L[i]>=0){
                     s+=r.hoursOfTheDay[this->p_hours_L[i]];
              }
              if(i<this->p_nPreferredTimeSlots_L-1)
                     s+="; ";
       }
       s+=", ";

       s+=tr("WP:%1", "Weight percentage").arg(CustomFETString::number(this->weightPercentage));

       return begin+s+end;
}

Here is the call graph for this function:

Returns a detailed description string for this constraint.

Implements TimeConstraint.

Definition at line 9163 of file timeconstraint.cpp.

{
       QString s=tr("Time constraint");s+="\n";
       s+=tr("Activity with id=%1 (%2)", "%1 is the id, %2 is the detailed description of the activity")
              .arg(this->p_activityId)
              .arg(getActivityDetailedDescription(r, this->p_activityId));
       s+="\n";

       s+=tr("has a set of preferred time slots (all hours of the activity must be in the allowed slots):");
       s+="\n";
       for(int i=0; i<this->p_nPreferredTimeSlots_L; i++){
              if(this->p_days_L[i]>=0){
                     s+=r.daysOfTheWeek[this->p_days_L[i]];
                     s+=" ";
              }
              if(this->p_hours_L[i]>=0){
                     s+=r.hoursOfTheDay[this->p_hours_L[i]];
              }
              if(i<this->p_nPreferredTimeSlots_L-1)
                     s+=";  ";
       }
       s+="\n";

       s+=tr("Weight (percentage)=%1\%").arg(CustomFETString::number(this->weightPercentage));s+="\n";

       if(!active){
              s+=tr("Active=%1", "Refers to a constraint").arg(yesNoTranslated(active));
              s+="\n";
       }
       if(!comments.isEmpty()){
              s+=tr("Comments=%1").arg(comments);
              s+="\n";
       }

       return s;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Returns an XML description of this constraint.

Implements TimeConstraint.

Definition at line 9107 of file timeconstraint.cpp.

{
       QString s="<ConstraintActivityPreferredTimeSlots>\n";
       s+="   <Weight_Percentage>"+CustomFETString::number(this->weightPercentage)+"</Weight_Percentage>\n";
       s+="   <Activity_Id>"+CustomFETString::number(this->p_activityId)+"</Activity_Id>\n";
       s+="   <Number_of_Preferred_Time_Slots>"+CustomFETString::number(this->p_nPreferredTimeSlots_L)+"</Number_of_Preferred_Time_Slots>\n";
       for(int i=0; i<p_nPreferredTimeSlots_L; i++){
              s+="   <Preferred_Time_Slot>\n";
              if(this->p_days_L[i]>=0)
                     s+="          <Preferred_Day>"+protect(r.daysOfTheWeek[this->p_days_L[i]])+"</Preferred_Day>\n";
              if(this->p_hours_L[i]>=0)
                     s+="          <Preferred_Hour>"+protect(r.hoursOfTheDay[this->p_hours_L[i]])+"</Preferred_Hour>\n";
              s+="   </Preferred_Time_Slot>\n";
       }
       s+="   <Active>"+trueFalse(active)+"</Active>\n";
       s+="   <Comments>"+protect(comments)+"</Comments>\n";
       s+="</ConstraintActivityPreferredTimeSlots>\n";
       return s;
}

Here is the call graph for this function:

Implements TimeConstraint.

Definition at line 9100 of file timeconstraint.cpp.

{
       if(r.inactiveActivities.contains(this->p_activityId))
              return true;
       return false;
}

Implements TimeConstraint.

Definition at line 9295 of file timeconstraint.cpp.

{
       assert(p_nPreferredTimeSlots_L==p_days_L.count());
       assert(p_nPreferredTimeSlots_L==p_hours_L.count());
       
       for(int i=0; i<p_nPreferredTimeSlots_L; i++)
              if(p_days_L.at(i)<0 || p_days_L.at(i)>=r.nDaysPerWeek
               || p_hours_L.at(i)<0 || p_hours_L.at(i)>=r.nHoursPerDay)
                     return true;

       return false;
}

Here is the caller graph for this function:

Returns true if this constraint is related to this activity.

Implements TimeConstraint.

Definition at line 9257 of file timeconstraint.cpp.

{
       Q_UNUSED(r);

       if(this->p_activityId==a->id)
              return true;
       return false;
}

Returns true if this constraint is related to this activity tag.

Implements TimeConstraint.

Definition at line 9280 of file timeconstraint.cpp.

{
       Q_UNUSED(s);

       return false;
}

Returns true if this constraint is related to this students set.

Implements TimeConstraint.

Definition at line 9287 of file timeconstraint.cpp.

{
       Q_UNUSED(r);
       Q_UNUSED(s);

       return false;
}

Returns true if this constraint is related to this subject.

Implements TimeConstraint.

Definition at line 9273 of file timeconstraint.cpp.

{
       Q_UNUSED(s);

       return false;
}

Returns true if this constraint is related to this teacher.

Implements TimeConstraint.

Definition at line 9266 of file timeconstraint.cpp.

{
       Q_UNUSED(t);

       return false;
}

Implements TimeConstraint.

Definition at line 9315 of file timeconstraint.cpp.

{
       assert(hasWrongDayOrHour(r));
       
       assert(p_nPreferredTimeSlots_L==p_days_L.count());
       assert(p_nPreferredTimeSlots_L==p_hours_L.count());
       
       QList<int> newDays;
       QList<int> newHours;
       int newNPref=0;
       
       for(int i=0; i<p_nPreferredTimeSlots_L; i++)
              if(p_days_L.at(i)>=0 && p_days_L.at(i)<r.nDaysPerWeek
               && p_hours_L.at(i)>=0 && p_hours_L.at(i)<r.nHoursPerDay){
                     newDays.append(p_days_L.at(i));
                     newHours.append(p_hours_L.at(i));
                     newNPref++;
              }
       
       p_nPreferredTimeSlots_L=newNPref;
       p_days_L=newDays;
       p_hours_L=newHours;
       
       r.internalStructureComputed=false;
       setRulesModifiedAndOtherThings(&r);

       return true;
}

Here is the call graph for this function:


Member Data Documentation

bool TimeConstraint::active [inherited]

Definition at line 146 of file timeconstraint.h.

QString TimeConstraint::comments [inherited]

Definition at line 148 of file timeconstraint.h.

Activity id.

Definition at line 2046 of file timeconstraint.h.

The index of the activity in the rules (from 0 to rules.nActivities-1) - it is not the id of the activity.

Definition at line 2069 of file timeconstraint.h.

The preferred days.

If -1, then the user does not care about the day.

Definition at line 2057 of file timeconstraint.h.

The preferred hour.

If -1, then the user does not care about the hour.

Definition at line 2063 of file timeconstraint.h.

The number of preferred times.

Definition at line 2051 of file timeconstraint.h.

int TimeConstraint::type [inherited]

Specifies the type of this constraint (using the above constants).

Definition at line 153 of file timeconstraint.h.

The percentage weight of this constraint, 100% compulsory, 0% non-compulsory.

Definition at line 144 of file timeconstraint.h.


The documentation for this class was generated from the following files: