1
0

select_tool.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. #include "select_tool.h"
  2. #include "ant.h"
  3. #include "card_path.h"
  4. void select_point_object::att_initiate()
  5. {
  6. m_fitk.add_tool(30,5,5);
  7. m_fitk.add_tool(30,5,6);
  8. m_fitk.add_tool(30,10,10);
  9. m_fitk.add_tool(30,10,15);
  10. m_fitk.add_tool(20,5,6);
  11. m_fitk.add_tool(30,4,6);
  12. m_fitk.add_tool(40,4,6);
  13. m_fita.add_tool(15,5,5);
  14. m_begin=m_last=0;
  15. }
  16. loc_point select_point_object::select_solution_impl(const std::vector<point> vp,const std::vector<loc_message>&lm)
  17. {
  18. bool flag=false;
  19. loc_point lp;
  20. if(vp.size()==4)
  21. {
  22. m_d.grow().reset().set_source(lm[0],lm[1]);
  23. flag = true;
  24. }
  25. if(vp.size()==2 && lm[0].m_card_ct - last_ct() == 1)
  26. {
  27. m_d.grow().reset().set_source(lm[0]);
  28. flag = true;
  29. }
  30. if(flag)
  31. {
  32. if(!select_solution(vp,&lm[0].m_sit,lp))
  33. {
  34. m_cur_fit.reset();
  35. return lp;
  36. }
  37. }
  38. m_ct = lm[0].m_card_ct;
  39. return lp;
  40. }
  41. int select_point_object::find_last(int start)
  42. {
  43. for(int i=start,len=m_d.size();i<len;i++)
  44. {
  45. if(m_d(i).cl()>0)
  46. return i;
  47. }
  48. return -1;
  49. }
  50. int select_point_object::find_first(int start)
  51. {
  52. for(int i=start,len=m_d.size();i<len;i++)
  53. {
  54. if(m_d[i].cl()>0)
  55. return i;
  56. }
  57. return -1;
  58. }
  59. bool select_point_object::filter_by_fit(loc_point & c,const std::vector<point> & vp,const double scale)
  60. {
  61. fit_result * fit = get_best_fit();
  62. if(fit==nullptr || m_begin==nullptr || fit->ke>2)
  63. return false;
  64. loc_point &f = *m_begin;
  65. std::array<solpoint,4> v;
  66. int cnt = vp.size();
  67. for(int i=0;i<cnt;i++)
  68. {
  69. v[i].set_sol(vp[i],fabs(fit->testk(c.m_time/1000.,f.dist_direct(vp[i]))));
  70. }
  71. std::sort(&v[0],&v[0]+cnt);
  72. double a = getA(fit,scale,v[1].score()-v[0].score());
  73. if(a<0)
  74. return false;
  75. if(!filter_by_acc(c,v,a))
  76. {
  77. c.set_cl(0);
  78. return true; //false?
  79. }
  80. reset_fit(vp[0].dist(v[0]));
  81. c[0]=v[0];
  82. c[1]=v[1];
  83. return true;
  84. }
  85. bool select_point_object::filter_by_acc(loc_point&c,std::array<solpoint,4>&v,double a)
  86. {
  87. if(!m_last->is_same_site(c))
  88. return true;
  89. double td=m_last->time_off(c);
  90. if(v[0].score()>a*td*td)
  91. return false;
  92. return true;
  93. }
  94. void select_point_object::select_one_ant(loc_point &c,const std::vector<point> & vp)
  95. {
  96. int last=find_last(1);
  97. if(last>0)
  98. {
  99. loc_point&p=m_d(last);
  100. int cnt=vp.size();
  101. std::array<solpoint,4> res;
  102. //find the shortest dis
  103. for(int i=0;i<cnt;i++)
  104. res[i].set_sol(vp[i],vp[i].dist(p[0]));
  105. std::sort(&res[0],&res[0]+cnt);
  106. c[1].set(res[1]);
  107. c[0].set(res[0]);
  108. c.inc_cl(5);
  109. }
  110. }
  111. point select_point_object::select_solution0(std::vector<point> &tvp,const double scale)
  112. {
  113. loc_point&c=m_d(0);
  114. if(m_d.size()==1)
  115. {
  116. //first point ,only accpet two ants good data.
  117. if(c.cl()>0 && tvp.size()<4)
  118. {
  119. c[1]=tvp[1];
  120. return c[0]=tvp[0];
  121. }
  122. m_d.skip(1);
  123. return point(0,0);
  124. }
  125. select_solution1(c,tvp,scale);
  126. return c[0];
  127. }
  128. bool select_point_object::select_solution(const std::vector<point> &vp,const site*sit,loc_point &p)
  129. {
  130. remove_history();
  131. std::vector<point> tvp(vp.begin(),vp.end());
  132. if(vp.size()==4)
  133. {
  134. int c=0;
  135. std::array<solpoint,4> res;
  136. for(int i=0;i<2;i++)
  137. {
  138. int x = i==0?3:2;
  139. double d=vp[i].dist(vp[x]);
  140. if(d<sit->ant_dist()*3)
  141. {
  142. res[c++].set_sol(vp[i].middle(vp[x]),d);
  143. }
  144. else
  145. {
  146. res[c++].set_sol(vp[i]);
  147. res[c++].set_sol(vp[x]);
  148. }
  149. }
  150. std::sort(&res[0],&res[0]+c);
  151. tvp.clear();
  152. for(int i=0;i<c;i++)
  153. tvp.push_back(res[i]);
  154. m_d(0).inc_cl(10);
  155. }
  156. point pt = select_solution0(tvp,sit->m_scale);
  157. m_d(0).set(pt);
  158. if(pt.empty())
  159. return false;
  160. if(!m_d(0).empty())
  161. m_d(0).m_dist=sit->dist_direct(pt);
  162. else
  163. {
  164. m_d(0).set_cl(0);
  165. if(m_last) m_d(0).m_dist=0.01*m_last->m_dist>0?1:-1;
  166. }
  167. //revise_by
  168. //
  169. bool fg=revise_by_history(pt,sit,m_d(0).m_time);
  170. if(!card_path::inst().is_at_path(pt))
  171. {
  172. m_d(0).set_cl(0);
  173. printf("out of path:t=%ld,sit=%d,ct=%d,"
  174. "tof1=%d,tof2=%d,pt=(%f,%f)\n",
  175. m_d(0).m_time, m_d(0).m_sid,m_d(0).m_ct,
  176. m_d(0).m_tof[0], m_d(0).m_tof[1], pt.x, pt.y);
  177. return false;
  178. }
  179. m_last=&m_d(0);
  180. if(m_line.empty() && m_d.size()>=2 && !make_line())
  181. return false;
  182. if(!m_line.contain(m_d(0),0.01) || (m_begin && !m_line.contain(m_begin->m_sol[0], 0.01)))
  183. {
  184. m_fitk.reset_data();
  185. m_fita.reset_data();
  186. m_begin=m_last=nullptr;
  187. int i0=find_last(1);
  188. if(i0==-1)
  189. return false;
  190. std::vector<point> path=card_path::inst().find_path(m_d(i0),m_d(0));
  191. m_d.skip(m_d.size()-i0);
  192. if(path.empty())
  193. {
  194. m_line.clear();
  195. return false;
  196. }
  197. m_line.set(path.back(),m_d(0));
  198. }
  199. if(!m_begin)
  200. {
  201. int idx=find_first(0);
  202. if(idx>=0) m_begin=&m_d[idx];
  203. }
  204. if(!m_last)
  205. {
  206. int idx=find_last(0);
  207. if(idx>=0) m_last=&m_d(idx);
  208. }
  209. if(m_begin && m_d(0).cl())
  210. {
  211. //implemented by li
  212. int lastID1=find_last(1);
  213. int lastID2=-1;
  214. if(lastID1!=-1)
  215. lastID2=find_last(lastID1+1);
  216. if(lastID2!=-1)
  217. {
  218. double t0=m_last->m_time/1000., t1=m_d(lastID1).m_time/1000., t2=m_d(lastID2).m_time/1000.;
  219. double d0=m_begin->loc_dist(*m_last), d1=m_begin->loc_dist(m_d(lastID1)), d2=m_begin->loc_dist(m_d(lastID2));
  220. double k1=(d1-d0)/(t1-t0), k2=(d2-d1)/(t2-t1);
  221. if(t0-t1<5 && t1-t2<5 && fabs(k2-k1)<0.5)
  222. {
  223. double tbegin = t0-3;
  224. while(tbegin<t1+0.5)
  225. tbegin=tbegin+1;
  226. double tk=(d0-d1)/(t0-t1), tb=d1-tk*t1; //d1+(d0-d1)/(t0-t1)*(t-t1)
  227. for(double ti=tbegin;ti<t0;ti=ti+1)
  228. {
  229. m_fitk.add(ti, tk*ti+tb);
  230. }
  231. }
  232. }
  233. if(m_d.size()>1)
  234. {
  235. int pre=find_last(1);
  236. if(pre>0)
  237. {
  238. m_fita.add(m_d(0).m_time/1000.,m_begin->loc_dist(m_d(0))-m_begin->loc_dist(m_d(pre)));
  239. }
  240. }
  241. }
  242. p.set(pt);
  243. save_k();
  244. p.m_useless=fg;
  245. return true;
  246. }
  247. bool select_point_object::make_line()
  248. {
  249. int i0=-1,i1=-1;
  250. if(-1==(i0=find_last(0)))
  251. return false;
  252. if(-1==(i1=find_last(i0+1)))
  253. return false;
  254. m_line.set(m_d(i0),m_d(i1));
  255. return true;
  256. }
  257. void select_point_object::remove_history()
  258. {
  259. loc_point&b=m_d(0);
  260. if(m_d.size()>120 || (m_d.size()>2 && m_d(1).time_off(b)>max_histime))
  261. {
  262. m_d.skip_if([&b,this](loc_point&p){ return p.time_off(b)>max_histime;});
  263. m_fitk.reset_data();
  264. m_fita.reset_data();
  265. m_cur_fit.reset();
  266. m_begin=m_last=nullptr;
  267. int idx=find_first(0);
  268. if(idx<0)
  269. return;
  270. m_begin=&m_d[idx];
  271. idx=find_last(1);
  272. m_last=&m_d(idx);
  273. double dist=0,dist2=0;
  274. for(int len=std::min(15,m_d.size()-1),i=len;i>0;i--)
  275. {
  276. if(!m_d(i).cl())
  277. continue;
  278. int lastID1=find_last(i+1);
  279. int lastID2=-1;
  280. if(lastID1!=-1)
  281. lastID2=find_last(lastID1+1);
  282. if(lastID2!=-1)
  283. {
  284. double t0=m_d(i).m_time/1000., t1=m_d(lastID1).m_time/1000., t2=m_d(lastID2).m_time/1000.;
  285. double d0=m_begin->loc_dist(m_d(i)[0]), d1=m_begin->loc_dist(m_d(lastID1)[0]),
  286. d2=m_begin->loc_dist(m_d(lastID2)[0]);
  287. double k1=(d1-d0)/(t1-t0), k2=(d2-d1)/(t2-t1);
  288. if(t0-t1<5 && t1-t2<5 && fabs(k2-k1)<0.5)
  289. {
  290. double tbegin = t0-3;
  291. while(tbegin<t1+0.5)
  292. tbegin=tbegin+1;
  293. double tk=(d0-d1)/(t0-t1), tb=d1-tk*t1; //d1+(d0-d1)/(t0-t1)*(t-t1)
  294. for(double ti=tbegin;ti<t0;ti=ti+1)
  295. {
  296. m_fitk.add(ti, tk*ti+tb);
  297. }
  298. }
  299. }
  300. dist=m_begin->loc_dist(m_d(i)[0]);
  301. m_fitk.add(m_d(i).m_time/1000.,dist);
  302. if(i==len)
  303. continue;
  304. m_fita.add(m_d(i).m_time/1000.,dist-dist2);
  305. dist2=dist;
  306. }
  307. save_k();
  308. }
  309. }
  310. void select_point_object::save_k()
  311. {
  312. const fit_result*fk=best_fit_raw(0,4);
  313. if(!fk)
  314. {
  315. m_cur_fit.reset();
  316. return;
  317. }
  318. m_cur_fit=*fk;
  319. fit_result&r=m_cur_fit;
  320. card_fit*fa=&m_fita[0];
  321. if(fa->is_valid() && fa->ke<0.1 && fk->k*fa->k<0)
  322. {
  323. double dk=fa->k*fa->num_point;
  324. r.ka=fa->k;
  325. if((fk->k+dk)*fk->k<0)
  326. r.k=0;
  327. else
  328. r.k+=dk;
  329. double y=fk->k*m_fitk(0).x+fk->kb;
  330. r.kb=y-m_fitk(0).x*r.k;
  331. }
  332. }
  333. fit_result* select_point_object::best_fit_raw(int num_point,int start,int last)
  334. {
  335. card_fit*fit=nullptr;
  336. start=std::max(start,0);
  337. last =std::min(last,m_fitk.tool_size());
  338. if(last==-1)
  339. last=m_fitk.tool_size();
  340. for(int i=start;i<last;i++)
  341. {
  342. if(!m_fitk[i].is_valid())
  343. continue;
  344. if(m_fitk[i].num_point<num_point)
  345. continue;
  346. if(fit==nullptr)
  347. {
  348. fit=&m_fitk[i];
  349. continue;
  350. }
  351. if(fit->ke>m_fitk[i].ke)
  352. {
  353. fit=&m_fitk[i];
  354. }
  355. }
  356. return fit;
  357. }
  358. loc_point select_tool_person_1::select_solution(const std::vector<point> vp,const std::vector<loc_message>&lm)
  359. {
  360. loc_point lp;
  361. //select point.
  362. if(lm[0].tool_index() == 0)
  363. {
  364. m_spo = new person_point_filter();
  365. lp=m_spo->select_solution_impl(vp,lm);
  366. }
  367. else if (lm[0].tool_index() == 2)
  368. {
  369. //for now..
  370. m_spo = new person_point_filter();
  371. lp=m_spo->select_solution_impl(vp,lm);
  372. }
  373. else
  374. {}
  375. return lp;
  376. }
  377. loc_point select_tool_car_1::select_solution(const std::vector<point> vp,const std::vector<loc_message>&lm)
  378. {
  379. loc_point lp;
  380. //select point.
  381. if(lm[0].tool_index() == 0)
  382. {
  383. m_spo = new car_point_filter();
  384. lp=m_spo->select_solution_impl(vp,lm);
  385. }
  386. else if (lm[0].tool_index() == 2)
  387. {
  388. //for now..
  389. m_spo = new car_point_filter();
  390. lp=m_spo->select_solution_impl(vp,lm);
  391. }
  392. else
  393. {}
  394. return lp;
  395. }
  396. select_tool_manage * select_tool_manage::instance()
  397. {
  398. static select_tool_manage stm;
  399. return &stm;
  400. }