VBNet Example:
Imports Maximal.OptiMax
Public Class MplShortPath
Private _resultString As String
Private _totalDistance As Double
Private _path() As Double
Public Sub New()
_resultString = ""
_totalDistance = 0.0
ReDim _path(0)
End Sub
Private Function loadModel(ByVal model As Model, ByVal startCity As String, ByVal endCity As String, _
ByVal cityNames As String(), ByVal routeDistData As ArrayList) As ResultType
Const flow As Double = 1.0
Try
model.IndexSets.Add("node", cityNames)
model.IndexSets.Add("FromNode[node]", cityNames)
model.IndexSets.Add("ToNode[node]", cityNames)
model.DataVectors.Add("Distance[FromNode,ToNode]", routeDistData)
model.DataStrings.Add("StartCity", startCity)
model.DataStrings.Add("EndCity", endCity)
model.VariableVectors.Add("Path[FromNode, ToNode] WHERE (Distance > 0)")
model.Objectives.Add("SUM(FromNode,ToNode: Distance*Path)")
Dim conFlowBal As ConstraintVector = model.ConstraintVectors.Add("FlowBalance[node]", _
"SUM(FromNode: Path[FromNode, ToNode:=node]) = SUM(ToNode: Path[FromNode:=node, ToNode])")
conFlowBal(startCity).RHSValue = -flow
conFlowBal(endCity).RHSValue = flow
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
Return model.LastResult
End Function
Public Function SolveModel(ByVal solverName As String, ByVal startCity As String, ByVal endCity As String, _
ByVal cityNames() As String, ByVal routeDistData As ArrayList) As Boolean
Dim mpl As OptiMax = New OptiMax()
Dim model As Model = mpl.Models.Add("ShortPath")
Dim solver As Solver = mpl.Solvers.Add(solverName)
If solver Is Nothing Then
_resultString = "Solver " & solverName & " was not found."
Return False
End If
Dim result As ResultType = loadModel(model, startCity, endCity, cityNames, routeDistData)
If Not result = ResultType.Success Then
_resultString = model.Error.ToString()
Return False
End If
model.UseExceptions = False
result = model.Solve(solver)
If Not result = ResultType.Success Then
_resultString = "Solver " & solver.Name & ": " & model.ResultString & vbCrLf & model.Solution.ResultString
Return False
End If
_resultString = model.Solution.ResultString
getSolutionValues(model)
Return True
End Function
Private Function getSolutionValues(ByVal model As Model) As Integer
Dim varPath As VariableVector = model.VariableVectors("Path")
Dim solPath As List(Of Double) = New List(Of Double)
For Each var As Variable In varPath
solPath.Add(var.Activity)
Next var
_path = solPath.ToArray()
_totalDistance = model.Solution.ObjectValue
Return solPath.Count
End Function
Public ReadOnly Property ResultString() As String
Get
Return _resultString
End Get
End Property
Public ReadOnly Property Path() As Double()
Get
Return _path
End Get
End Property
Public ReadOnly Property TotalDistance() As Double
Get
Return _totalDistance
End Get
End Property
Public ReadOnly Property DataDir() As String
Get
Return GetDataDir()
End Get
End Property
Public Shared Function GetDataDir() As String
Dim tempMpl As OptiMax = New OptiMax()
Dim dataDir As String = tempMpl.ModelDirectory
tempMpl = Nothing
Return dataDir
End Function
End Class