Exemplo n.º 1
0
std::vector<tLineSegment<typename TrajectoryCollection::value_type::value_type>> 
traclus(TrajectoryCollection &A, double eps, size_t minLines, partitioning_functional &part,
distance_functional &_d, progress_visitor  &pvis)
{
	
	typedef typename TrajectoryCollection::value_type TrajectoryType;
	std::vector<size_t> index_map;
	
	
	std::vector<tLineSegment<typename TrajectoryType::value_type>> segments;
	TrajectoryType L;
	size_t i=0;
	pvis.init(A.size());
	auto it = A.begin();
	while (it != A.end())
	{
		if((*it).size() == 0)		// ignore empty
			continue;
		TrajectoryType CPi;
		 CPi = part(*it);
		 for (size_t k=0; k < CPi.size() -1; k++)
		 {
			 segments.push_back(tLineSegment<typename TrajectoryType::value_type>(CPi[k],CPi[k+1],i));
		 }
		it++;i++;
		pvis(i,A.size(),"Phase 1: Segment Creation");
	}

	 
	 grouping(segments,eps,minLines,_d, pvis);
     pvis.finish();
	 return segments;
};
Exemplo n.º 2
0
int main()
{
    double *x_r,*x_i,*y_r,*y_i,w_r,w_i;
    int k,n,p,q,r,N = 1;
    
    printf("p,q,r = ");
    scanf("%d %d %d",&p,&q,&r);
    N = pow(2,p)*pow(3,q)*pow(5,r);
    printf("N = %d\n",N);
    
    grouping(N);
    
    system("pause");
    return 0;
}
Exemplo n.º 3
0
bool QtCurveHandler::supports(Ability ability) const
{
    switch (ability) {
    // announce
    case AbilityAnnounceButtons:
    case AbilityAnnounceColors:
    // buttons
    case AbilityButtonMenu:
    case AbilityButtonOnAllDesktops:
    case AbilityButtonSpacer:
    case AbilityButtonHelp:
    case AbilityButtonMinimize:
    case AbilityButtonMaximize:
    case AbilityButtonClose:
    case AbilityButtonAboveOthers:
    case AbilityButtonBelowOthers:
    case AbilityButtonShade:
    // TODO
    // case AbilityButtonResize:
#if KDE_IS_VERSION(4, 9, 85)
    case AbilityButtonApplicationMenu:
#endif
    // colors
    case AbilityColorTitleBack:
    case AbilityColorTitleFore:
    case AbilityColorFrame:
        return true;
#if KDE_IS_VERSION(4, 3, 0)
    case AbilityUsesAlphaChannel:
        return true; // !Handler()->outerBorder(); ???
    case AbilityProvidesShadow:
        return customShadows();
#endif
#if KDE_IS_VERSION(4, 3, 85) && !KDE_IS_VERSION(4, 8, 80)
    case AbilityClientGrouping:
        return grouping();
#endif
#if KDE_IS_VERSION(4, 5, 85)
    case AbilityUsesBlurBehind:
        return opacity(true)<100 || opacity(false)<100 || wStyle()->pixelMetric((QStyle::PixelMetric)QtC_CustomBgnd, 0L, 0L);
#endif
        // TODO's
    default:
        return false;
    }
}
BtSearchModuleChooserDialog::BtSearchModuleChooserDialog(QWidget *parent,
                                                         Qt::WindowFlags flags)
    : BtModuleChooserDialog(parent, flags)
{
    // Initialize the tree model:
    BtBookshelfTreeModel::Grouping grouping(groupingOrderKey);
    BtBookshelfTreeModel *treeModel = new BtBookshelfTreeModel(grouping, this);
    treeModel->setCheckable(true);
    BT_CONNECT(treeModel,
               SIGNAL(groupingOrderChanged(BtBookshelfTreeModel::Grouping)),
               this,
               SLOT(slotGroupingOrderChanged(
                            BtBookshelfTreeModel::Grouping const &)));

    // Initialize the bookshelf widget:
    bookshelfWidget()->showHideAction()->setVisible(false);
    bookshelfWidget()->showHideButton()->hide();
    bookshelfWidget()->setTreeModel(treeModel);
    bookshelfWidget()->setSourceModel(CSwordBackend::instance()->model());

    retranslateUi();
}
Exemplo n.º 5
0
void mutation(struct para_mutation* para_1)
{
	//DEFINITION
	int cnt_1 = 0;
	int fail_count = 0; //this is the number of the mutation because of the airship being out of the boundary
	int* index_airship_match_1 = NULL;  //this array is used for recording the index of the paring airships. This is the index of the airships of the passitive individual
	int* index_airship_match_2 = NULL;  //this array is used for recording the index of the paring airships. This is the index of the airships of the initiative individual
	double tmp_1 = 0;
	double tmp_2 = 0;
	double tmp_3 = 0;
	double intensity_random = 0;
	double direction_master_x = 0;
	double direction_master_y = 0;
	double direction_slave_x = 0;
	double direction_slave_y = 0;
	double tmp_sml = 0;  //this is the similarity value of the two individuals being crossovered
	struct para_similarity_single para_2;
	struct para_grouping para_3;

	switch (para_1->mode_mutation)  //Choose a mode of mutation
	{
	case 0:

		//RAM ALLOCATION
		index_airship_match_1 = (int*)calloc(para_1->amount_airship, sizeof(int));
		index_airship_match_2 = (int*)calloc(para_1->amount_airship, sizeof(int));

		//CALCULATE THE PARING INFORMATION
		para_2.amount_airship = para_1->amount_airship;
		para_2.mode_record_similarity = para_1->mode_record_similarity;
		para_2.match_airship = index_airship_match_1;
		para_2.indiv_initiative = para_1->indiv_origin_1;
		para_2.indiv_passive = para_1->indiv_origin_2;
		tmp_sml = similarity_single(&para_2);

		//GENERETE THE MATCH ARRAY FOR INDIVIDUAL #2
		for (cnt_1 = 0; cnt_1 < para_1->amount_airship; cnt_1++)
		{
			index_airship_match_2[index_airship_match_1[cnt_1]] = cnt_1;
		}

		//MUTATION FOR INDIVIDUAL #1
		for (cnt_1 = 0; cnt_1 < para_1->amount_airship; cnt_1++)  //for all the airships, perform the mutation
		{
			//generate the criterion
			tmp_1 = (double)rand() / RAND_MAX;
			//judgement: perform mutation?
			if ((tmp_1 < para_1->para_mt_pbl) || (fail_count != 0))
			{
				//calculate the direction vector
				/*
				The vector points to the passitive individual
				*/
				direction_master_x = para_1->indiv_origin_2->pst_x[index_airship_match_1[cnt_1]] - para_1->indiv_origin_1->pst_x[cnt_1];
				direction_master_y = para_1->indiv_origin_2->pst_y[index_airship_match_1[cnt_1]] - para_1->indiv_origin_1->pst_y[cnt_1];
				direction_master_x = direction_master_x / 2;
				direction_master_y = direction_master_y / 2;
				direction_slave_x = direction_master_y;
				direction_slave_y = -direction_master_x;

				//set positions
				//main direction
				tmp_2 = (double)rand() / RAND_MAX;
				intensity_random = (double)rand() / RAND_MAX;
				if (tmp_2 > 0.5)
				{
					para_1->indiv_new_1->pst_x[cnt_1] = para_1->indiv_origin_1->pst_x[cnt_1] + direction_master_x*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
					para_1->indiv_new_1->pst_y[cnt_1] = para_1->indiv_origin_1->pst_y[cnt_1] + direction_master_y*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
				}
				else
				{
					para_1->indiv_new_1->pst_x[cnt_1] = para_1->indiv_origin_1->pst_x[cnt_1] - direction_master_x*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
					para_1->indiv_new_1->pst_y[cnt_1] = para_1->indiv_origin_1->pst_y[cnt_1] - direction_master_y*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
				}
				//slave direction
				tmp_2 = (double)rand() / RAND_MAX;
				intensity_random = (double)rand() / RAND_MAX;
				if (tmp_2 > 0.5)
				{
					para_1->indiv_new_1->pst_x[cnt_1] = para_1->indiv_new_1->pst_x[cnt_1] + direction_slave_x*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
					para_1->indiv_new_1->pst_y[cnt_1] = para_1->indiv_new_1->pst_y[cnt_1] + direction_slave_y*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
				}
				else
				{
					para_1->indiv_new_1->pst_x[cnt_1] = para_1->indiv_new_1->pst_x[cnt_1] - direction_slave_x*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
					para_1->indiv_new_1->pst_y[cnt_1] = para_1->indiv_new_1->pst_y[cnt_1] - direction_slave_y*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
				}
			}
			else  //not perform mutation
			{
				para_1->indiv_new_1->pst_x[cnt_1] = para_1->indiv_origin_1->pst_x[cnt_1];
				para_1->indiv_new_1->pst_y[cnt_1] = para_1->indiv_origin_1->pst_y[cnt_1];
			}

			//boundary check
			if ((para_1->indiv_new_1->pst_x[cnt_1] >= para_1->area_x) || (para_1->indiv_new_1->pst_x[cnt_1] <= 0) || (para_1->indiv_new_1->pst_y[cnt_1] >= para_1->area_y) || (para_1->indiv_new_1->pst_y[cnt_1] <= 0))  //if the new position is out of boundary
			{
				fail_count++;
				cnt_1--;
				error_processor(31);
			}
			else
			{
				fail_count = 0;
			}
		}

		fail_count = 0;  //reset the counter
		//MUTATION FOR INDIVIDUAL #2
		for (cnt_1 = 0; cnt_1 < para_1->amount_airship; cnt_1++)  //for all the airships, perform the mutation
		{
			//generate the criterion
			tmp_1 = (double)rand() / RAND_MAX;
			//judgement: perform mutation?
			if ((tmp_1 < para_1->para_mt_pbl) || (fail_count != 0))
			{
				//calculate the direction vector
				/*
				The vector points to the passitive individual
				*/
				/*
				@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
				the two directions do not need to be calculated again
				@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
				*/
				direction_master_x = para_1->indiv_origin_1->pst_x[index_airship_match_2[cnt_1]] - para_1->indiv_origin_2->pst_x[cnt_1];
				direction_master_y = para_1->indiv_origin_1->pst_y[index_airship_match_2[cnt_1]] - para_1->indiv_origin_2->pst_y[cnt_1];
				direction_master_x = direction_master_x / 2;
				direction_master_y = direction_master_y / 2;
				direction_slave_x = direction_master_y;
				direction_slave_y = -direction_master_x;

				//set positions
				//main direction
				tmp_2 = (double)rand() / RAND_MAX;
				intensity_random = (double)rand() / RAND_MAX;
				if (tmp_2 > 0.5)
				{
					para_1->indiv_new_2->pst_x[cnt_1] = para_1->indiv_origin_2->pst_x[cnt_1] + direction_master_x*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
					para_1->indiv_new_2->pst_y[cnt_1] = para_1->indiv_origin_2->pst_y[cnt_1] + direction_master_y*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
				}
				else
				{
					para_1->indiv_new_2->pst_x[cnt_1] = para_1->indiv_origin_2->pst_x[cnt_1] - direction_master_x*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
					para_1->indiv_new_2->pst_y[cnt_1] = para_1->indiv_origin_2->pst_y[cnt_1] - direction_master_y*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
				}
				//slave direction
				tmp_2 = (double)rand() / RAND_MAX;
				intensity_random = (double)rand() / RAND_MAX;
				if (tmp_2 > 0.5)
				{
					para_1->indiv_new_2->pst_x[cnt_1] = para_1->indiv_new_2->pst_x[cnt_1] + direction_slave_x*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
					para_1->indiv_new_2->pst_y[cnt_1] = para_1->indiv_new_2->pst_y[cnt_1] + direction_slave_y*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
				}
				else
				{
					para_1->indiv_new_2->pst_x[cnt_1] = para_1->indiv_new_2->pst_x[cnt_1] - direction_slave_x*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
					para_1->indiv_new_2->pst_y[cnt_1] = para_1->indiv_new_2->pst_y[cnt_1] - direction_slave_y*intensity_random*para_1->para_intensity*pow(0.5, fail_count);
				}
			}
			else  //not perform mutation
			{
				para_1->indiv_new_2->pst_x[cnt_1] = para_1->indiv_origin_2->pst_x[cnt_1];
				para_1->indiv_new_2->pst_y[cnt_1] = para_1->indiv_origin_2->pst_y[cnt_1];
			}

			//boundary check
			if ((para_1->indiv_new_2->pst_x[cnt_1] >= para_1->area_x) || (para_1->indiv_new_2->pst_x[cnt_1] <= 0) || (para_1->indiv_new_2->pst_y[cnt_1] >= para_1->area_y) || (para_1->indiv_new_2->pst_y[cnt_1] <= 0))  //if the new position is out of boundary
			{
				fail_count++;
				cnt_1--;
				error_processor(31);
			}
			else
			{
				fail_count = 0;
			}
		}

		//GROUPING AND REPAIRING
		para_3.amount_airship = para_1->amount_airship;
		para_3.area_x = para_1->area_x;
		para_3.area_y = para_1->area_y;
		para_3.dist_a2a = Cfg_opti.dist_a2a;
		para_3.dist_safe = para_1->dist_safe;
		para_3.indiv_1 = para_1->indiv_new_1;
		cnt_1 = grouping(&para_3);
		while (cnt_1 == 11)
		{
			cnt_1 = grouping(&para_3);
		}
		para_3.indiv_1 = para_1->indiv_new_2;
		cnt_1 = grouping(&para_3);
		while (cnt_1 == 11)
		{
			cnt_1 = grouping(&para_3);
		}

		//RAM RECYCLING
		free(index_airship_match_1);
		free(index_airship_match_2);
		break;
	case 1:

		/*
		ALGORITHM: The uniform mutation
		*/

		//for individual #1
		//for x coordinate
		for (cnt_1 = 0; cnt_1 < para_1->amount_airship; cnt_1++)
		{
			//mutation judgement
			tmp_1 = (double)rand() / RAND_MAX;
			if (tmp_1 < para_1->para_mt_pbl)
			{
				//direction judgement
				tmp_2 = (double)rand() / RAND_MAX;
				tmp_3 = ((double)rand() + 0.00001) / (RAND_MAX + 0.0001);
				if (tmp_2 > 0.5)
				{
					para_1->indiv_new_1->pst_x[cnt_1] = para_1->indiv_origin_1->pst_x[cnt_1] + tmp_3*(para_1->area_x - para_1->indiv_origin_1->pst_x[cnt_1]);
				}
				else
				{
					para_1->indiv_new_1->pst_x[cnt_1] = para_1->indiv_origin_1->pst_x[cnt_1] - tmp_3* para_1->indiv_origin_1->pst_x[cnt_1];
				}

			}
			else  //no mutation
			{
				para_1->indiv_new_1->pst_x[cnt_1] = para_1->indiv_origin_1->pst_x[cnt_1];
			}

			//boundary check
			if ((para_1->indiv_new_1->pst_x[cnt_1] >= para_1->area_x) || (para_1->indiv_new_1->pst_x[cnt_1] <= 0))
			{
				cnt_1--;
				error_processor(32);
			}
		}

		//for y coordinate
		for (cnt_1 = 0; cnt_1 < para_1->amount_airship; cnt_1++)
		{
			//mutation judgement
			tmp_1 = (double)rand() / RAND_MAX;
			if (tmp_1 < para_1->para_mt_pbl)
			{
				//direction judgement
				tmp_2 = (double)rand() / RAND_MAX;
				tmp_3 = ((double)rand() + 0.00001) / (RAND_MAX + 0.0001);
				if (tmp_2 > 0.5)
				{
					para_1->indiv_new_1->pst_y[cnt_1] = para_1->indiv_origin_1->pst_y[cnt_1] + tmp_3*(para_1->area_y - para_1->indiv_origin_1->pst_y[cnt_1]);
				}
				else
				{
					para_1->indiv_new_1->pst_y[cnt_1] = para_1->indiv_origin_1->pst_y[cnt_1] - tmp_3* para_1->indiv_origin_1->pst_y[cnt_1];
				}

			}
			else  //no mutation
			{
				para_1->indiv_new_1->pst_y[cnt_1] = para_1->indiv_origin_1->pst_y[cnt_1];
			}

			//boundary check
			if ((para_1->indiv_new_1->pst_y[cnt_1] >= para_1->area_y) || (para_1->indiv_new_1->pst_y[cnt_1] <= 0))
			{
				cnt_1--;
				error_processor(32);
			}
		}

		//for individual #2
		//for x coordinate
		for (cnt_1 = 0; cnt_1 < para_1->amount_airship; cnt_1++)
		{
			//mutation judgement
			tmp_1 = (double)rand() / RAND_MAX;
			if (tmp_1 < para_1->para_mt_pbl)
			{
				//direction judgement
				tmp_2 = (double)rand() / RAND_MAX;
				tmp_3 = ((double)rand() + 0.00001) / (RAND_MAX + 0.0001);
				if (tmp_2 > 0.5)
				{
					para_1->indiv_new_2->pst_x[cnt_1] = para_1->indiv_origin_2->pst_x[cnt_1] + tmp_3*(para_1->area_x - para_1->indiv_origin_2->pst_x[cnt_1]);
				}
				else
				{
					para_1->indiv_new_2->pst_x[cnt_1] = para_1->indiv_origin_2->pst_x[cnt_1] - tmp_3* para_1->indiv_origin_2->pst_x[cnt_1];
				}

			}
			else  //no mutation
			{
				para_1->indiv_new_2->pst_x[cnt_1] = para_1->indiv_origin_2->pst_x[cnt_1];
			}

			//boundary check
			if ((para_1->indiv_new_2->pst_x[cnt_1] >= para_1->area_x) || (para_1->indiv_new_2->pst_x[cnt_1] <= 0))
			{
				cnt_1--;
				error_processor(32);
			}
		}

		//for y coordinate
		for (cnt_1 = 0; cnt_1 < para_1->amount_airship; cnt_1++)
		{
			//mutation judgement
			tmp_1 = (double)rand() / RAND_MAX;
			if (tmp_1 < para_1->para_mt_pbl)
			{
				//direction judgement
				tmp_2 = (double)rand() / RAND_MAX;
				tmp_3 = ((double)rand() + 0.00001) / (RAND_MAX + 0.0001);
				if (tmp_2 > 0.5)
				{
					para_1->indiv_new_2->pst_y[cnt_1] = para_1->indiv_origin_2->pst_y[cnt_1] + tmp_3*(para_1->area_y - para_1->indiv_origin_2->pst_y[cnt_1]);
				}
				else
				{
					para_1->indiv_new_2->pst_y[cnt_1] = para_1->indiv_origin_2->pst_y[cnt_1] - tmp_3* para_1->indiv_origin_2->pst_y[cnt_1];
				}

			}
			else  //no mutation
			{
				para_1->indiv_new_2->pst_y[cnt_1] = para_1->indiv_origin_2->pst_y[cnt_1];
			}

			//boundary check
			if ((para_1->indiv_new_2->pst_y[cnt_1] >= para_1->area_y) || (para_1->indiv_new_2->pst_y[cnt_1] <= 0))
			{
				cnt_1--;
				error_processor(32);
			}
		}

		//GROUPING AND REPAIRING
		para_3.amount_airship = para_1->amount_airship;
		para_3.area_x = para_1->area_x;
		para_3.area_y = para_1->area_y;
		para_3.dist_a2a = Cfg_opti.dist_a2a;
		para_3.dist_safe = para_1->dist_safe;
		para_3.indiv_1 = para_1->indiv_new_1;
		cnt_1 = grouping(&para_3);
		while (cnt_1 == 11)
		{
			cnt_1 = grouping(&para_3);
		}
		para_3.indiv_1 = para_1->indiv_new_2;
		cnt_1 = grouping(&para_3);
		while (cnt_1 == 11)
		{
			cnt_1 = grouping(&para_3);
		}

		break;
	case 2:

		/*
		ALGORITHM: this is the non-uniform mutation
		*/

		//for individual #1
		//for x coordinate
		for (cnt_1 = 0; cnt_1 < para_1->amount_airship; cnt_1++)
		{
			//mutation judgement
			tmp_1 = (double)rand() / RAND_MAX;
			if (tmp_1 < para_1->para_mt_pbl)
			{
				//direction judgement
				tmp_2 = (double)rand() / RAND_MAX;
				tmp_3 = ((double)rand() + 0.00001) / (RAND_MAX + 0.0001);
				if (tmp_2 > 0.5)
				{
					para_1->indiv_new_1->pst_x[cnt_1] = para_1->indiv_origin_1->pst_x[cnt_1] + tmp_3*(para_1->area_x - para_1->indiv_origin_1->pst_x[cnt_1])*pow((1 - Time_gen / (Cfg_opti.iteration_max + 1)), Cfg_opti.para_nonuniform_beta);
				}
				else
				{
					para_1->indiv_new_1->pst_x[cnt_1] = para_1->indiv_origin_1->pst_x[cnt_1] - tmp_3* para_1->indiv_origin_1->pst_x[cnt_1] * pow((1 - Time_gen / (Cfg_opti.iteration_max + 1)), Cfg_opti.para_nonuniform_beta);
				}

			}
			else  //no mutation
			{
				para_1->indiv_new_1->pst_x[cnt_1] = para_1->indiv_origin_1->pst_x[cnt_1];
			}

			//boundary check
			if ((para_1->indiv_new_1->pst_x[cnt_1] >= para_1->area_x) || (para_1->indiv_new_1->pst_x[cnt_1] <= 0))
			{
				cnt_1--;
				error_processor(33);
			}
		}

		//for y coordinate
		for (cnt_1 = 0; cnt_1 < para_1->amount_airship; cnt_1++)
		{
			//mutation judgement
			tmp_1 = (double)rand() / RAND_MAX;
			if (tmp_1 < para_1->para_mt_pbl)
			{
				//direction judgement
				tmp_2 = (double)rand() / RAND_MAX;
				tmp_3 = ((double)rand() + 0.00001) / (RAND_MAX + 0.0001);
				if (tmp_2 > 0.5)
				{
					para_1->indiv_new_1->pst_y[cnt_1] = para_1->indiv_origin_1->pst_y[cnt_1] + tmp_3*(para_1->area_y - para_1->indiv_origin_1->pst_y[cnt_1])*pow((1 - Time_gen / (Cfg_opti.iteration_max + 1)), Cfg_opti.para_nonuniform_beta);
				}
				else
				{
					para_1->indiv_new_1->pst_y[cnt_1] = para_1->indiv_origin_1->pst_y[cnt_1] - tmp_3* para_1->indiv_origin_1->pst_y[cnt_1] * pow((1 - Time_gen / (Cfg_opti.iteration_max + 1)), Cfg_opti.para_nonuniform_beta);
				}

			}
			else  //no mutation
			{
				para_1->indiv_new_1->pst_y[cnt_1] = para_1->indiv_origin_1->pst_y[cnt_1];
			}

			//boundary check
			if ((para_1->indiv_new_1->pst_y[cnt_1] >= para_1->area_y) || (para_1->indiv_new_1->pst_y[cnt_1] <= 0))
			{
				cnt_1--;
				error_processor(33);
			}
		}

		//for individual #2
		//for x coordinate
		for (cnt_1 = 0; cnt_1 < para_1->amount_airship; cnt_1++)
		{
			//mutation judgement
			tmp_1 = (double)rand() / RAND_MAX;
			if (tmp_1 < para_1->para_mt_pbl)
			{
				//direction judgement
				tmp_2 = (double)rand() / RAND_MAX;
				tmp_3 = ((double)rand() + 0.00001) / (RAND_MAX + 0.0001);
				if (tmp_2 > 0.5)
				{
					para_1->indiv_new_2->pst_x[cnt_1] = para_1->indiv_origin_2->pst_x[cnt_1] + tmp_3*(para_1->area_x - para_1->indiv_origin_2->pst_x[cnt_1])*pow((1 - Time_gen / (Cfg_opti.iteration_max + 1)), Cfg_opti.para_nonuniform_beta);
				}
				else
				{
					para_1->indiv_new_2->pst_x[cnt_1] = para_1->indiv_origin_2->pst_x[cnt_1] - tmp_3* para_1->indiv_origin_2->pst_x[cnt_1] * pow((1 - Time_gen / (Cfg_opti.iteration_max + 1)), Cfg_opti.para_nonuniform_beta);
				}

			}
			else  //no mutation
			{
				para_1->indiv_new_2->pst_x[cnt_1] = para_1->indiv_origin_2->pst_x[cnt_1];
			}

			//boundary check
			if ((para_1->indiv_new_2->pst_x[cnt_1] >= para_1->area_x) || (para_1->indiv_new_2->pst_x[cnt_1] <= 0))
			{
				cnt_1--;
				error_processor(33);
			}
		}

		//for y coordinate
		for (cnt_1 = 0; cnt_1 < para_1->amount_airship; cnt_1++)
		{
			//mutation judgement
			tmp_1 = (double)rand() / RAND_MAX;
			if (tmp_1 < para_1->para_mt_pbl)
			{
				//direction judgement
				tmp_2 = (double)rand() / RAND_MAX;
				tmp_3 = ((double)rand() + 0.00001) / (RAND_MAX + 0.0001);
				if (tmp_2 > 0.5)
				{
					para_1->indiv_new_2->pst_y[cnt_1] = para_1->indiv_origin_2->pst_y[cnt_1] + tmp_3*(para_1->area_y - para_1->indiv_origin_2->pst_y[cnt_1])*pow((1 - Time_gen / (Cfg_opti.iteration_max + 1)), Cfg_opti.para_nonuniform_beta);
				}
				else
				{
					para_1->indiv_new_2->pst_y[cnt_1] = para_1->indiv_origin_2->pst_y[cnt_1] - tmp_3* para_1->indiv_origin_2->pst_y[cnt_1] * pow((1 - Time_gen / (Cfg_opti.iteration_max + 1)), Cfg_opti.para_nonuniform_beta);
				}

			}
			else  //no mutation
			{
				para_1->indiv_new_2->pst_y[cnt_1] = para_1->indiv_origin_2->pst_y[cnt_1];
			}

			//boundary check
			if ((para_1->indiv_new_2->pst_y[cnt_1] >= para_1->area_y) || (para_1->indiv_new_2->pst_y[cnt_1] <= 0))
			{
				cnt_1--;
				error_processor(33);
			}
		}

		//GROUPING AND REPAIRING
		para_3.amount_airship = para_1->amount_airship;
		para_3.area_x = para_1->area_x;
		para_3.area_y = para_1->area_y;
		para_3.dist_a2a = Cfg_opti.dist_a2a;
		para_3.dist_safe = para_1->dist_safe;
		para_3.indiv_1 = para_1->indiv_new_1;
		cnt_1 = grouping(&para_3);
		while (cnt_1 == 11)
		{
			cnt_1 = grouping(&para_3);
		}
		para_3.indiv_1 = para_1->indiv_new_2;
		cnt_1 = grouping(&para_3);
		while (cnt_1 == 11)
		{
			cnt_1 = grouping(&para_3);
		}

		break;
	case 3:

		/*
		ALGORITHM:
		this is the polynominal mutation
		*/

		//#1 individual x dimension
		for (cnt_1 = 0; cnt_1 < para_1->amount_airship; cnt_1++)
		{
			//mutation judgement
			tmp_1 = (double)rand() / RAND_MAX;
			if (tmp_1 < para_1->para_mt_pbl)
			{
				//perform mutation
				tmp_2 = (double)rand() / RAND_MAX;
				//direction judgement
				if (tmp_2 < 0.5)
				{
					tmp_3 = pow(2 * tmp_2, 1 / (Cfg_opti.para_polynominal_yita + 1)) - 1;
				}
				else
				{
					tmp_3 = 1 - pow(2 - 2 * tmp_2, 1 / (Cfg_opti.para_polynominal_yita + 1));
				}

				para_1->indiv_new_1->pst_x[cnt_1] = para_1->indiv_origin_1->pst_x[cnt_1] + tmp_3*para_1->area_x;
			}
			else
			{
				//no mutation
				para_1->indiv_new_1->pst_x[cnt_1] = para_1->indiv_origin_1->pst_x[cnt_1];
			}

			//boundary check
			if ((para_1->indiv_new_1->pst_x[cnt_1] >= para_1->area_x) || (para_1->indiv_new_1->pst_x[cnt_1] <= 0))
			{
				cnt_1--;
				error_processor(33);
			}
		}

		

		//#1 individual y dimension
		for (cnt_1 = 0; cnt_1 < para_1->amount_airship; cnt_1++)
		{
			//mutation judgement
			tmp_1 = (double)rand() / RAND_MAX;
			if (tmp_1 < para_1->para_mt_pbl)
			{
				//perform mutation
				tmp_2 = (double)rand() / RAND_MAX;
				//direction judgement
				if (tmp_2 < 0.5)
				{
					tmp_3 = pow(2 * tmp_2, 1 / (Cfg_opti.para_polynominal_yita + 1)) - 1;
				}
				else
				{
					tmp_3 = 1 - pow(2 - 2 * tmp_2, 1 / (Cfg_opti.para_polynominal_yita + 1));
				}

				para_1->indiv_new_1->pst_y[cnt_1] = para_1->indiv_origin_1->pst_y[cnt_1] + tmp_3*para_1->area_y;
			}
			else
			{
				//no mutation
				para_1->indiv_new_1->pst_y[cnt_1] = para_1->indiv_origin_1->pst_y[cnt_1];
			}

			//boundary check
			if ((para_1->indiv_new_1->pst_y[cnt_1] >= para_1->area_y) || (para_1->indiv_new_1->pst_y[cnt_1] <= 0))
			{
				cnt_1--;
				error_processor(33);
			}
		}

		//#2 individual x dimension
		for (cnt_1 = 0; cnt_1 < para_1->amount_airship; cnt_1++)
		{
			//mutation judgement
			tmp_1 = (double)rand() / RAND_MAX;
			if (tmp_1 < para_1->para_mt_pbl)
			{
				//perform mutation
				tmp_2 = (double)rand() / RAND_MAX;
				//direction judgement
				if (tmp_2 < 0.5)
				{
					tmp_3 = pow(2 * tmp_2, 1 / (Cfg_opti.para_polynominal_yita + 1)) - 1;
				}
				else
				{
					tmp_3 = 1 - pow(2 - 2 * tmp_2, 1 / (Cfg_opti.para_polynominal_yita + 1));
				}

				para_1->indiv_new_2->pst_x[cnt_1] = para_1->indiv_origin_2->pst_x[cnt_1] + tmp_3*para_1->area_x;
			}
			else
			{
				//no mutation
				para_1->indiv_new_2->pst_x[cnt_1] = para_1->indiv_origin_2->pst_x[cnt_1];
			}

			//boundary check
			if ((para_1->indiv_new_2->pst_x[cnt_1] >= para_1->area_x) || (para_1->indiv_new_2->pst_x[cnt_1] <= 0))
			{
				cnt_1--;
				error_processor(33);
			}
		}

		//#2 individual y dimension
		for (cnt_1 = 0; cnt_1 < para_1->amount_airship; cnt_1++)
		{
			//mutation judgement
			tmp_1 = (double)rand() / RAND_MAX;
			if (tmp_1 < para_1->para_mt_pbl)
			{
				//perform mutation
				tmp_2 = (double)rand() / RAND_MAX;
				//direction judgement
				if (tmp_2 < 0.5)
				{
					tmp_3 = pow(2 * tmp_2, 1 / (Cfg_opti.para_polynominal_yita + 1)) - 1;
				}
				else
				{
					tmp_3 = 1 - pow(2 - 2 * tmp_2, 1 / (Cfg_opti.para_polynominal_yita + 1));
				}

				para_1->indiv_new_2->pst_y[cnt_1] = para_1->indiv_origin_2->pst_y[cnt_1] + tmp_3*para_1->area_y;
			}
			else
			{
				//no mutation
				para_1->indiv_new_2->pst_y[cnt_1] = para_1->indiv_origin_2->pst_y[cnt_1];
			}

			//boundary check
			if ((para_1->indiv_new_2->pst_y[cnt_1] >= para_1->area_y) || (para_1->indiv_new_2->pst_y[cnt_1] <= 0))
			{
				cnt_1--;
				error_processor(33);
			}
		}

		//GROUPING AND REPAIRING
		para_3.amount_airship = para_1->amount_airship;
		para_3.area_x = para_1->area_x;
		para_3.area_y = para_1->area_y;
		para_3.dist_a2a = Cfg_opti.dist_a2a;
		para_3.dist_safe = para_1->dist_safe;
		para_3.indiv_1 = para_1->indiv_new_1;
		cnt_1 = grouping(&para_3);
		while (cnt_1 == 11)
		{
			cnt_1 = grouping(&para_3);
		}
		para_3.indiv_1 = para_1->indiv_new_2;
		cnt_1 = grouping(&para_3);
		while (cnt_1 == 11)
		{
			cnt_1 = grouping(&para_3);
		}
		break;
	default:
		break;
	}
}