main.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. // compute score
  45. score += ceil(10.*(ins.T-drone_temps[drone])/ins.T);
  46. }
  47. cerr << "Score : " << score << endl;
  48. }
  49. int main() {
  50. int seed = time(NULL);
  51. srand(seed);
  52. cerr << "seed : " << seed << endl;
  53. instance ins;
  54. glouton(ins);
  55. return 0;
  56. }