entity.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import numpy as np
  2. import random
  3. import pickle
  4. import os
  5. # 司机
  6. class Driver():
  7. def __init__(self,id,x,y,time = 1,is_busy = False):
  8. self.id = id
  9. self.x = x
  10. self.y = y
  11. self.atime = time
  12. self.is_busy = is_busy
  13. # 订单
  14. class Order():
  15. def __init__(self,id,x,y,to_x,to_y,order_time):
  16. self.id = id
  17. self.x = x
  18. self.y = y
  19. self.to_x = to_x
  20. self.to_y = to_y
  21. # time range: 1 ~ 144
  22. self.order_time = order_time
  23. self.travel_distance = (abs(self.to_x - self.x) + abs(self.to_y - self.y) ) * random.uniform(0.93,1.08)
  24. self.travel_time = int(self.travel_distance / 5 + random.randint(0,1))
  25. if self.travel_time==0:
  26. self.travel_time = 1
  27. self.arrive_time = self.order_time + self.travel_time
  28. self.arrive_time = self.arrive_time if self.arrive_time<=144 else self.arrive_time-144
  29. if 0<order_time<34 or 84<order_time<110 or order_time>137:
  30. self.order_money = (15 + (max(self.travel_distance,8)-8) * 2.3 ) * random.uniform(0.96,1.15)
  31. else:
  32. self.order_money = (12 + (max(self.travel_distance,8)-8) * 1.8 ) * random.uniform(0.90,1.10)
  33. # 配对
  34. # cancel_prob = 0.20
  35. cancel_prob = 0
  36. class Match():
  37. def __init__(self,order,driver,get_value = False,is_cancel = False):
  38. self.order = order
  39. self.driver = driver
  40. if random.random() < cancel_prob:
  41. is_cancel = True
  42. if is_cancel:
  43. self.order.order_money = 0
  44. self.order.to_x = self.driver.x
  45. self.order.to_y = self.driver.y
  46. self.order.arrive_time = self.order.order_time + 1 if self.order.order_time<144 else 1
  47. self.order.travel_time = 1
  48. self.distance = abs(order.x - driver.x) + abs(order.y - driver.y)
  49. self.arrive_time = self.order.arrive_time + int(self.distance / 5)
  50. self.travel_time = self.arrive_time - self.order.order_time
  51. self.arrive_time = self.arrive_time if self.arrive_time <= 144 else self.arrive_time - 144
  52. # if 0<order.order_time<34 or 84<order.order_time<110 or order.order_time>137:
  53. # self.order_money = (15 + (max(self.travel_distance,8)-8) * 2.3 ) * random.uniform(0.96,1.15)
  54. # else:
  55. # self.order_money = (12 + (max(self.travel_distance,8)-8) * 1.8 ) * random.uniform(0.90,1.10)
  56. self.money = order.order_money
  57. self.is_cancel = is_cancel
  58. self.value = -1
  59. if get_value:
  60. self.value = self.compute_value()
  61. def compute_value(self):
  62. r = (self.money / self.travel_time) * sum([gamma ** i for i in range(self.travel_time)])
  63. value = predict(s=(self.driver.x, self.driver.y),
  64. s_=(self.order.to_x, self.order.to_y),
  65. t=self.order.order_time,
  66. t_=self.arrive_time,
  67. r=r,
  68. detal_t=self.travel_time
  69. )
  70. return value
  71. def save(object_to_save, path):
  72. with open(path, 'wb') as f:
  73. pickle.dump(object_to_save, f)
  74. def load(path):
  75. with open(path, 'rb') as f:
  76. object1 = pickle.load(f)
  77. return object1
  78. gamma = 0.9
  79. # q_label_path = os.path.dirname(__file__)+"/didi_RL/RL_q_label02.pkl"
  80. q_label_path = os.path.dirname(__file__)+"/didi_RL/RL_q_label03.pkl"
  81. q_label = load(q_label_path)
  82. def predict(s,s_,t,t_,r,detal_t):
  83. now_s = q_label[t-1].get(s)
  84. if now_s:
  85. q_now = now_s[1]
  86. else:
  87. q_now = 0
  88. next_s = q_label[t_-1].get(s_)
  89. if next_s:
  90. q_next = next_s[1]
  91. else:
  92. q_next = 0
  93. V = gamma ** detal_t * q_next - q_now + r
  94. return V