⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 addconstraintactivitiessamestartingtimeform.cpp

📁 基于遗传算法的排课软件源码 根据需要安排合理的课程时间等
💻 CPP
字号:
/***************************************************************************                          addconstraintactivitiessamestartingtimeform.cpp  -  description                             -------------------    begin                : Wed June 23 2004    copyright            : (C) 2004 by Lalescu Liviu    email                : liviu@lalescu.ro ***************************************************************************//*************************************************************************** *                                                                         * *   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.                                   * *                                                                         * ***************************************************************************/#include "addconstraintactivitiessamestartingtimeform.h"#include "spaceconstraint.h"#include <qradiobutton.h>#include <qlabel.h>#include <qlineedit.h>#include <qtable.h>AddConstraintActivitiesSameStartingTimeForm::AddConstraintActivitiesSameStartingTimeForm(){	teachersComboBox->insertItem("");	for(Teacher* tch=gt.rules.teachersList.first(); tch; tch=gt.rules.teachersList.next())		teachersComboBox->insertItem(tch->name);	teachersComboBox->setCurrentItem(0);	subjectsComboBox->insertItem("");	for(Subject* sb=gt.rules.subjectsList.first(); sb; sb=gt.rules.subjectsList.next())		subjectsComboBox->insertItem(sb->name);	subjectsComboBox->setCurrentItem(0);	subjectTagsComboBox->insertItem("");	for(SubjectTag* st=gt.rules.subjectTagsList.first(); st; st=gt.rules.subjectTagsList.next())		subjectTagsComboBox->insertItem(st->name);	subjectTagsComboBox->setCurrentItem(0);	studentsComboBox->insertItem("");	for(StudentsYear* sty=gt.rules.yearsList.first(); sty; sty=gt.rules.yearsList.next()){		studentsComboBox->insertItem(sty->name);		for(StudentsGroup* stg=sty->groupsList.first(); stg; stg=sty->groupsList.next()){			studentsComboBox->insertItem(stg->name);			for(StudentsSubgroup* sts=stg->subgroupsList.first(); sts; sts=stg->subgroupsList.next())				studentsComboBox->insertItem(sts->name);		}	}	studentsComboBox->setCurrentItem(0);		updateActivitiesListBox();}AddConstraintActivitiesSameStartingTimeForm::~AddConstraintActivitiesSameStartingTimeForm(){}bool AddConstraintActivitiesSameStartingTimeForm::filterOk(Activity* act){	QString tn=teachersComboBox->currentText();	QString stn=studentsComboBox->currentText();	QString sbn=subjectsComboBox->currentText();	QString sbtn=subjectTagsComboBox->currentText();	int ok=true;	//teacher	if(tn!=""){		bool ok2=false;		for(QStringList::Iterator it=act->teachersNames.begin(); it!=act->teachersNames.end(); it++)			if(*it == tn){				ok2=true;				break;			}		if(!ok2)			ok=false;	}	//subject	if(sbn!="" && sbn!=act->subjectName)		ok=false;			//subject tag	if(sbtn!="" && sbtn!=act->subjectTagName)		ok=false;			//students	if(stn!=""){		bool ok2=false;		for(QStringList::Iterator it=act->studentsNames.begin(); it!=act->studentsNames.end(); it++)			if(*it == stn){				ok2=true;				break;			}		if(!ok2)			ok=false;	}		return ok;}void AddConstraintActivitiesSameStartingTimeForm::filterChanged(){	this->updateActivitiesListBox();}void AddConstraintActivitiesSameStartingTimeForm::updateActivitiesListBox(){	activitiesListBox->clear();	simultaneousActivitiesListBox->clear();	this->activitiesList.clear();	this->simultaneousActivitiesList.clear();	if(blockCheckBox->isChecked())		//show only non-split activities and split activities which are the representatives		for(Activity* ac=gt.rules.activitiesList.first(); ac; ac=gt.rules.activitiesList.next()){			if(filterOk(ac)){				if(ac->activityGroupId==0){					activitiesListBox->insertItem(ac->getDescription(gt.rules));					this->activitiesList.append(ac->id);				}				else if(ac->id==ac->activityGroupId){					activitiesListBox->insertItem(ac->getDescription(gt.rules));					this->activitiesList.append(ac->id);				}			}		}	else		for(Activity* ac=gt.rules.activitiesList.first(); ac; ac=gt.rules.activitiesList.next())			if(filterOk(ac)){				activitiesListBox->insertItem(ac->getDescription(gt.rules));				this->activitiesList.append(ac->id);			}}void AddConstraintActivitiesSameStartingTimeForm::blockChanged(){	this->updateActivitiesListBox();}void AddConstraintActivitiesSameStartingTimeForm::addConstraint(){	TimeConstraint *ctr=NULL;	double weight;	QString tmp=weightLineEdit->text();	sscanf(tmp, "%lf", &weight);	if(weight<0.0){		QMessageBox::warning(this, QObject::tr("FET information"),			QObject::tr("Invalid weight"));		return;	}	bool compulsory=false;	if(compulsoryCheckBox->isChecked())		compulsory=true;	if(this->simultaneousActivitiesList.count()==0){		QMessageBox::warning(this, QObject::tr("FET information"),			QObject::tr("Empty list of simultaneous activities"));		return;	}	if(this->simultaneousActivitiesList.count()==1){		QMessageBox::warning(this, QObject::tr("FET information"),			QObject::tr("Only one selected activity - impossible"));		return;	}	if(this->simultaneousActivitiesList.count()>=(uint)(MAX_CONSTRAINT_ACTIVITIES_SAME_STARTING_TIME)){		QMessageBox::warning(this, QObject::tr("FET information"),			QObject::tr("Too many activities - please report error\n(CONSTRAINT_ACTIVITIES_SAME_STARTING_TIME too little)"));		return;	}	if(blockCheckBox->isChecked()){ //block constraints	///////////phase 1 - how many constraints will be added?	int nConstraints=0;	QValueList<int>::iterator it;	for(it=this->simultaneousActivitiesList.begin(); it!=this->simultaneousActivitiesList.end(); it++){		int _id=(*it);		int tmp=0; //tmp represents the number of sub-activities represented by the current (sub)activity		for(Activity* act=gt.rules.activitiesList.first(); act; act=gt.rules.activitiesList.next()){			if(act->activityGroupId==0){				if(act->id==_id){					assert(tmp==0);					tmp=1;				}			}			else{				if(act->id==_id){					assert(act->activityGroupId==act->id);					assert(tmp==0);					tmp=1;				}				else if(act->activityGroupId==_id)					tmp++;			}		}		if(nConstraints==0){			nConstraints=tmp;		}		else{			if(tmp!=nConstraints){				QString s=QObject::tr("Sub-activities do not correspond. Mistake:\n");				s+=QObject::tr("1. First (sub)activity has id=%1 and represents %2 sub-activities\n")					.arg(*(this->simultaneousActivitiesList.at(0)))					.arg(nConstraints);				s+=QObject::tr("2. Current (sub)activity has id=%1 and represents %2 sub-activities\n")					.arg(_id)					.arg(tmp);				QMessageBox::warning(this, QObject::tr("FET information"), s);				return;							}		}	}		/////////////phase 2 - compute the indices of all the (sub)activities#ifdef WIN32	int ids[10][MAX_CONSTRAINT_ACTIVITIES_SAME_STARTING_TIME];#else	int ids[nConstraints][this->simultaneousActivitiesList.count()];#endif	int k;	for(k=0, it=this->simultaneousActivitiesList.begin(); it!=this->simultaneousActivitiesList.end(); k++, it++){		int _id=(*it);		int tmp=0; //tmp represents the number of sub-activities represented by the current (sub)activity		for(Activity* act=gt.rules.activitiesList.first(); act; act=gt.rules.activitiesList.next()){			if(act->activityGroupId==0){				if(act->id==_id){					assert(tmp==0);					ids[tmp][k]=_id;					tmp=1;				}			}			else{				if(act->id==_id){					assert(act->activityGroupId==act->id);					assert(tmp==0);					ids[tmp][k]=_id;					tmp=1;				}				else if(act->activityGroupId==_id){					ids[tmp][k]=act->id;					tmp++;				}			}		}	}		////////////////phase 3 - add the constraints	for(k=0; k<nConstraints; k++){		ctr=new ConstraintActivitiesSameStartingTime(weight, compulsory, this->simultaneousActivitiesList.count(), ids[k]);		bool tmp2=gt.rules.addTimeConstraint(ctr);				if(tmp2){			QString s=QObject::tr("Constraint added:");			s+="\n";			s+=ctr->getDetailedDescription(gt.rules);			QMessageBox::information(this, QObject::tr("FET information"), s);		}		else{			QMessageBox::warning(this, QObject::tr("FET information"),				QObject::tr("Constraint NOT added - please report error"));			delete ctr;		}	}}else{	int ids[MAX_CONSTRAINT_ACTIVITIES_SAME_STARTING_TIME];	QValueList<int>::iterator it;	int i;	for(i=0, it=this->simultaneousActivitiesList.begin(); it!=this->simultaneousActivitiesList.end(); i++,it++){		assert(i<MAX_CONSTRAINT_ACTIVITIES_SAME_STARTING_TIME);		ids[i]=*it;	}	ctr=new ConstraintActivitiesSameStartingTime(weight, compulsory, this->simultaneousActivitiesList.count(), ids);	bool tmp2=gt.rules.addTimeConstraint(ctr);			if(tmp2){		QString s=QObject::tr("Constraint added:");		s+="\n";		s+=ctr->getDetailedDescription(gt.rules);		QMessageBox::information(this, QObject::tr("FET information"), s);	}	else{		QMessageBox::warning(this, QObject::tr("FET information"),			QObject::tr("Constraint NOT added - please report error"));		delete ctr;	}}}void AddConstraintActivitiesSameStartingTimeForm::addActivity(){	if(activitiesListBox->currentItem()<0)		return;	int tmp=activitiesListBox->currentItem();	int _id=*(this->activitiesList.at(tmp));		QString actName=activitiesListBox->currentText();	assert(actName!="");	uint i;	//duplicate?	for(i=0; i<simultaneousActivitiesListBox->count(); i++)		if(actName==simultaneousActivitiesListBox->text(i))			break;	if(i<simultaneousActivitiesListBox->count())		return;	simultaneousActivitiesListBox->insertItem(actName);		this->simultaneousActivitiesList.append(_id);}void AddConstraintActivitiesSameStartingTimeForm::removeActivity(){	if(simultaneousActivitiesListBox->currentItem()<0 || simultaneousActivitiesListBox->count()<=0)		return;			int tmp=simultaneousActivitiesListBox->currentItem();	int _id=*(this->simultaneousActivitiesList.at(tmp));		simultaneousActivitiesListBox->removeItem(simultaneousActivitiesListBox->currentItem());	int tmp2=this->simultaneousActivitiesList.remove(_id);	assert(tmp2==1);}void AddConstraintActivitiesSameStartingTimeForm::clear(){	simultaneousActivitiesListBox->clear();	simultaneousActivitiesList.clear();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -