Пример #1
0
void Ant::modifiedAnt(Individual<CodeVInt> &parent)
{
	if (m_iteIndivl.data().m_x[m_loc] != m_x[m_loc])
	{
		double obj = m_iteIndivl.data().m_obj[0];
		TravellingSalesman *ptr = dynamic_cast<TravellingSalesman*>(Global::msp_global->mp_problem.get());
		int pos = -1;
		for (int i = m_loc + 1; i < getNumDim(); i++)
		{
			if (m_iteIndivl.data().m_x[i] == m_x[m_loc])
			{
				pos = i;
				break;
			}
		}
		obj = obj - ptr->getCost()[m_iteIndivl.data().m_x[pos]][m_iteIndivl.data().m_x[pos - 1]] - ptr->getCost()[m_iteIndivl.data().m_x[pos]][m_iteIndivl.data().m_x[(pos + 1) % getNumDim()]]\
			- ptr->getCost()[m_iteIndivl.data().m_x[m_loc]][m_iteIndivl.data().m_x[m_loc - 1]];
		obj = obj + ptr->getCost()[m_iteIndivl.data().m_x[pos]][m_iteIndivl.data().m_x[m_loc - 1]] + ptr->getCost()[m_iteIndivl.data().m_x[pos]][m_iteIndivl.data().m_x[m_loc]]\
			+ ptr->getCost()[m_iteIndivl.data().m_x[pos - 1]][m_iteIndivl.data().m_x[(pos + 1) % getNumDim()]];
		m_iteIndivl.data().m_obj[0] = obj;
		for (int i = pos - 1; i >= m_loc; i--)
		{
			m_iteIndivl.data().m_x[i + 1] = m_iteIndivl.data().m_x[i];
		}
		m_iteIndivl.data().m_x[m_loc] = m_x[m_loc];
		if ((ptr->getOptType() == MIN_OPT && obj < parent.data().m_obj[0]) || (ptr->getOptType() == MAX_OPT && obj > parent.data().m_obj[0]))
		{
			parent.data().m_obj[0] = obj;
			for (int i = 0; i < getNumDim(); i++)
				parent.data().m_x[i] = m_iteIndivl.data().m_x[i];
			parent.setFlag(true);
		}
	}
}
Пример #2
0
void Ant::selectNextCity_GLMemory_MKP(Individual<CodeVInt> &parent, const vector<double>&phero, double xp) {
	double p = Global::msp_global->mp_uniformAlg->Next();
	if (p<xp) {
		int node = parent.data().m_x[m_loc + 1];
		++m_loc;
		m_x[m_loc] = node;
		if (!m_flag&&parent.data().m_x[m_loc] != node) m_flag = true;
		return;
	}
	else {
		++m_loc;
		double p = Global::msp_global->mp_uniformAlg->Next();
		if (p<phero[m_loc])
			m_x[m_loc] = 1;
		else 
			m_x[m_loc] = 0;
		if (!m_flag&&m_x[m_loc] != parent.data().m_x[m_loc]) m_flag = true;
	}
}
Пример #3
0
void Ant::selectNextCity_GLMemory_QAP(Individual<CodeVInt> &parent, const vector<vector<double> > &phero, double xp) {
	double p = Global::msp_global->mp_uniformAlg->Next();
	if (p<xp) {
		int node = parent.data().m_x[m_loc + 1];

		if (mv_tabu[node] == 0) {
			++m_loc;
			m_x[m_loc] = node;
			mv_tabu[node] = 1;
			if (!m_flag&&parent.data().m_x[m_loc] != node) m_flag = true;
			return;
		}
	}

	int i, numDim = getNumDim(), firstZero = -1;

	for (i = 0; i<numDim; i++) {
		if (mv_tabu[i] == 0) {
			mv_accPro[i] = phero[m_loc + 1][i];
			if (firstZero == -1) firstZero = i;
		}
		else {
			mv_accPro[i] = 0;
		}
		if (i>0) mv_accPro[i] += mv_accPro[i - 1];
	}
	++m_loc;
	if (mv_accPro[numDim - 1]>0) {
		double p = Global::msp_global->mp_uniformAlg->Next()*mv_accPro[numDim - 1];
		vector<double>::iterator it = lower_bound(mv_accPro.begin(), mv_accPro.end(), p);
		m_x[m_loc] = int(it - mv_accPro.begin());
	}
	else {
		m_x[m_loc] = firstZero;
	}
	if (!m_flag&&m_x[m_loc] != parent.data().m_x[m_loc]) m_flag = true;
	mv_tabu[m_x[m_loc]] = 1;
}
Пример #4
0
void Ant::selectNextCity_GLMemory_TSP(Individual<CodeVInt> &parent, const vector<vector<double> > &phero, double xp){
	
	double p=Global::msp_global->mp_uniformAlg->Next();
	if(p<xp){
		pair<int,int> pa=dynamic_cast<TravellingSalesman*>(Global::msp_global->mp_problem.get())->getNextCity(parent,m_x[m_loc]);
		int node=mv_tabu[pa.first]<mv_tabu[pa.second]?pa.first:pa.second;
		
		if(mv_tabu[node]==0){
			++m_loc;
			m_x[m_loc]=node;
			mv_tabu[node]=1;
			if(!m_flag&&parent.data().m_x[m_loc]!=node) m_flag=true;
			modifiedAnt(parent);
			return;
		}
	}	

	int i,curNode=m_x[m_loc],numDim=getNumDim(),firstZero=-1;
	/*for(i=0;i<getNumDim();i++){
		if(i!=curNode&&dynamic_cast<TravellingSalesman*>(Global::msp_global->mp_problem.get())->getCost()[curNode][i]==0){
			++m_loc;
			m_x[m_loc]=i;
			if(m_x[m_loc]!=parent.m_x[m_loc]) m_flag=true;
			return;
		}
	}
	for(i=0;i<getNumDim();i++){
		mv_accPro[i]=0;
		if(mv_tabu[i]==0){
			sum+=phero[curNode][i];
		}
	}
	if(sum>0){
		for(i=0;i<getNumDim();i++){
			if(mv_tabu[i]==0){
				mv_accPro[i]=phero[curNode][i];
				mv_accPro[i]=mv_accPro[i]/sum;
			}
			if(i>0) mv_accPro[i]+=mv_accPro[i-1];
		}
		double p=Global::msp_global->mp_uniformAlg->Next();
		int pos;
		for(i=0;i<getNumDim();i++){
			if(p<=mv_accPro[i]){
				pos=i;
				break;
			}
		}
		++m_loc;	
		m_x[m_loc]=pos;

	}else{
		for(i=0;i<getNumDim();i++){
			if(mv_tabu[i]==0){
				++m_loc;
				m_x[m_loc]=i;
				break;
			}
		}
	}
	if(m_x[m_loc]!=parent.m_x[m_loc]) m_flag=true;
	mv_tabu[m_x[m_loc]]=1;*/

	
	for(i=0;i<numDim;i++){
		if(mv_tabu[i]==0){
			mv_accPro[i]=phero[curNode][i];
			if(firstZero==-1) firstZero=i;
		}else{
			mv_accPro[i]=0;
		}
		if(i>0) mv_accPro[i]+=mv_accPro[i-1];
	}
	++m_loc;
	if(mv_accPro[numDim-1]>0){
		double p=Global::msp_global->mp_uniformAlg->Next()*mv_accPro[numDim-1];
		//vector<double>::iterator it= find_if(mv_accPro.begin(),mv_accPro.end(),[&](const double &i){return p<=i;});
		vector<double>::iterator it= lower_bound(mv_accPro.begin(),mv_accPro.end(),p);
		m_x[m_loc]=int (it-mv_accPro.begin());
	}else{
		m_x[m_loc]=firstZero;
	}
	if(!m_flag&&m_x[m_loc]!=parent.data().m_x[m_loc]) m_flag=true;
	modifiedAnt(parent);
	mv_tabu[m_x[m_loc]]=1;
}