Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 

444 řádky
19 KiB

  1. <?php
  2. /**
  3. * User: heyk
  4. * Date: 2016/11/2
  5. * Time: 13:30
  6. * 组合线路车辆调度算法
  7. **/
  8. class dispatchAlgorithm
  9. {
  10. /**得到产品信息
  11. * @param $type
  12. * @return array
  13. */
  14. function get_pro_info($type)
  15. {
  16. $pdo = conn();
  17. $sql = "SELECT
  18. order_date,
  19. saleman,
  20. channel,
  21. product,
  22. phone_no,
  23. hotel,
  24. ticket_num,
  25. type
  26. FROM
  27. base_xiaohe";
  28. $result = $pdo->query($sql);
  29. $order_info = $result->fetchAll(PDO::FETCH_ASSOC);
  30. $pro_info = array();
  31. foreach ($order_info as $k => $v) {
  32. if ($v['product'] == 'A+B' || $v['product'] == 'A+E' || $v['product'] == 'A+E+B(两日)') {
  33. $product = 'A+B|A+E|A+E+B(两日)';
  34. } elseif ($v['product'] == 'B+C' || $v['product'] == 'B+E') {
  35. $product = 'B+C|B+E';
  36. } elseif ($v['product'] == 'E+A(两)' || $v['product'] == 'E+B(两)' || $v['product'] == 'E') {
  37. $product = 'E|E+A(两)|E+B(两)';
  38. } else {
  39. $product = $v['product'];
  40. }
  41. if (!isset($pro_info[$v['order_date']][$v['type']][$product])) {
  42. $pro_info[$v['order_date']][$v['type']][$product]['product_name'] = $v['product'];
  43. }
  44. if (!isset($pro_info[$v['order_date']][$v['type']][$product]['hotel_list'][$v['hotel']])) {
  45. $pro_info[$v['order_date']][$v['type']][$product]['hotel_list'][$v['hotel']]['hotel_name'] = $v['hotel'];
  46. }
  47. $pro_info[$v['order_date']][$v['type']][$product]['hotel_list'][$v['hotel']]['order_list'][$k]['order_number'] = $k;
  48. $pro_info[$v['order_date']][$v['type']][$product]['hotel_list'][$v['hotel']]['order_list'][$k]['passenger_number'] = $v['ticket_num'];
  49. $pro_info[$v['order_date']][$v['type']][$product]['hotel_list'][$v['hotel']]['order_list'][$k]['superior_hotel'] = $v['hotel'];
  50. $pro_info[$v['order_date']][$v['type']][$product]['hotel_list'][$v['hotel']]['order_list'][$k]['superior_product'] = $v['product'] . "(" . $v['type'] . ")";
  51. }
  52. ksort($pro_info);
  53. if ($type == 'date_line_hotel_order') {
  54. $res = $this->get_date_line_hotel_order($pro_info);
  55. }
  56. return $res;
  57. }
  58. //获取产品详情
  59. function get_date_line_hotel_order($pro_info)
  60. {
  61. $date_line_hotel_order = array();
  62. foreach ($pro_info as $date_key => $date_info1) {
  63. $date_key = substr($date_key, 2);
  64. foreach ($date_info1 as $k1 => $date_info) {
  65. foreach ($date_info as $pro_key => $hotel_info) {
  66. foreach ($hotel_info['hotel_list'] as $k => $v) {
  67. $hotel_info['hotel_list'][$k]['order_list'] = array_values($v['order_list']);
  68. }
  69. $hotel_info['hotel_list'] = array_values($hotel_info['hotel_list']);
  70. $date_line_hotel_order[$date_key][$k1][$pro_key] = $hotel_info;
  71. }
  72. }
  73. }
  74. return $date_line_hotel_order;
  75. }
  76. /**转换临时订单池数据形态函数
  77. * @param $temp_order_pool
  78. * @return array
  79. */
  80. function change_data_type($temp_order_pool)
  81. {
  82. $how = array();
  83. for ($i = 0; $i < count($temp_order_pool); $i++) {
  84. if (array_key_exists($temp_order_pool[$i]["passenger_number"], $how)) {
  85. $how[$temp_order_pool[$i]["passenger_number"]] = $how[$temp_order_pool[$i]["passenger_number"]] + 1;
  86. } else {
  87. $how[$temp_order_pool[$i]["passenger_number"]] = 1;
  88. }
  89. }
  90. $orders = array();
  91. $ii = 1;
  92. foreach ($how as $k => $v) {
  93. $temp = array();
  94. $temp["order_passenger_number"] = $k;
  95. $temp["order_quantity"] = $v;
  96. $orders[$ii] = $temp;
  97. $ii++;
  98. }
  99. return $orders;
  100. }
  101. /**得到派车路径
  102. * @param $orders
  103. * @param $bus_seat_number
  104. * @return array
  105. */
  106. function dp($orders, $bus_seat_number)
  107. {
  108. $answer = array();
  109. $DP = array();
  110. $path = array();
  111. for ($i = 1; $i < (count($orders) + 1); $i++) {
  112. for ($j = 1; $j <= $bus_seat_number; $j++) {
  113. for ($k = 0; $k <= $orders[$i]["order_quantity"]; $k++) {
  114. if ($j >= $k * $orders[$i]["order_passenger_number"]) {
  115. if (isset($DP[$i - 1][$j - $k * $orders[$i]["order_passenger_number"]])) {
  116. } else {
  117. $DP[$i - 1][$j - $k * $orders[$i]["order_passenger_number"]] = 0;
  118. }
  119. $cur = $DP[$i - 1][$j - $k * $orders[$i]["order_passenger_number"]]
  120. + $k * $orders[$i]["order_passenger_number"];
  121. if (!isset($DP[$i][$j])) {
  122. $DP[$i][$j] = 0;
  123. }
  124. if (!($DP[$i][$j] > $cur)) {
  125. $DP[$i][$j] = $cur;
  126. if (!isset($path[$i - 1][$j - $k * $orders[$i]["order_passenger_number"]])) {
  127. $path[$i][$j] = $k . "*" . $orders[$i]["order_passenger_number"];
  128. } else {
  129. $path[$i][$j] = $path[$i - 1][$j - $k * $orders[$i]["order_passenger_number"]] . "-" . $k . "*"
  130. . $orders[$i]["order_passenger_number"];
  131. }
  132. }
  133. } else {
  134. break;
  135. }
  136. }
  137. }
  138. }
  139. $answer["can_seat_number"] = $DP[count($orders)][$bus_seat_number];
  140. $answer["how_seat"] = $path[count($orders)][$bus_seat_number];
  141. $answer["achieved_attendance"] = number_format(($answer["can_seat_number"] * 1.0) / ($bus_seat_number * 1.0), 3);
  142. return $answer;
  143. }
  144. /**更新临时订单池和黑池子
  145. * @param $answer
  146. * @param $temp_order_pool
  147. * @param $black_order_pool
  148. * @return array
  149. */
  150. function path_to_update_temp_and_black_pool($answer, $temp_order_pool, $black_order_pool)
  151. {
  152. $pool_answer = array();
  153. $how_update = $answer["how_seat"];
  154. $how_update = trim($how_update);
  155. if (!(strpos($how_update, "-") === false)) {
  156. $temp_string = explode("-", $how_update);
  157. for ($i = 0; $i < count($temp_string); $i++) {
  158. $temp_temp_string = explode("*", $temp_string[$i]);
  159. $number = $temp_temp_string[0];
  160. $people = $temp_temp_string[1];
  161. while ($number != 0) {
  162. for ($ii = 0; $ii < count($temp_order_pool); $ii++) {
  163. if ($temp_order_pool[$ii]["passenger_number"] == $people) {
  164. $black_order_pool[] = $temp_order_pool[$ii];
  165. array_splice($temp_order_pool, $ii, 1);
  166. $number--;
  167. if ($number == 0) {
  168. break;
  169. }
  170. }
  171. }
  172. }
  173. }
  174. } else {
  175. $temp_temp_temp_string = explode("*", $how_update);
  176. $number1 = $temp_temp_temp_string[0];
  177. $people1 = $temp_temp_temp_string[1];
  178. while ($number1 != 0) {
  179. for ($ii = 0; $ii < count($temp_order_pool); $ii++) {
  180. if ($temp_order_pool[$ii]["passenger_number"] == $people1) {
  181. $black_order_pool[] = $temp_order_pool[$ii];
  182. array_splice($temp_order_pool, $ii, 1);
  183. $number1--;
  184. if ($number1 == 0) {
  185. break;
  186. }
  187. }
  188. }
  189. }
  190. }
  191. $pool_answer["temp_order_pool"] = $temp_order_pool;
  192. $pool_answer["black_order_pool"] = $black_order_pool;
  193. return $pool_answer;
  194. }
  195. /**传入DP_anwser,临时订单池,汽车库存
  196. * @param $answer
  197. * @param $temp_order_pool
  198. * @param $bus_stock
  199. * @return array
  200. */
  201. function path_to_update_temp_order_and_aboard($answer, $temp_order_pool, $bus_stock)
  202. {
  203. $bus_and_pool_answer = array();
  204. $bus = array();
  205. $bus["hotel_form"] = array();
  206. $bus["product_form"] = array();
  207. $bus["bus_seat_number"] = $bus_stock["0"];
  208. array_splice($bus_stock, 0, 1);
  209. $bus["Attendance"] = $answer["achieved_attendance"];
  210. $bus["already_seat_number"] = $answer["can_seat_number"];
  211. $bus["left_seat_number"] = $bus["bus_seat_number"] - $bus["already_seat_number"];
  212. $how_update = $answer["how_seat"];
  213. $how_update = trim($how_update);
  214. if (!(strpos($how_update, "-") === false)) {
  215. $temp_string = explode("-", $how_update);
  216. for ($i = 0; $i < count($temp_string); $i++) {
  217. $temp_temp_string = explode("*", $temp_string[$i]);
  218. $number = $temp_temp_string[0];
  219. $people = $temp_temp_string[1];
  220. while ($number != 0) {
  221. for ($ii = 0; $ii < count($temp_order_pool); $ii++) {
  222. if ($temp_order_pool[$ii]["passenger_number"] == $people) {
  223. $bus["order_list"][] = $temp_order_pool[$ii];
  224. if (array_key_exists($temp_order_pool[$ii]["superior_hotel"], $bus["hotel_form"])) {
  225. $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] + 1;
  226. } else {
  227. $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = 1;
  228. }
  229. if (array_key_exists($temp_order_pool[$ii]["superior_product"], $bus["product_form"])) {
  230. $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] + 1;
  231. } else {
  232. $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = 1;
  233. }
  234. array_splice($temp_order_pool, $ii, 1);
  235. $number--;
  236. if ($number == 0) {
  237. break;
  238. }
  239. }
  240. }
  241. }
  242. }
  243. } else {
  244. $temp_temp_temp_string = explode("*", $how_update);
  245. $number1 = $temp_temp_temp_string[0];
  246. $people1 = $temp_temp_temp_string[1];
  247. while ($number1 != 0) {
  248. for ($ii = 0; $ii < count($temp_order_pool); $ii++) {
  249. if ($temp_order_pool[$ii]["passenger_number"] == $people1) {
  250. $bus["order_list"][] = $temp_order_pool[$ii];
  251. if (array_key_exists($temp_order_pool[$ii]["superior_hotel"], $bus["hotel_form"])) {
  252. $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] + 1;
  253. } else {
  254. $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = 1;
  255. }
  256. if (array_key_exists($temp_order_pool[$ii]["superior_product"], $bus["product_form"])) {
  257. $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] + 1;
  258. } else {
  259. $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = 1;
  260. }
  261. array_splice($temp_order_pool, $ii, 1);
  262. $number1--;
  263. if ($number1 == 0) {
  264. break;
  265. }
  266. }
  267. }
  268. }
  269. }
  270. $bus_and_pool_answer["bus"] = $bus;
  271. $bus_and_pool_answer["temp_order_pool"] = $temp_order_pool;
  272. $bus_and_pool_answer["bus_stock"] = $bus_stock;
  273. return $bus_and_pool_answer;
  274. }
  275. /**传入Dp_answer temp_order_pool bus_stock bus_seat_number
  276. * @param $answer
  277. * @param $temp_order_pool
  278. * @param $bus_stock
  279. * @param $bus_seat_number
  280. * @return array
  281. */
  282. function path_to_update_mix_order_and_aboard($answer, $temp_order_pool, $bus_stock, $bus_seat_number)
  283. {
  284. $bus_and_pool_answer = array();//返回类型Deal_with_bus_and_pool_answer
  285. $bus = array();
  286. $bus["hotel_form"] = array();
  287. $bus["product_form"] = array();
  288. $bus["bus_seat_number"] = $bus_seat_number;
  289. $bus["already_seat_number"] = $answer["can_seat_number"];
  290. $bus["Attendance"] = $answer["achieved_attendance"];
  291. $bus["left_seat_number"] = $bus["bus_seat_number"] - $bus["already_seat_number"];
  292. for ($temp_i1 = 0; $temp_i1 < count($bus_stock); $temp_i1++) {
  293. if ($bus_stock[$temp_i1] == $bus_seat_number) {
  294. array_splice($bus_stock, $temp_i1, 1);
  295. break;
  296. }
  297. }
  298. $how_update = $answer["how_seat"];
  299. $how_update = trim($how_update);
  300. if (!(strpos($how_update, "-") === false)) {
  301. $temp_string = explode("-", $how_update);
  302. for ($i = 0; $i < count($temp_string); $i++) {
  303. $temp_temp_string = explode("*", $temp_string[$i]);
  304. $number = $temp_temp_string[0];
  305. $people = $temp_temp_string[1];
  306. while ($number != 0) {
  307. for ($ii = 0; $ii < count($temp_order_pool); $ii++) {
  308. if ($temp_order_pool[$ii]["passenger_number"] == $people) {
  309. $bus["order_list"][] = $temp_order_pool[$ii];// 订单加入车辆
  310. if (array_key_exists($temp_order_pool[$ii]["superior_hotel"], $bus["hotel_form"])) {
  311. $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] + 1;
  312. } else {
  313. $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = 1;
  314. }
  315. if (array_key_exists($temp_order_pool[$ii]["superior_product"], $bus["product_form"])) {
  316. $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] + 1;
  317. } else {
  318. $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = 1;
  319. }
  320. array_splice($temp_order_pool, $ii, 1);
  321. $number--;
  322. if ($number == 0) {
  323. break;
  324. }
  325. }
  326. }
  327. }
  328. }
  329. } else {
  330. $temp_temp_temp_string = explode("*", $how_update);
  331. $number1 = $temp_temp_temp_string[0];
  332. $people1 = $temp_temp_temp_string[1];
  333. while ($number1 != 0) {
  334. for ($ii = 0; $ii < count($temp_order_pool); $ii++) {
  335. if ($temp_order_pool[$ii]["passenger_number"] == $people1) {
  336. $bus["order_list"][] = $temp_order_pool[$ii];
  337. if (array_key_exists($temp_order_pool[$ii]["superior_hotel"], $bus["hotel_form"])) {
  338. $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] + 1;
  339. } else {
  340. $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = 1;
  341. }
  342. if (array_key_exists($temp_order_pool[$ii]["superior_product"], $bus["product_form"])) {
  343. $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] + 1;
  344. } else {
  345. $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = 1;
  346. }
  347. array_splice($temp_order_pool, $ii, 1);
  348. $number1--;
  349. if ($number1 == 0) {
  350. break;
  351. }
  352. }
  353. }
  354. }
  355. }
  356. $bus_and_pool_answer["bus"] = $bus;
  357. $bus_and_pool_answer["temp_order_pool"] = $temp_order_pool;
  358. $bus_and_pool_answer["bus_stock"] = $bus_stock;
  359. return $bus_and_pool_answer;
  360. }
  361. /**计算pool里面订单人数
  362. * @param $pool
  363. * @return int
  364. */
  365. function pool_count_people_number($pool)
  366. {
  367. $all_people = 0;
  368. for ($i = 0; $i < count($pool); $i++) {
  369. $all_people = $all_people + $pool[$i]["passenger_number"];
  370. }
  371. return $all_people;
  372. }
  373. /**混合函数
  374. * @param $a_black_order_pool
  375. * @param $b_black_order_pool
  376. * @return array
  377. */
  378. function merge_black_pool($a_black_order_pool, $b_black_order_pool)
  379. {
  380. $all_black_pool = array();
  381. for ($i = 0; $i < count($a_black_order_pool); $i++) {
  382. $all_black_pool[] = $a_black_order_pool[$i];
  383. }
  384. for ($i = 0; $i < count($b_black_order_pool); $i++) {
  385. $all_black_pool[] = $b_black_order_pool[$i];
  386. }
  387. return $all_black_pool;
  388. }
  389. /**改变订单池订单数据结构
  390. * @param $bus_stock
  391. * @param $Min_bus_seat_number
  392. * @return array
  393. */
  394. function bus_stock_change_style($bus_stock, $Min_bus_seat_number)
  395. {
  396. $temp_answer = array();
  397. $final_bus_answer = array();
  398. for ($i = 0; $i < count($bus_stock); $i++) {
  399. if (!($bus_stock[$i] < $Min_bus_seat_number)) {
  400. if (array_key_exists($bus_stock[$i], $temp_answer)) {
  401. $temp_answer[$bus_stock[$i]] = $temp_answer[$bus_stock[$i]] + 1;
  402. } else {
  403. $temp_answer[$bus_stock[$i]] = 1;
  404. }
  405. } else {
  406. break;
  407. }
  408. }
  409. foreach ($temp_answer as $k => $v) {
  410. $temp_change = array();
  411. $temp_change["bus_quantity"] = $v;
  412. $temp_change["bus_seat_number"] = $k;
  413. $final_bus_answer[] = $temp_change;
  414. }
  415. for ($i = 0; $i < count($final_bus_answer); $i++) {
  416. for ($j = 0; $j < count($final_bus_answer); $j++) {
  417. if ($final_bus_answer[$i]["bus_seat_number"] > $final_bus_answer[$j]["bus_seat_number"]) {
  418. $temp = $final_bus_answer[$i]["bus_seat_number"];
  419. $final_bus_answer[$i]["bus_seat_number"] = $final_bus_answer[$j]["bus_seat_number"];
  420. $final_bus_answer[$j]["bus_seat_number"] = $temp;
  421. }
  422. }
  423. }
  424. return $final_bus_answer;
  425. }
  426. }