粒子群演算法求解物流配送路線問題(python)

Logintern09發表於2020-02-17

粒子群演算法求解物流配送路線問題(python)

1.查詢論文文獻

找一篇物流配送路徑優化+粒子群演算法求解的論文

參考文獻:基於混沌粒子群演算法的物流配送路徑優化

2.瞭解粒子群演算法的原理

講解通俗易懂,有數學例項的博文:https://blog.csdn.net/daaikuaichuan/article/details/81382794
在這裡插入圖片描述

3.確定編碼方式和解碼策略

3.1編碼方式

物流配送路線的粒子編碼方式:
在這裡插入圖片描述

3.2解碼策略

例如 , 假如一個有 7個客戶點, 3臺車輛的物流配送問題 ,
其第 i 個粒子的位置向量 z如表 1所示
在這裡插入圖片描述
在這裡插入圖片描述

4.算例的輸入引數

在這裡插入圖片描述

5.處理關鍵技術

5.1將不可行解轉化為可行解

在迭代過程中形成的粒子可能是不滿足數學模型約束條件的不可行解,要將進化生成的不可行解轉變為可行解。

def get_feasible_x(x):
    # 修正粒子為滿足約束的可行解粒子
    vehicle_element = np.rint(x[:demand_node_num])  # 取整數表示哪輛車拜訪哪個客戶點
    for index in range(len(vehicle_element)):
    	# x_bound = [[1, vehicle_num], [1, demand_node_num]]  # 自變數的上下限限制
        if vehicle_element[index] < x_bound[0][0]:
            vehicle_element[index] = x_bound[0][0]
        elif vehicle_element[index] > x_bound[0][1]:
            vehicle_element[index] = x_bound[0][1]
    x[:demand_node_num] = vehicle_element
    return x

判斷生成的粒子是否滿足車輛最大行駛里程數限制和車輛最大裝載量約束限制,若不滿足上述的兩個條件的其一,則隨機生成新的粒子直到滿足所有的約束條件。

def get_feasible_solution(x):
    """
    # 判斷是否滿足車輛最大行駛里程數限制和車輛最大載重量限制,若原粒子不滿足條件則生成滿足約束條件的可行解
    :param x: x為一個粒子
    :return:
    """
    x = get_feasible_x(x)
    length, total_path_list = calculate_fitness(x)
    result_list = []
    for i in range(len(total_path_list)):
        path_list = total_path_list[i]
        path_length = 0
        for j in range(len(path_list)-1):
            segment = [path_list[j], path_list[j+1]]
            path_length += distance_graph[segment[0], segment[1]]
        if path_length > length_max:
            new_x = set_codeForm(1)[0]
            result_list.append(False)
        else:
            # 候選解滿足車輛行駛最大里程數要求,再判斷車輛的實際裝載量是否在最大裝載量範圍內
            path_list = total_path_list[i][1:-1]
            capacity = sum([quantity_graph[j-1] for j in path_list])
            if capacity > capacity_max:
                new_x = set_codeForm(1)[0]
                result_list.append(False)
            else:
                result_list.append(True)
    if False not in result_list:
        return x, length, total_path_list
    else:
        return get_feasible_solution(new_x)

5.2根據解碼規則計算適應度函式值

優化物流配送路徑問題的粒子群編碼方式類似於遺傳演算法的雙層整數編碼方式,第一層片段上面的數字表示客戶點由哪輛車來進行配送,第二層利用數字的大小來確定車輛拜訪各個由它服務的客戶點的次序。
該算例的適應度函式值為車輛的總行駛里程數最小。

def calculate_fitness(x):
    """
    # 計算適應度函式
    :param x: x為一個粒子
    :return:
    """
    # x = [[1.6,1.3,2.9,2.5,3.4,3.5,1.3,2,3,1,2,2,1,1]]
    total_path_list = []
    vehicle_element = x[:demand_node_num]
    path_element = x[demand_node_num:]
    actual_vehicle = list(set(vehicle_element))
    for j in range(len(actual_vehicle)):
        # customer_list表示第j輛車負責配送的客戶位置索引列表
        customer_list = np.where(vehicle_element == actual_vehicle[j])
        path_list = path_element[customer_list]
        path_list = [customer_list[0][customer_index] for customer_index in np.argsort(path_list)]
        path_list = [element + 1 for element in path_list]
        path_list.insert(0, 0)
        path_list.append(0)
        # path_list表示第j輛車訪問各個客戶節點的拜訪順序
        total_path_list.append(path_list)
    # 0-3-1-2-0
    total_length = 0
    for path in total_path_list:
        for index in range(len(path)-1):
            segment = [path[index], path[index+1]]
            total_length += distance_graph[segment[0]][segment[1]]
    return total_length, total_path_list

6.算例結果

執行python3程式,執行環境為win64,pycharm2019.3.2,在某一次執行中得到的算例結果如下:

全域性最優解結構為: [1. 1. 1. 2. 1. 2. 2. 1. 4. 7. 6. 6. 6. 4. 4. 6.]
最優路線長度為: 67.5
最優車輛執行路線為: [[0, 1, 3, 5, 8, 2, 0], [0, 6, 7, 4, 0]],表示車輛1的配送方案為:0-1-3-5-8-2-0(從配送中心0出發依次訪問客戶點1、客戶點3、客戶點5、客戶點8和客戶點2);車輛2的配送方案為:0-6-7-4-0。
在這裡插入圖片描述
參考文獻:
Matlab實現粒子群演算法的程式程式碼:https://www.cnblogs.com/kexinxin/p/9858664.html
matlab程式碼求解函式最優值:https://blog.csdn.net/zyqblog/article/details/80829043

numpy模組中矩陣和陣列的區別:https://www.cnblogs.com/wj-1314/p/10244807.html
random模組的常用方法:https://www.cnblogs.com/liangmingshen/p/8909376.html
numpy模組入門級用法介紹:
https://www.jianshu.com/p/3e566f09a0cf
matplotlib模組簡單使用技巧:https://www.cnblogs.com/bainianminguo/p/10952586.html
PYTHON 畫圖神器 Matplotlib:https://www.jianshu.com/p/c41ac57cea33

相關文章