Beispiel #1
0
void managescore(Student *stu)    //学生成绩管理
{
int type;
	do
	{
	printf("\n请输入序号选择相应功能\n");
	printf("******** 1.计算学生总分 ********\n");
	printf("******** 2.根据总分排名 ********\n");
	printf("******** 3.补考人员信息 ********\n");
	printf("******** 0.退出         ********\n");
		scanf("%d",&type);
	    switch(type)
		{
		case 0:printf("");break;
		case 1:totalscore(stu);break;
		case 2:ranktotal(stu);break;
		case 3:bukaomain(stu);break;
		default:printf("没有该选项,请重输");break;
		}
	}while(type!=0);
}
int main(int argc, char *argv[])
{

	srand(1);
	cout.precision(10);

	//-------------------- program parameters ---------------------------
	// 10 parameters required
	if(argc != 10)
	{
		cerr << "need 10 parameters" << endl;
		cerr << "santa.x datadir start_file_name BETA cool_speed lon_width lat_width stopping_cond save_file_name N_THREADS" << endl;
		return 0;
	}

	string datadir = string(argv[1]); // data directory

	// read input solution
	trips = load_data(datadir + string(argv[2]));
	for(auto &t:trips) t.update_info();
	cout << "total trips " << trips.size() << endl;
	double ss = totalscore(trips);
	cout << "initial score: " << ss << endl;
	int N = trips.size();

	// initial temperature and cooling rate
	BETA = atof(argv[3]);                  //annealing starting beta = 1/T (temperature)
	double cooling_speed = atof(argv[4]);  //annealing cooling speed

	// local search range limitation
	longitude_difference_threshold = atof(argv[5]);
	latitude_difference_threshold = atof(argv[6]);

	// stopping condition: stop when number of performed moves in the last iteration is less than a given value (stopping_suc)
	int stopping_suc = atoi(argv[7]);
	bool sep = false;

	//--------------------------------------------------------------------

	//initialize the random generator
	for(int i = 0; i < 32; i++) rs[i] = rand();
	
	prob[1] = prob[2] = prob[3] = 1;
	NMB_THREADS = atoi(argv[9]);
	assert(NMB_THREADS <= 16);    //don't use too many cores or else wasted


	double goodresult = min(1.240e13, ss) - 1e7;
	time_t start = time(NULL);
	vector<int> suc(prob.size(), 0);

	// Simulated Annealing procedure
	int nmbIters = 5000000;
	for(int i = 1; i < nmbIters; i++)
	{
		assert(trips.size() < MAXTRIP);          //mtx array size limit
		for(auto &t:trips) t.update_range();
		int Npair = set_working_pairs(trip_pairs, trips, sep, longitude_difference_threshold);

		// do it in parallel
		vector<thread> jobs(NMB_THREADS);
		for(int l = 0; l < NMB_THREADS; l++) jobs[l] = thread(parallel_job, &suc, l);
		for(int l = 0; l < NMB_THREADS; l++) jobs[l].join();

		if(i % 10 == 0)
		{
			for(auto &t:trips){ t.update_info(); }
			//recalculate auxiliary variables to avoid accumulated errors
			//remove empty trips
			int b = trips.size();
			trips.erase(remove_if(trips.begin(),trips.end(), [](Trip &t){return t.size()<=2;}), trips.end());
			int e = trips.size();
			if(b != e) cout << " empty trips removed : " << b - e << endl;

			double cutscore = selfupdateCut(trips, 0);

			time_t now = time(NULL);
			cout << " - Estimated time remaining: " << log(2000/BETA) / log(cooling_speed) * difftime(now,start)/i/3600.0 << " hours" << endl;
		}
		
		if(i % 2 == 0)
		{
			ss = totalscore(trips);
			cout << i << " :";
			for(auto x:suc) cout << x << ' ';
			cout << shift11_count << ' ';
			shift11_count = 0;
			cout << " score: " << ss << endl;
			if(ss < goodresult)
			{
				cout << "save at beta = " << BETA << endl;
				save_result(trips,datadir + to_string(int(ss/1e7))+".csv");
				goodresult = ss - 1e7;
			}

			if(suc[0] < stopping_suc)break;
			for(int k = 0; k < suc.size(); k++) suc[k] = 0;
		}

		BETA *= cooling_speed;

	}


	//end

	time_t end = time(NULL);
	cout << "time: " << difftime(end,start) << " seconds" << endl;

	double ss2 = totalscore(trips,true);
	cout << "check true total score " << ss2 << ' ' << ss2 - ss << endl;
	int count = 0;
	for(auto &trip:trips) if(trip.size() > 3) count++;
	cout << "total trips remained" << count << endl;

	save_result(trips,datadir+string(argv[8]));
	return 0;
}
Beispiel #3
0
 int getteamscore(const char *team)
 {
     return totalscore(ctfteamflag(team));
 }