粒子群演算法求解物流配送路線問題(python)
粒子群演算法求解物流配送路線問題(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
相關文章
- 粒子群演算法求解帶約束最佳化問題 原始碼實現演算法原始碼
- 遺傳演算法求解TSP問題(python版)演算法Python
- python+gurobi求解排班問題Python
- matlab求解線性規劃問題Matlab
- 分治演算法-求解棋盤覆蓋問題演算法
- 機器學習演算法(6)用Python實現用核支援向量機求解非線性問題機器學習演算法Python
- 利用遺傳學演算法求解工作分配問題演算法
- 分治法求解問題
- Python求解錯,不知道哪裡有問題。。。Python
- 非線性最小二乘問題的求解方法
- [經典演算法]海盜分金問題sql求解(貪心演算法)演算法SQL
- Python之粒子群演算法(含程式碼例項)Python演算法
- 基於免疫演算法的TSP問題求解matlab模擬演算法Matlab
- 粒子群演算法(主要針對連續型函式最佳化問題)演算法函式
- 基於PSO粒子群最佳化的車間排程問題求解matlab模擬,輸出甘特圖Matlab
- 演算法——路徑問題演算法
- 蟻群演算法java實現以及TSP問題蟻群演算法求解演算法Java
- 樹遞迴問題的求解遞迴
- NP難問題求解綜述
- 03 迴歸演算法 - 線性迴歸求解 θ(最小二乘求解)演算法
- DPLL 演算法(求解k-SAT問題)詳解(C++實現)演算法C++
- 問一個 python 演算法題Python演算法
- c++求解李白喝酒問題C++
- 遞迴求解漢諾塔問題遞迴
- Python求解線性規劃——PuLP使用教程PythonPulp
- PARL原始碼走讀——使用策略梯度演算法求解迷宮尋寶問題原始碼梯度演算法
- 一個“一筆畫”問題的求解器
- python中的路徑問題彙總Python
- 粒子群優化演算法對BP神經網路優化 Matlab實現優化演算法神經網路Matlab
- 粒子群演算法和遺傳演算法的比較演算法
- 使用合適的維度拆分來求解問題
- 求解救:使用 docker 啟動 jenkins 遇到的問題。DockerJenkins
- 一道簡單的分配演算法題,求解演算法
- 蒙特卡洛模擬(3)————求解有約束的非線性規劃問題
- 目標函式存在累加的非線性優化問題的求解思路zzzzzzzzzzzzzzzzzzzz(1)函式優化
- [提問交流]OneThink學習日記(更有很多問題求解答!)
- 帶約束條件的運籌規劃問題求解(模擬退火演算法實現)演算法
- 【演算法工程師】Python面試問題總結演算法工程師Python面試