辨析旅行商問題(TSP)與車輛路徑問題(VRP)

目錄

    • 前言
    • 旅行商問題 (TSP)
      • 問題介紹
      • 數學模型
        • 符號定義
        • 問題輸入
        • 約束條件
        • 目標函數
        • 問題輸出
      • 解的空間
        • 解空間大小計算
        • 解釋
    • 車輛路徑問題 (VRP)
      • 問題介紹
      • TSP到VRP的過渡
      • 數學模型
        • 符號定義
        • 問題輸入
        • 約束條件
        • 優化目標
        • 問題輸出
      • 解空間
        • 特殊情況
        • 一般情況
    • TSP 與 VRP 對比

前言

計劃是通過本文的撰寫,捋清楚TSP和VRP的本質不同。(什么是本質?)

對比TSP(旅行商問題)VRP(車輛路徑問題)
描述給定一個城市列表以及每對城市之間的距離,訪問每個城市一次并返回出發城市的最短路線是什么車隊需要向給定的一組客戶家中取貨,需要遍歷的最佳路線集是什么?
輸入城市數量,距離矩陣城市數量,距離矩陣,任務量,卡車容量
約束每個城市僅訪問一次每個城市僅訪問一次,滿足容量要求
目標最小化總旅行距離最小化總旅行距離
輸出一個旅行商訪問城市的順序多個車輛的行駛路線
空間城市序列: ( n ? 1 ) ! (n-1)! (n?1)!城市序列加上車輛任務分配: n ! < S < P ( n , m ) k n! < S < P(n,m)^k n!<S<P(n,m)k

n = 13 , m = 5 , k = 3 n=13,m=5,k=3 n=13m=5k=3為例,對比解空間:

  • TSP解空間: ( n ? 1 ) ! = ( 13 ? 1 ) ! = 12 ! = 4.79 × 1 0 8 (n-1)! = (13-1)! = 12!=4.79 × 10^8 (n?1)!=(13?1)!=12!=4.79×108
  • VRP解空間:
    • 下限: n ! = 13 ! = 12 ! = 6.23 × 1 0 9 n! = 13! = 12!= 6.23 × 10^9 n!=13!=12!=6.23×109
    • 上限: P ( n , m ) k = P ( 15 , 5 ) 3 = 3.68 × 1 0 15 P(n,m)^k=P(15,5)^3= 3.68 × 10^{15} P(n,m)k=P(15,5)3=3.68×1015

旅行商問題 (TSP)

問題介紹

旅行商問題(英語:Travelling salesman problem, TSP)在1930年被首次提出,是優化領域研究最深入的問題之一。問題的表述是:“給定一個城市列表以及每對城市之間的距離,訪問每個城市一次并返回出發城市的最短路線是什么?”

TSP示意圖
圖片來源:algorist.com

數學模型

符號定義
  • n n n: 城市的數量。
  • c i j c_{ij} cij?: 從城市 i i i 到城市 j j j 的距離或成本。
  • x i j x_{ij} xij?: 決策變量。如果旅行商從城市 i i i 直接前往城市 j j j,則為 1,否則為 0。
問題輸入
  • 城市數量: n n n
  • 距離矩陣: c i j c_{ij} cij?,表示從城市 i i i 到城市 j j j 的距離或成本(對所有 i , j = 1 , 2 , . . . , n i, j = 1, 2, ..., n i,j=1,2,...,n i ≠ j i \neq j i=j)。
約束條件

每個城市只訪問一次:
∑ j = 1 , j ≠ i n x i j = 1 ? i = 1 , 2 , … , n \sum_{j=1, j \neq i}^{n} x_{ij} = 1 \quad \forall i = 1, 2, \ldots, n j=1,j=in?xij?=1?i=1,2,,n
∑ i = 1 , i ≠ j n x i j = 1 ? j = 1 , 2 , … , n \sum_{i=1, i \neq j}^{n} x_{ij} = 1 \quad \forall j = 1, 2, \ldots, n i=1,i=jn?xij?=1?j=1,2,,n

$$
\sum_{j=1, j \neq i}^{n} x_{ij} = 1 \quad \forall i = 1, 2, \ldots, n
$$
$$
\sum_{i=1, i \neq j}^{n} x_{ij} = 1 \quad \forall j = 1, 2, \ldots, n
$$
目標函數

最小化總旅行距離或成本:
min ? ∑ i = 1 n ∑ j = 1 , j ≠ i n c i j x i j \min \sum_{i=1}^{n}\sum_{j=1, j \neq i}^{n} c_{ij} x_{ij} mini=1n?j=1,j=in?cij?xij?

$$
\min \sum_{i=1}^{n}\sum_{j=1, j \neq i}^{n} c_{ij} x_{ij}
$$
問題輸出
  • 訪問城市的順序。

解的空間

旅行商問題的解空間是指所有可能的路徑組合數量。

解空間大小計算
  • 對于 n n n 個城市的 TSP,旅行商從一個城市出發,并有 ( n ? 1 ) (n - 1) (n?1) 個城市可以選擇作為第一站。
  • 在訪問了第一個城市后,剩下 ( n ? 2 ) (n - 2) (n?2) 個城市可以選擇作為下一站,以此類推。
  • 最后,旅行商將從最后一個未訪問的城市返回起始城市。

因此,TSP 的解空間大小為所有可能路徑的數量,計算公式為:

( n ? 1 ) ! (n - 1)! (n?1)!

其中, ( n ? 1 ) ! (n - 1)! (n?1)! 表示 ( n ? 1 ) (n - 1) (n?1) 的階乘,即 1 × 2 × 3 × … × ( n ? 2 ) × ( n ? 1 ) 1 \times 2 \times 3 \times \ldots \times (n - 2) \times (n - 1) 1×2×3××(n?2)×(n?1)

解釋

旅行商可以從任何城市開始,但是不同的起點并不會影響各城市在解中的相對順序。每個路徑都可以通過循環移位變換為從特定城市(比如第一個城市)開始的路徑,所以實際上只需考慮從一個固定城市出發的路徑。

車輛路徑問題 (VRP)

問題介紹

車輛路徑問題(英語:Vehicle Routing Problem,VRP)在1959年被首次提出,是TSP的泛化形式,包含TSP問題。問題描述:車隊需要向給定的一組客戶家中取貨或是送貨,需要遍歷的最佳路線集是什么?
值得一提的是,在1959年被提出時,論文名稱是’The truck dispatching problem’,并沒有使用Vehicle Routing Problem的表述。在隨后十多年的相關研究中,也一直沒有直接使用VRP這一名詞的論文。直到Christofides, N.的論文’The vehicle routing problem’于1976年發表后,后續研究普遍采用了VRP的表述。

TSP到VRP的過渡

我們把TSP問題或一個場景表述為一輛空載的卡車從車庫或是車場(出發城市)出發需要到多位客戶的家中(其它城市)取貨物,待取完所有貨物后需要返回車庫。這里有一個潛在的假定,不管所有客戶家中的貨物累加和究竟有多大,這一輛卡車總能全部納入到自己的車廂中并繼續正常行駛。也就是,車輛的運輸能力 C C C 大于等于所有的貨物量:
C ≥ ∑ i q i C \ge \sum\limits_i {{q_i}} Ci?qi?
其中 q i q_i qi? 表述第 i i i 個客戶家中的貨物量。
但是,當面臨一輛卡車完不成所有的任務量時,也就是:
C < ∑ i q i C < \sum\limits_i {{q_i}} C<i?qi?
就需要多輛車去完成,或者是一輛車多次往返。
按照論文The truck dispatching problem. Management science 6, 80–91 (1959)里面的介紹,把該條件描述為:
C ? ∑ i q i C \ll \sum\limits_i {{q_i}} C?i?qi?
并且,文章提出假定一輛車最多只能訪問 m m m 個點,只有當 m m m 比較大時,有研究意義,否則的話,求解比較容易,如下:

If m m m is small, optimal sets of m m m points may often be determined by inspection of a map which contains the points and the arcs connecting them. One would look for “clusters of points” and determine by trial and error the order in which they should be traversed, taking care that no loop crosses itself. However, when clusters are not present in sufficient numbers or when m m m is large, this procedure becomes inapplicable. In this case near-best solutions may be obtained by the algorithm in this paper.
如果 m m m 很小,最優的 m m m 個點的集合通常可以通過檢查包含這些點和連接它們的弧的地圖來確定。人們會尋找"點的簇集",并通過試驗和錯誤來確定它們應該按照什么順序遍歷,確保沒有回路交叉。然而,當簇集數量不足或者 m m m 很大時,這種方法就不適用了。在這種情況下,可以通過本文中的算法獲得近似最優解。

數學模型

符號定義
  • n n n: 任務點的數量。
  • P i P_i Pi?: 第 i i i 個任務點的位置,( i = 1 , 2 , … , n i=1,2,\ldots,n i=1,2,,n)。
  • [ D ] = [ d i j ] [D]=[d_{ij}] [D]=[dij?]: 任務點間的距離鄰接矩陣,( i , j = 0 , 1 , … , n i,j=0,1,\ldots,n i,j=0,1,,n)。
  • ( Q ) = ( q i ) (Q) = (q_i) (Q)=(qi?): 各任務點的任務量,( i = 1 , 2 , … , n i=1,2,\ldots,n i=1,2,,n)。
  • C C C: 卡車的容量,滿足 C > max ? ( q i ) C > \max(q_i) C>max(qi?)
  • x i j x_{ij} xij?: 決策變量。如果任務點 P i P_i Pi? P j P_j Pj? 被同一輛車輛訪問,則 x i j = x j i = 1 x_{ij} = x_{ji} = 1 xij?=xji?=1;如果不被同一輛車輛訪問,則 x i j = x j i = 0 x_{ij} = x_{ji} = 0 xij?=xji?=0;對于所有 i i i, x i i = 0 x_{ii} = 0 xii?=0
問題輸入
  • 給定 n n n 個任務點的位置 P i P_i Pi?
  • 給定任務點間的距離鄰接矩陣 [ D ] [D] [D]
  • 給定任務點的任務量 ( Q ) (Q) (Q)
  • 給定卡車的容量 $C。
約束條件
  1. 車輛的起點和終點均是車庫 P 0 P_0 P0?
  2. 每個任務點 P i P_i Pi? 除了與車庫 P 0 P_0 P0? 外,最多與另一個任務點 P j P_j Pj? 被同一個車輛訪問一次。對于所有 i = 1 , 2 , … , n i = 1, 2, \ldots, n i=1,2,,n,有 ∑ j = 0 n x i j = 1 \sum_{j = 0}^{n} x_{ij} = 1 j=0n?xij?=1
  3. 每輛車輛在任何時候的載荷不得超過其容量 C C C。對于車輛在訪問任務點 P i P_i Pi? 時的載荷量,滿足以下條件:
    ∑ i = 1 n q i x i j ≤ C ? j = 1 , 2 , … , n \sum_{i=1}^{n} q_i x_{ij} \le C \quad \forall j = 1, 2, \ldots, n i=1n?qi?xij?C?j=1,2,,n
    其中, q i q_i qi? 表示任務點 P i P_i Pi? 的任務量, x i j x_{ij} xij? 表示車輛是否訪問了任務點 P i P_i Pi?
$$\sum_{i=1}^{n} q_i x_{ij} \le C \quad \forall j = 1, 2, \ldots, n$$
優化目標

最小化總行駛距離 D D D
min ? D = ∑ i , j = 0 n d i j x i j \min D = \sum_{i,j=0}^n d_{ij} x_{ij} minD=i,j=0n?dij?xij?

$$\min D = \sum_{i,j=0}^n d_{ij} x_{ij}$$
問題輸出
  • 各車輛的行駛路線。

解空間

在車輛路徑問題(VRP)中,我們考慮除起點和終點外的所有車輛行駛路線。這些路線可以排列成一個由 n n n 個點組成的一維序列 S S S,擁有 n ! n! n! 種可能性。

特殊情況

假設 n n n m m m 的整數倍,且每輛車必須經過 m m m 個點才能返回車庫。此時,序列 S S S 只需平均分配給各車輛,解空間仍為 n ! n! n! 種。

一般情況

如果每輛車經過的點數在 1 到 m m m 之間,解空間的計算變得復雜。

目前尚沒有發現計算精確解空間大小的文獻, AI 也無法給出確切數字,下面是一個粗略的估算方法。

  • 單輛車的最大訪問點數為 m m m,可能的訪問序列數量為排列數 P ( n , m ) P(n,m) P(n,m)
  • 對于 k k k 輛車,考慮所有可能的序列組合。
  • 考慮到車輛間訪問點的重疊,實際解空間小于 P ( n , m ) k P(n,m)^k P(n,m)k

因此,解空間的上限估算為 P ( n , m ) k P(n,m)^k P(n,m)k

TSP 與 VRP 對比

對比條目TSP(旅行商問題)VRP(車輛路徑問題)
問題描述給定一個城市列表以及每對城市之間的距離,訪問每個城市一次并返回出發城市的最短路線是什么車隊需要向給定的一組客戶家中取貨,需要遍歷的最佳路線集是什么?
問題輸入城市數量,距離矩陣城市數量,距離矩陣,任務量,卡車容量
約束條件每個城市僅訪問一次每個城市僅訪問一次,滿足容量要求
優化目標最小化總旅行距離最小化總旅行距離
問題輸出一個旅行商訪問城市的順序多個車輛的行駛路線
求解空間城市序列: ( n ? 1 ) ! (n-1)! (n?1)!城市序列加上車輛任務分配: n ! < S < P ( n , m ) k n! < S < P(n,m)^k n!<S<P(n,m)k

以n=13,m=5,k=3為例

  • TSP解空間: ( n ? 1 ) ! = ( 13 ? 1 ) ! = 12 ! = 4.79 × 1 0 8 (n-1)! = (13-1)! = 12!=4.79 × 10^8 (n?1)!=(13?1)!=12!=4.79×108
  • VRP解空間:
    • 下限: n ! = 13 ! = 12 ! = 6.23 × 1 0 9 n! = 13! = 12!= 6.23 × 10^9 n!=13!=12!=6.23×109
    • 上限: P ( n , m ) k = P ( 15 , 5 ) 3 = 3.68 × 1 0 15 P(n,m)^k=P(15,5)^3= 3.68 × 10^{15} P(n,m)k=P(15,5)3=3.68×1015

  • 理解本質區別了嗎?
    • 啥是本質,還是迷迷糊糊的😶?🌫?,似乎是還差點,又似乎是還差許多💫。下雪了,開心👻
      在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212687.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212687.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212687.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于JavaWeb+SSM+Vue助農扶貧微信小程序系統的設計和實現

基于JavaWebSSMVue助農扶貧微信小程序系統的設計和實現 源碼獲取入口Lun文目錄前言主要技術系統設計功能截圖 源碼獲取入口 Lun文目錄 目 錄 第一章 緒論 1 1.1 研究背景 1 1.2 研究意義 1 1.3 研究內容 2 第二章 開發環境與技術 3 2.1 JSP技術 3 2.2 MySQL數據庫 3 2.3 Java…

基于Solr的全文檢索系統的實現與應用

文章目錄 一、概念1、什么是Solr2、與Lucene的比較區別1&#xff09;Lucene2&#xff09;Solr 二、Solr的安裝與配置1、Solr的下載2、Solr的文件夾結構3、運行環境4、Solr整合tomcat1&#xff09;Solr Home與SolrCore2&#xff09;整合步驟 5、Solr管理后臺1&#xff09;Dashbo…

4-Docker命令之docker commit

1.docker commit介紹 docker commit命令是用于根據docker容器的改變創建一個新的docker鏡像 2.docker commit用法 docker commit [參數] container [repository[:tag]] [rootcentos79 ~]# docker commit --helpUsage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG…

微服務學習:Nacos配置中心

先打開Nacos&#xff08;詳見微服務學習&#xff1a;Nacos微服務架構中的服務注冊、服務發現和動態配置&Nacos下載&#xff09; 1.環境隔離&#xff1a; 新建命名空間&#xff1a; 記住命名空間ID&#xff1a; c82496fb-237f-47f7-91ed-288a53a63324 再配置 就可達成環…

vue3 創建過程中 運行npm create vue@latest 和 npm install卡住不動的解決方法之一

問題&#xff1a;npm create vuelatest、和npm install 不管是電腦cmd上還是vscode終端上都是卡很久或不動&#xff01; 解決&#xff1a; 1、查看npm代理 npm config get registry2、更換npm鏡像 npm config set registryhttps://registry.npmmirror.com這里換成淘寶源好像…

學習 Vue 3 源碼

Vue 3 是一款流行的前端框架&#xff0c;它的數據代理和虛擬 DOM 實現是其核心功能之一 Vue 3 的數據代理 在 Vue 3 中&#xff0c;數據代理是指將組件實例的屬性代理到其內部狀態對象上。這使得開發者可以使用更便捷的方式來訪問和修改組件的狀態。 Vue 3 的數據代理實現主…

docker-centos中基于keepalived+niginx模擬主從熱備完整過程

文章目錄 一、環境準備二、主機1、環境搭建1.1 鏡像拉取1.2 創建網橋1.3 啟動容器1.4 配置鏡像源1.5 下載工具包1.6 下載keepalived1.7 下載nginx 2、配置2.1 配置keepalived2.2 配置nginx2.2.1 查看nginx.conf2.2.2 修改index.html 3、啟動3.1 啟動nginx3.2 啟動keepalived 4、…

【HarmonyOS開發】控件開發過程中,知識點記錄

1、問題記錄及解決方案 1.1 資源&#xff08;Icon&i18n&#xff09;問題 控件&#xff1a;只有一個JS文件&#xff0c;不會將任何資源型文件&#xff08;圖片、字體、默認文字等&#xff09;打包到SO中。因此&#xff0c;當我們開發控件時&#xff0c;需要將需要使用到的資…

【機器學習】042_遷移學習

一、概述、定義 目的&#xff1a; 遷移學習的目的是將某個領域或任務上學習到的模式、知識應用到不同但相關的領域里&#xff0c;獲取更多數據&#xff0c;而不必投入許多時間人力來進行數據的標注。 舉例&#xff1a; 已經會下中國象棋&#xff0c;就可以類比著來學習國際…

Java單元測試:JUnit和Mockito的使用指南

引言&#xff1a; 在軟件開發過程中&#xff0c;單元測試是一項非常重要的工作。通過單元測試&#xff0c;我們可以驗證代碼的正確性、穩定性和可維護性&#xff0c;幫助我們提高代碼質量和開發效率。本文將介紹Java中兩個常用的單元測試框架&#xff1a;JUnit和Mockito&#x…

Navicat連接Oracle數據庫

Navicat連接Oracle數據庫 打開服務里面找到Oracle服務 OracleServerXE或者OracleServerTTL 創建數據庫連接 連接名默認自己起 主機選擇本地 端口默認 服務名在服務中可以找到輸入后綴 用戶名默認都是system 密碼是創建oracle時候填寫的口令 點擊測試連接即可

Spring Boot中的事務是如何實現的?懂嗎?

SpringBoot中的事務管理&#xff0c;用得好&#xff0c;能確保數據的一致性和完整性&#xff1b;用得不好&#xff0c;可能會給性能帶來不小的影響哦。 基本使用 在SpringBoot中&#xff0c;事務的使用非常簡潔。首先&#xff0c;得感謝Spring框架提供的Transactional注解&am…

【金融數據分析】計算滬深300指數行業權重分布并用餅圖展示

前言 前面的文章我們已經介紹了如何獲取滬深300成分股所述行業以及權重的數據&#xff0c;想要了解這部分內容的小伙伴可以閱讀上一篇文章 springbootjdbcTemplatesqlite編程示例——以滬深300成分股數據處理為例-CSDN博客 那么有了上文獲取的數據&#xff0c;我們實際上可以…

【rabbitMQ】rabbitMQ控制臺模擬收發消息

目錄 1.新建隊列 2.交換機綁定隊列 3.查看消息是否到達隊列 總結&#xff1a; 1.新建隊列 2.交換機綁定隊列 點擊amq.fonout 3.查看消息是否到達隊列 總結&#xff1a; 生產者&#xff08;publisher&#xff09;發送消息&#xff0c;先到達交換機&#xff0c;再到隊列&…

微信小程序uni-app:常用Form表單組件使用示例

目錄 input 輸入框picker 選擇器 input 輸入框 https://developers.weixin.qq.com/miniprogram/dev/component/input.htmlhttps://uniapp.dcloud.net.cn/component/input.html <inputclass"input-class"type"text"v-model"value"placeholde…

Linux下文本三劍客:grep、awk、sed之對比

一、grep 主要用于搜索某些字符串&#xff1b;sed、awk 用于處理文本&#xff1a; grep基本是以行為單位處理文本的&#xff1b; 而awk可以做更細分的處理&#xff0c;通過指定分隔符將一行&#xff08;一條記錄&#xff09;劃分為多個字段&#xff0c;以字段為單位處理文本。…

python輸出菱形字符圖案 附實戰代碼

下面是一個Python程序&#xff0c;可以用來輸出菱形字符圖案。這個程序使用了兩個嵌套的for循環&#xff0c;以及字符串連接操作。 # 獲取用戶輸入 n int(input("請輸入菱形的邊長&#xff1a;"))# 生成上半部分菱形 for i in range(1, n 1, 2):print(" &quo…

SDK,但未在應用內的隱私政策/在AppGallery Connect上提交的隱私政策內容中進行明示,不符合華為應用市場審核標準。

&#xff08;暫時用不到的也建議收藏一下&#xff0c;因為文章持續更新中&#xff09; 最新更改時間&#xff1a;20023-12-10 第三方SDK合集列表 為了確保用戶個人信息的安全&#xff0c;我們對使用到的第三方提供的軟件開發包&#xff08;SDK&#xff09;進行了嚴格的安全檢…

期末速成數據庫極簡版【存儲過程】(5)

目錄 【7】系統存儲過程 【8】用戶存儲過程——帶輸出參數的存儲過程 創建存儲過程 存儲過程調用 【9】用戶存儲過程——不帶輸出參數的存儲過程 【7】系統存儲過程 系統存儲我們就不做過程講解用戶存儲過程會考察一道大題&#xff0c;所以我們把重點放在用戶存儲過程。…

vscode 編寫爬蟲爬取王者榮耀壁紙

網上關于爬蟲大部分教程和編輯器用的都不是vscode &#xff0c;此教程用到了vscode、Python、bs4、requests。 vscode配置Python安裝環境可以看看這個大佬的教程 03-vscode安裝和配置_嗶哩嗶哩_bilibili vscode配置爬蟲環境可以參考這個大佬的教程【用Vscode實現簡單的python…