main.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "instance.h"
  2. using namespace std;
  3. int next(instance &ins) {
  4. int best = -1;
  5. for(int i = 0; i < ins.orders.size(); i++) {
  6. if(!ins.orders[i].ord.empty()) {
  7. best = i;
  8. break;
  9. }
  10. }
  11. return best;
  12. }
  13. void glouton(instance &ins) {
  14. vector<int> drone_temps(ins.drones);
  15. vector<pos> drone_pos;
  16. int score = 0;
  17. for(int i = 0; i < ins.drones; i++)
  18. drone_pos.push_back(ins.wh[0].p);
  19. while(true) {
  20. int next_i = next(ins);
  21. if(next_i < 0)
  22. break;
  23. int drone = rand()%ins.drones;
  24. order &ord = ins.orders[next_i];
  25. assert(!ord.ord.empty());
  26. pair<const int, int> &type = *ord.ord.begin();
  27. int quantity = min(type.second, ins.max_load/ins.weights[type.first]);
  28. int wa = ins.find(drone_pos[drone], type.first, quantity);
  29. quantity = min(quantity, ins.wh[wa].disp[type.first]);
  30. ins.wh[wa].disp[type.first] -= quantity;
  31. // decrease order / stock
  32. type.second -= quantity;
  33. if(!type.second)
  34. ord.ord.erase(type.first);
  35. // augment drone_temps
  36. drone_temps[drone] += 1+ceil(sqrt(drone_pos[drone].dist2(ins.wh[wa].p)));
  37. drone_temps[drone] += 1+ceil(sqrt(ins.wh[wa].p.dist2(ord.p)));
  38. drone_pos[drone] = ord.p;
  39. if(drone_temps[drone] > ins.T)
  40. break;
  41. // pass order
  42. cout << drone << " L " << wa << " " << type.first << " " << quantity << endl;
  43. cout << drone << " D " << next_i << " " << type.first << " " << quantity << endl;
  44. score += ceil(100.*(ins.T-drone_temps[drone])/ins.T);
  45. }
  46. cerr << "Score : " << score << endl;
  47. }
  48. int main() {
  49. int seed = time(NULL);
  50. srand(seed);
  51. cerr << "seed : " << seed << endl;
  52. instance ins;
  53. glouton(ins);
  54. return 0;
  55. }