VBNet Example:
Imports Maximal.OptiMax
Public Class MplCirclePack
Private _resultString As String
Private _xValues() As Double
Private _yValues() As Double
Private _radius As Double
Public Sub New()
_resultString = ""
ReDim _xValues(0)
ReDim _yValues(0)
_radius = 0.0
End Sub
Private Function loadModel(ByVal model As Model, ByVal circleCount As Integer) As ResultType
Try
model.IndexSets.Add("i", 1, circleCount)
model.IndexSets.Add("j", 1, circleCount)
Dim varRadius As Variable = model.PlainVariables.Add("Radius")
Dim varX As VariableVector = model.VariableVectors.Add("x[i]", "", VariableType.Free)
Dim varY As VariableVector = model.VariableVectors.Add("y[i]", "", VariableType.Free)
varRadius.UpperBound = 1.0
varX.LowerBound = -1.0
varX.UpperBound = 1.0
varY.LowerBound = -1.0
varY.UpperBound = 1.0
model.Objectives.Add("Radius", ObjectSense.Maximize)
model.ConstraintVectors.Add("NoOverlap[i,j]", _
"2 * Radius <= ((x[i] - x[i:=j])^2 + (y[i] - y[i:=j])^2)^0.5", "WHERE(i < j)")
model.ConstraintVectors.Add("InBoundsA[i]", "x + Radius <= 1")
model.ConstraintVectors.Add("InBoundsB[i]", "x - Radius >= -1")
model.ConstraintVectors.Add("InBoundsC[i]", "y + Radius <= 1")
model.ConstraintVectors.Add("InBoundsD[i]", "y - Radius >= -1")
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
Return model.LastResult
End Function
Public Function SolveModel(ByVal solverName As String, ByVal numCircles As Integer) As Boolean
Dim mpl As OptiMax = New OptiMax()
Dim model As Model = mpl.Models.Add("CirclePack")
mpl.Options("ModelType").ValueStr = "Nonlinear"
mpl.Options("ParserType").ValueStr = "Extended"
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, numCircles)
If Not result = ResultType.Success Then
_resultString = model.Error.ToString()
Return False
End If
result = model.Solve()
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 Sub getSolutionValues(ByVal model As Model)
_radius = model.Solution.ObjectValue
Dim xList As List(Of Double) = New List(Of Double)()
Dim yList As List(Of Double) = New List(Of Double)()
For Each xVar As Variable In model.VariableVectors("x")
xList.Add(xVar.Activity)
Next xVar
For Each yVar As Variable In model.VariableVectors("y")
yList.Add(yVar.Activity)
Next yVar
_xValues = xList.ToArray()
_yValues = yList.ToArray()
End Sub
Public ReadOnly Property ResultString() As String
Get
Return _resultString
End Get
End Property
Public ReadOnly Property Radius() As Double
Get
Return _radius
End Get
End Property
Public ReadOnly Property xValues() As Double()
Get
Return _xValues
End Get
End Property
Public ReadOnly Property yValues() As Double()
Get
Return _yValues
End Get
End Property
End Class