main.cpp 2.1 KB

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