知识点
旅行商问题的线性规划模型
旅行商问题的+Leapms模型及CPLEX求解
C++调用+Leapms
旅行商问题
旅行商问题是一个重要的NP-难问题。一个旅行商人目前在城市1,他必须对其余n-1个城市访问且仅访问一次而后回到城市1,请规
划其最短的循环路线。
旅行商问题的建模
设城市i,j之间的距离为D[i][j],又设0-1变量x[i][j]表示从城市i到城市j的道路是否在循环路线上。于是旅行商问题的目标可以被写成:
min sum{i=1,...,n;j=1,...,n;i<>j}(D[i][j] x[i][j])
因每个城市必须被访问一次且仅被访问一次,于是对每个城市需要进入一次且仅一次,而且出去一次且仅一次,于是有以下两个约束:
sum{i=1,...,n;i<>j} x[i][j] = 1 | j=2,...,n
sum{j=1,...,n;i<>j} x[i][j] = 1 | i=2,...,n
仅采用以上约束时,结果会形成多个不联通的循环。为防止这种情况,为每个城市规定一个访问循序的编号u[i]变量。u[i]=k表示该城市是第k个被访问的城市。规定u[0]=1,任意u[i]<=n-1。显然如果x[i][j]=1,即道路 i,j 被选定在循环路径中,则u[j]>=u[i]+1。用以下约束表达这个逻辑:
u[j]>=u[i]+1-n(1-x[i][j])|i=1,...,n;j=2,...,n;i<>j
上式中,如果x[i][j]=1, 则等价于u[j]>=u[i]+1。如果x[i][j]=0,则右端小于等于0,恒小于等于左端,相当于该约束不存在。
旅行商问题的Leapms模型
使用Cd表示城市的地理坐标,则问题的Leapms模型为
//The Traveling Salesman Problem
min sum{i=1,...,n;j=1,...,n;i<>j} x[i][j] D[i][j]
subject to
sum{i=1,...,n;i<>j} x[i][j] = 1