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; }
int getteamscore(const char *team) { return totalscore(ctfteamflag(team)); }