|
- <?php
-
- /**
- * User: heyk
- * Date: 2016/11/2
- * Time: 13:30
- * 组合线路车辆调度算法
- **/
- class dispatchAlgorithm
- {
- /**得到产品信息
- * @param $type
- * @return array
- */
- function get_pro_info($type)
- {
- $pdo = conn();
- $sql = "SELECT
- order_date,
- saleman,
- channel,
- product,
- phone_no,
- hotel,
- ticket_num,
- type
- FROM
- base_xiaohe";
- $result = $pdo->query($sql);
- $order_info = $result->fetchAll(PDO::FETCH_ASSOC);
- $pro_info = array();
- foreach ($order_info as $k => $v) {
- if ($v['product'] == 'A+B' || $v['product'] == 'A+E' || $v['product'] == 'A+E+B(两日)') {
- $product = 'A+B|A+E|A+E+B(两日)';
- } elseif ($v['product'] == 'B+C' || $v['product'] == 'B+E') {
- $product = 'B+C|B+E';
- } elseif ($v['product'] == 'E+A(两)' || $v['product'] == 'E+B(两)' || $v['product'] == 'E') {
- $product = 'E|E+A(两)|E+B(两)';
- } else {
- $product = $v['product'];
- }
- if (!isset($pro_info[$v['order_date']][$v['type']][$product])) {
- $pro_info[$v['order_date']][$v['type']][$product]['product_name'] = $v['product'];
- }
- if (!isset($pro_info[$v['order_date']][$v['type']][$product]['hotel_list'][$v['hotel']])) {
- $pro_info[$v['order_date']][$v['type']][$product]['hotel_list'][$v['hotel']]['hotel_name'] = $v['hotel'];
- }
-
- $pro_info[$v['order_date']][$v['type']][$product]['hotel_list'][$v['hotel']]['order_list'][$k]['order_number'] = $k;
- $pro_info[$v['order_date']][$v['type']][$product]['hotel_list'][$v['hotel']]['order_list'][$k]['passenger_number'] = $v['ticket_num'];
- $pro_info[$v['order_date']][$v['type']][$product]['hotel_list'][$v['hotel']]['order_list'][$k]['superior_hotel'] = $v['hotel'];
- $pro_info[$v['order_date']][$v['type']][$product]['hotel_list'][$v['hotel']]['order_list'][$k]['superior_product'] = $v['product'] . "(" . $v['type'] . ")";
- }
- ksort($pro_info);
- if ($type == 'date_line_hotel_order') {
- $res = $this->get_date_line_hotel_order($pro_info);
- }
- return $res;
-
- }
-
- //获取产品详情
- function get_date_line_hotel_order($pro_info)
- {
- $date_line_hotel_order = array();
- foreach ($pro_info as $date_key => $date_info1) {
- $date_key = substr($date_key, 2);
- foreach ($date_info1 as $k1 => $date_info) {
- foreach ($date_info as $pro_key => $hotel_info) {
- foreach ($hotel_info['hotel_list'] as $k => $v) {
- $hotel_info['hotel_list'][$k]['order_list'] = array_values($v['order_list']);
- }
- $hotel_info['hotel_list'] = array_values($hotel_info['hotel_list']);
- $date_line_hotel_order[$date_key][$k1][$pro_key] = $hotel_info;
- }
- }
-
- }
- return $date_line_hotel_order;
- }
-
- /**转换临时订单池数据形态函数
- * @param $temp_order_pool
- * @return array
- */
- function change_data_type($temp_order_pool)
- {
-
- $how = array();
- for ($i = 0; $i < count($temp_order_pool); $i++) {
- if (array_key_exists($temp_order_pool[$i]["passenger_number"], $how)) {
- $how[$temp_order_pool[$i]["passenger_number"]] = $how[$temp_order_pool[$i]["passenger_number"]] + 1;
- } else {
- $how[$temp_order_pool[$i]["passenger_number"]] = 1;
- }
- }
- $orders = array();
- $ii = 1;
- foreach ($how as $k => $v) {
- $temp = array();
- $temp["order_passenger_number"] = $k;
- $temp["order_quantity"] = $v;
- $orders[$ii] = $temp;
- $ii++;
- }
- return $orders;
- }
-
- /**得到派车路径
- * @param $orders
- * @param $bus_seat_number
- * @return array
- */
- function dp($orders, $bus_seat_number)
- {
- $answer = array();
- $DP = array();
- $path = array();
- for ($i = 1; $i < (count($orders) + 1); $i++) {
- for ($j = 1; $j <= $bus_seat_number; $j++) {
- for ($k = 0; $k <= $orders[$i]["order_quantity"]; $k++) {
- if ($j >= $k * $orders[$i]["order_passenger_number"]) {
- if (isset($DP[$i - 1][$j - $k * $orders[$i]["order_passenger_number"]])) {
- } else {
- $DP[$i - 1][$j - $k * $orders[$i]["order_passenger_number"]] = 0;
- }
- $cur = $DP[$i - 1][$j - $k * $orders[$i]["order_passenger_number"]]
- + $k * $orders[$i]["order_passenger_number"];
- if (!isset($DP[$i][$j])) {
- $DP[$i][$j] = 0;
- }
- if (!($DP[$i][$j] > $cur)) {
- $DP[$i][$j] = $cur;
- if (!isset($path[$i - 1][$j - $k * $orders[$i]["order_passenger_number"]])) {
- $path[$i][$j] = $k . "*" . $orders[$i]["order_passenger_number"];
- } else {
- $path[$i][$j] = $path[$i - 1][$j - $k * $orders[$i]["order_passenger_number"]] . "-" . $k . "*"
- . $orders[$i]["order_passenger_number"];
- }
- }
- } else {
- break;
- }
- }
- }
- }
- $answer["can_seat_number"] = $DP[count($orders)][$bus_seat_number];
- $answer["how_seat"] = $path[count($orders)][$bus_seat_number];
- $answer["achieved_attendance"] = number_format(($answer["can_seat_number"] * 1.0) / ($bus_seat_number * 1.0), 3);
- return $answer;
- }
-
- /**更新临时订单池和黑池子
- * @param $answer
- * @param $temp_order_pool
- * @param $black_order_pool
- * @return array
- */
- function path_to_update_temp_and_black_pool($answer, $temp_order_pool, $black_order_pool)
- {
-
- $pool_answer = array();
- $how_update = $answer["how_seat"];
- $how_update = trim($how_update);
- if (!(strpos($how_update, "-") === false)) {
- $temp_string = explode("-", $how_update);
- for ($i = 0; $i < count($temp_string); $i++) {
- $temp_temp_string = explode("*", $temp_string[$i]);
- $number = $temp_temp_string[0];
- $people = $temp_temp_string[1];
- while ($number != 0) {
- for ($ii = 0; $ii < count($temp_order_pool); $ii++) {
- if ($temp_order_pool[$ii]["passenger_number"] == $people) {
- $black_order_pool[] = $temp_order_pool[$ii];
- array_splice($temp_order_pool, $ii, 1);
- $number--;
- if ($number == 0) {
- break;
- }
- }
- }
- }
- }
- } else {
- $temp_temp_temp_string = explode("*", $how_update);
- $number1 = $temp_temp_temp_string[0];
- $people1 = $temp_temp_temp_string[1];
- while ($number1 != 0) {
- for ($ii = 0; $ii < count($temp_order_pool); $ii++) {
- if ($temp_order_pool[$ii]["passenger_number"] == $people1) {
- $black_order_pool[] = $temp_order_pool[$ii];
- array_splice($temp_order_pool, $ii, 1);
- $number1--;
- if ($number1 == 0) {
- break;
- }
- }
- }
- }
- }
- $pool_answer["temp_order_pool"] = $temp_order_pool;
- $pool_answer["black_order_pool"] = $black_order_pool;
- return $pool_answer;
- }
-
- /**传入DP_anwser,临时订单池,汽车库存
- * @param $answer
- * @param $temp_order_pool
- * @param $bus_stock
- * @return array
- */
- function path_to_update_temp_order_and_aboard($answer, $temp_order_pool, $bus_stock)
- {
- $bus_and_pool_answer = array();
- $bus = array();
- $bus["hotel_form"] = array();
- $bus["product_form"] = array();
- $bus["bus_seat_number"] = $bus_stock["0"];
- array_splice($bus_stock, 0, 1);
- $bus["Attendance"] = $answer["achieved_attendance"];
- $bus["already_seat_number"] = $answer["can_seat_number"];
- $bus["left_seat_number"] = $bus["bus_seat_number"] - $bus["already_seat_number"];
- $how_update = $answer["how_seat"];
- $how_update = trim($how_update);
- if (!(strpos($how_update, "-") === false)) {
- $temp_string = explode("-", $how_update);
- for ($i = 0; $i < count($temp_string); $i++) {
- $temp_temp_string = explode("*", $temp_string[$i]);
- $number = $temp_temp_string[0];
- $people = $temp_temp_string[1];
- while ($number != 0) {
- for ($ii = 0; $ii < count($temp_order_pool); $ii++) {
- if ($temp_order_pool[$ii]["passenger_number"] == $people) {
- $bus["order_list"][] = $temp_order_pool[$ii];
- if (array_key_exists($temp_order_pool[$ii]["superior_hotel"], $bus["hotel_form"])) {
- $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] + 1;
- } else {
- $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = 1;
- }
- if (array_key_exists($temp_order_pool[$ii]["superior_product"], $bus["product_form"])) {
- $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] + 1;
- } else {
- $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = 1;
- }
- array_splice($temp_order_pool, $ii, 1);
- $number--;
- if ($number == 0) {
- break;
- }
- }
- }
- }
- }
- } else {
-
- $temp_temp_temp_string = explode("*", $how_update);
- $number1 = $temp_temp_temp_string[0];
- $people1 = $temp_temp_temp_string[1];
- while ($number1 != 0) {
- for ($ii = 0; $ii < count($temp_order_pool); $ii++) {
- if ($temp_order_pool[$ii]["passenger_number"] == $people1) {
- $bus["order_list"][] = $temp_order_pool[$ii];
- if (array_key_exists($temp_order_pool[$ii]["superior_hotel"], $bus["hotel_form"])) {
- $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] + 1;
- } else {
- $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = 1;
- }
- if (array_key_exists($temp_order_pool[$ii]["superior_product"], $bus["product_form"])) {
- $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] + 1;
- } else {
- $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = 1;
- }
- array_splice($temp_order_pool, $ii, 1);
- $number1--;
- if ($number1 == 0) {
- break;
- }
- }
- }
- }
- }
- $bus_and_pool_answer["bus"] = $bus;
- $bus_and_pool_answer["temp_order_pool"] = $temp_order_pool;
- $bus_and_pool_answer["bus_stock"] = $bus_stock;
- return $bus_and_pool_answer;
- }
-
- /**传入Dp_answer temp_order_pool bus_stock bus_seat_number
- * @param $answer
- * @param $temp_order_pool
- * @param $bus_stock
- * @param $bus_seat_number
- * @return array
- */
- function path_to_update_mix_order_and_aboard($answer, $temp_order_pool, $bus_stock, $bus_seat_number)
- {
- $bus_and_pool_answer = array();//返回类型Deal_with_bus_and_pool_answer
- $bus = array();
- $bus["hotel_form"] = array();
- $bus["product_form"] = array();
- $bus["bus_seat_number"] = $bus_seat_number;
- $bus["already_seat_number"] = $answer["can_seat_number"];
- $bus["Attendance"] = $answer["achieved_attendance"];
- $bus["left_seat_number"] = $bus["bus_seat_number"] - $bus["already_seat_number"];
- for ($temp_i1 = 0; $temp_i1 < count($bus_stock); $temp_i1++) {
- if ($bus_stock[$temp_i1] == $bus_seat_number) {
- array_splice($bus_stock, $temp_i1, 1);
- break;
- }
- }
- $how_update = $answer["how_seat"];
- $how_update = trim($how_update);
- if (!(strpos($how_update, "-") === false)) {
- $temp_string = explode("-", $how_update);
- for ($i = 0; $i < count($temp_string); $i++) {
- $temp_temp_string = explode("*", $temp_string[$i]);
- $number = $temp_temp_string[0];
- $people = $temp_temp_string[1];
- while ($number != 0) {
- for ($ii = 0; $ii < count($temp_order_pool); $ii++) {
- if ($temp_order_pool[$ii]["passenger_number"] == $people) {
- $bus["order_list"][] = $temp_order_pool[$ii];// 订单加入车辆
- if (array_key_exists($temp_order_pool[$ii]["superior_hotel"], $bus["hotel_form"])) {
- $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] + 1;
- } else {
- $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = 1;
- }
- if (array_key_exists($temp_order_pool[$ii]["superior_product"], $bus["product_form"])) {
- $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] + 1;
- } else {
- $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = 1;
- }
- array_splice($temp_order_pool, $ii, 1);
- $number--;
- if ($number == 0) {
- break;
- }
- }
- }
- }
- }
- } else {
- $temp_temp_temp_string = explode("*", $how_update);
- $number1 = $temp_temp_temp_string[0];
- $people1 = $temp_temp_temp_string[1];
- while ($number1 != 0) {
- for ($ii = 0; $ii < count($temp_order_pool); $ii++) {
- if ($temp_order_pool[$ii]["passenger_number"] == $people1) {
- $bus["order_list"][] = $temp_order_pool[$ii];
- if (array_key_exists($temp_order_pool[$ii]["superior_hotel"], $bus["hotel_form"])) {
- $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] + 1;
- } else {
- $bus["hotel_form"][$temp_order_pool[$ii]["superior_hotel"]] = 1;
- }
- if (array_key_exists($temp_order_pool[$ii]["superior_product"], $bus["product_form"])) {
- $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] + 1;
- } else {
- $bus["product_form"][$temp_order_pool[$ii]["superior_product"]] = 1;
- }
- array_splice($temp_order_pool, $ii, 1);
- $number1--;
- if ($number1 == 0) {
- break;
- }
- }
- }
- }
- }
- $bus_and_pool_answer["bus"] = $bus;
- $bus_and_pool_answer["temp_order_pool"] = $temp_order_pool;
- $bus_and_pool_answer["bus_stock"] = $bus_stock;
- return $bus_and_pool_answer;
- }
-
- /**计算pool里面订单人数
- * @param $pool
- * @return int
- */
- function pool_count_people_number($pool)
- {
-
- $all_people = 0;
- for ($i = 0; $i < count($pool); $i++) {
- $all_people = $all_people + $pool[$i]["passenger_number"];
- }
- return $all_people;
- }
-
- /**混合函数
- * @param $a_black_order_pool
- * @param $b_black_order_pool
- * @return array
- */
- function merge_black_pool($a_black_order_pool, $b_black_order_pool)
- {
- $all_black_pool = array();
- for ($i = 0; $i < count($a_black_order_pool); $i++) {
- $all_black_pool[] = $a_black_order_pool[$i];
- }
- for ($i = 0; $i < count($b_black_order_pool); $i++) {
- $all_black_pool[] = $b_black_order_pool[$i];
- }
- return $all_black_pool;
- }
-
- /**改变订单池订单数据结构
- * @param $bus_stock
- * @param $Min_bus_seat_number
- * @return array
- */
- function bus_stock_change_style($bus_stock, $Min_bus_seat_number)
- {
- $temp_answer = array();
- $final_bus_answer = array();
- for ($i = 0; $i < count($bus_stock); $i++) {
- if (!($bus_stock[$i] < $Min_bus_seat_number)) {
- if (array_key_exists($bus_stock[$i], $temp_answer)) {
- $temp_answer[$bus_stock[$i]] = $temp_answer[$bus_stock[$i]] + 1;
- } else {
- $temp_answer[$bus_stock[$i]] = 1;
- }
- } else {
- break;
- }
- }
- foreach ($temp_answer as $k => $v) {
- $temp_change = array();
- $temp_change["bus_quantity"] = $v;
- $temp_change["bus_seat_number"] = $k;
- $final_bus_answer[] = $temp_change;
- }
- for ($i = 0; $i < count($final_bus_answer); $i++) {
- for ($j = 0; $j < count($final_bus_answer); $j++) {
- if ($final_bus_answer[$i]["bus_seat_number"] > $final_bus_answer[$j]["bus_seat_number"]) {
- $temp = $final_bus_answer[$i]["bus_seat_number"];
- $final_bus_answer[$i]["bus_seat_number"] = $final_bus_answer[$j]["bus_seat_number"];
- $final_bus_answer[$j]["bus_seat_number"] = $temp;
- }
- }
- }
- return $final_bus_answer;
- }
-
- }
|