
You can download Gurobi solver
from
https://www.gurobi.com/academia/academic-program-and-licenses/
.
(* Step 1: Register for an academic license on the Gurobi website and install the Gurobi engine. *) (* Step 2: Append the Gurobi license path if needed *) AppendTo[$Path, "your full path to the gurobi.lic directory"] (* Step 3: Restart Mathematica before continuing *) (* Generate test data: random 2D points *) {pts, dist, n} = {#, DistanceMatrix[#], Length[#]} &@RandomReal[{0, 100}, {40, 2}]; (* Define decision variables *) {xVars, uVars} = { Flatten@Table[x[i, j], {i, n}, {j, n}] // DeleteCases[x[i_, i_]], Table[u[i], {i, 2, n}] }; (* Objective function: minimize total distance *) obj = Total[Flatten[Table[x[i, j], {i, n}, {j, n}]*dist]]; (* Flow constraints: each city must be entered and exited exactly once *) flow = Flatten@{ Table[Sum[If[i != j, x[i, j], 0], {j, n}] == 1, {i, n}], Table[Sum[If[i != j, x[j, i], 0], {j, n}] == 1, {i, n}] }; (* Miller-Tucker-Zemlin (MTZ) subtour elimination constraints *) MTZ=Flatten[Table[If[i!=j&&i>1&&j>1,u[i]-u[j]+n*x[i,j]<=n-1, Nothing],{i,n},{j,n}]]; (* Variable domains and integrality conditions *) vardomain=Flatten@{ Thread[0<=xVars<=1], u[1]==1,Thread[2<=uVars<=n], xVars∈Integers,uVars∈Integers}; (* Solve the model using Gurobi *) {optDist,sol}=NMinimize[ Flatten@{obj,flow,MTZ,vardomain}, Join[xVars,uVars], Method->"Gurobi"]; (* Extract path from the binary decision variables *) edges=Cases[sol,(x[i_,j_]->1):>{i,j}]; path=NestList[ Cases[edges,{#[[2]],_}][[1]]&, edges[[1]], Length@edges-1]; (* Visualization of the solution *) Graphics[{ {Red, PointSize[Large], Point@pts}, {Blue, Thick, Line[pts[[#]] & /@ path]}, {Green, PointSize[.02], Point@pts[[1]]}, {Arrowheads[.02], Arrow[pts[[#]] & /@ path]}}, Frame -> True, PlotLabel -> Row[{"TSP: n=", n, ", distance=", optDist}] ]
讀者回應 ( 0 意見 )
訂閱發佈留言 (Atom)
發佈留言
Please leave your name and tell me what you thought about this site. Comments, suggestions and views are welcomed.
如果這篇文章對你有幫助,那請留個訊息給我~