Back to index

fet  5.18.0
Public Member Functions | Public Attributes
ConstraintStudentsSetEarlyMaxBeginningsAtSecondHour Class Reference

#include <timeconstraint.h>

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

List of all members.

Public Member Functions

 ConstraintStudentsSetEarlyMaxBeginningsAtSecondHour ()
 ConstraintStudentsSetEarlyMaxBeginningsAtSecondHour (double wp, int mBSH, const QString &students)
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 maxBeginningsAtSecondHour
QString students
 The name of the students.
QList< int > iSubgroupsList
 The number of subgroups involved in this restriction.
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

Definition at line 1527 of file timeconstraint.h.


Constructor & Destructor Documentation


Member Function Documentation

Implements TimeConstraint.

Definition at line 6681 of file timeconstraint.cpp.

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

Here is the call graph for this function:

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 6426 of file timeconstraint.cpp.

{
       StudentsSet* ss=r.searchAugmentedStudentsSet(this->students);
       
       if(ss==NULL){
              QMessageBox::warning(parent, tr("FET warning"),
               tr("Constraint students set early is wrong because it refers to inexistent students set."
               " Please correct it (removing it might be a solution). Please report potential bug. Constraint is:\n%1").arg(this->getDetailedDescription(r)));
               
              return false;
       }      

       assert(ss);

       this->iSubgroupsList.clear();
       if(ss->type==STUDENTS_SUBGROUP){
              int tmp;
              tmp=((StudentsSubgroup*)ss)->indexInInternalSubgroupsList;
              assert(tmp>=0);
              assert(tmp<r.nInternalSubgroups);
              if(!this->iSubgroupsList.contains(tmp))
                     this->iSubgroupsList.append(tmp);
       }
       else if(ss->type==STUDENTS_GROUP){
              StudentsGroup* stg=(StudentsGroup*)ss;
              for(int i=0; i<stg->subgroupsList.size(); i++){
                     StudentsSubgroup* sts=stg->subgroupsList[i];
                     int tmp;
                     tmp=sts->indexInInternalSubgroupsList;
                     assert(tmp>=0);
                     assert(tmp<r.nInternalSubgroups);
                     if(!this->iSubgroupsList.contains(tmp))
                            this->iSubgroupsList.append(tmp);
              }
       }
       else if(ss->type==STUDENTS_YEAR){
              StudentsYear* sty=(StudentsYear*)ss;
              for(int i=0; i<sty->groupsList.size(); i++){
                     StudentsGroup* stg=sty->groupsList[i];
                     for(int j=0; j<stg->subgroupsList.size(); j++){
                            StudentsSubgroup* sts=stg->subgroupsList[j];
                            int tmp;
                            tmp=sts->indexInInternalSubgroupsList;
                            assert(tmp>=0);
                            assert(tmp<r.nInternalSubgroups);
                            if(!this->iSubgroupsList.contains(tmp))
                                   this->iSubgroupsList.append(tmp);
                     }
              }
       }
       else
              assert(0);
       return true;
}

Here is the call graph for this function:

double ConstraintStudentsSetEarlyMaxBeginningsAtSecondHour::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 6547 of file timeconstraint.cpp.

{
       //considers the condition that the hours of subgroups begin as early as possible

       //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 conflTotal=0;

       foreach(int i, this->iSubgroupsList){
              int nGapsFirstHour=0;
              for(int j=0; j<r.nDaysPerWeek; j++){
                     int k;
                     for(k=0; k<r.nHoursPerDay; k++)
                            if(!breakDayHour[j][k] && !subgroupNotAvailableDayHour[i][j][k])
                                   break;
                            
                     bool firstHourOccupied=false;
                     if(k<r.nHoursPerDay && subgroupsMatrix[i][j][k]>0)
                            firstHourOccupied=true;
                                   
                     bool dayOccupied=firstHourOccupied;
                     
                     bool illegalGap=false;
                            
                     for(k++; k<r.nHoursPerDay && !dayOccupied; k++)
                            if(!breakDayHour[j][k] && !subgroupNotAvailableDayHour[i][j][k]){
                                   if(subgroupsMatrix[i][j][k]>0)
                                          dayOccupied=true;
                                   else
                                          illegalGap=true;
                            }
                            
                     if(dayOccupied && illegalGap){
                            if(conflictsString!=NULL){
                                   QString s=tr("Constraint students set early max %1 beginnings at second hour broken for subgroup %2, on day %3,"
                                    " because students have an illegal gap, increases conflicts total by %4")
                                    .arg(this->maxBeginningsAtSecondHour)
                                    .arg(r.internalSubgroupsList[i]->name)
                                    .arg(r.daysOfTheWeek[j])
                                    .arg(CustomFETString::number(1*weightPercentage/100));
                                    
                                   dl.append(s);
                                   cl.append(1*weightPercentage/100);
                                          
                                   *conflictsString+= s+"\n";
                                   
                                   conflTotal+=1;
                            }
                            
                            if(c.nPlacedActivities==r.nInternalActivities)
                                   assert(0);
                     }
                     
                     if(dayOccupied && !firstHourOccupied)
                            nGapsFirstHour++;
              }
              
              if(nGapsFirstHour>this->maxBeginningsAtSecondHour){
                     if(conflictsString!=NULL){
                            QString s=tr("Constraint students set early max %1 beginnings at second hour broken for subgroup %2,"
                             " because students have too many arrivals at second hour, increases conflicts total by %3")
                             .arg(this->maxBeginningsAtSecondHour)
                             .arg(r.internalSubgroupsList[i]->name)
                             .arg(CustomFETString::number((nGapsFirstHour-this->maxBeginningsAtSecondHour)*weightPercentage/100));
                             
                            dl.append(s);
                            cl.append((nGapsFirstHour-this->maxBeginningsAtSecondHour)*weightPercentage/100);
                                   
                            *conflictsString+= s+"\n";
                            
                            conflTotal+=(nGapsFirstHour-this->maxBeginningsAtSecondHour);
                     }
                     
                     if(c.nPlacedActivities==r.nInternalActivities)
                            assert(0);
              }
       }
                                   
       if(c.nPlacedActivities==r.nInternalActivities)
              if(weightPercentage==100)    //might be broken for partial solutions
                     assert(conflTotal==0);
       return weightPercentage/100 * conflTotal;
}

Here is the call graph for this function:

Returns a small description string for this constraint.

Implements TimeConstraint.

Definition at line 6501 of file timeconstraint.cpp.

{
       Q_UNUSED(r);

       QString begin=QString("");
       if(!active)
              begin="X - ";
              
       QString end=QString("");
       if(!comments.isEmpty())
              end=", "+tr("C: %1", "Comments").arg(comments);
              
       QString s;

       s+=tr("Students set must arrive early, respecting maximum %1 arrivals at second hour")
        .arg(this->maxBeginningsAtSecondHour); s+=", ";
       s+=tr("WP:%1\%", "Weight percentage").arg(CustomFETString::number(this->weightPercentage));s+=", ";
       s+=tr("St:%1", "Students set").arg(this->students);

       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 6523 of file timeconstraint.cpp.

{
       Q_UNUSED(r);

       QString s=tr("Time constraint");s+="\n";

       s+=tr("A students set must begin its courses early, respecting a maximum number of later arrivals, at second hour"); s+="\n";
       s+=tr("(breaks and students set not available not counted)");s+="\n";
       s+=tr("Weight (percentage)=%1\%").arg(CustomFETString::number(this->weightPercentage));s+="\n";
       s+=tr("Students set=%1").arg(this->students); s+="\n";
       s+=tr("Maximum number of arrivals at the second hour=%1").arg(this->maxBeginningsAtSecondHour);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 6487 of file timeconstraint.cpp.

{
       Q_UNUSED(r);

       QString s="<ConstraintStudentsSetEarlyMaxBeginningsAtSecondHour>\n";
       s+="   <Weight_Percentage>"+CustomFETString::number(this->weightPercentage)+"</Weight_Percentage>\n";
       s+="   <Max_Beginnings_At_Second_Hour>"+CustomFETString::number(this->maxBeginningsAtSecondHour)+"</Max_Beginnings_At_Second_Hour>\n";
       s+="   <Students>"+protect(this->students)+"</Students>\n";
       s+="   <Active>"+trueFalse(active)+"</Active>\n";
       s+="   <Comments>"+protect(comments)+"</Comments>\n";
       s+="</ConstraintStudentsSetEarlyMaxBeginningsAtSecondHour>\n";
       return s;
}

Here is the call graph for this function:

Implements TimeConstraint.

Definition at line 6481 of file timeconstraint.cpp.

{
       Q_UNUSED(r);
       return false;
}

Implements TimeConstraint.

Definition at line 6673 of file timeconstraint.cpp.

{
       if(maxBeginningsAtSecondHour>r.nDaysPerWeek)
              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 6639 of file timeconstraint.cpp.

{
       Q_UNUSED(r);
       Q_UNUSED(a);

       return false;
}

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

Implements TimeConstraint.

Definition at line 6661 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 6668 of file timeconstraint.cpp.

{
       return r.setsShareStudents(this->students, s->name);
}

Here is the call graph for this function:

Returns true if this constraint is related to this subject.

Implements TimeConstraint.

Definition at line 6654 of file timeconstraint.cpp.

{
       Q_UNUSED(s);

       return false;
}

Returns true if this constraint is related to this teacher.

Implements TimeConstraint.

Definition at line 6647 of file timeconstraint.cpp.

{
       Q_UNUSED(t);

       return false;
}

Implements TimeConstraint.

Definition at line 6688 of file timeconstraint.cpp.

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.

The number of subgroups involved in this restriction.

The subgroups involved in this restriction

Definition at line 1547 of file timeconstraint.h.

Definition at line 1531 of file timeconstraint.h.

The name of the students.

Definition at line 1536 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: