VBNet Example:
Imports Maximal.OptiMax Public Class MplCutStock Private _resultString As String Private _totalCost As Double Private _sheetsCut As Integer Private _totalSheets As Integer Private _totalWaste As Integer Private _solPatternCount() As Integer Private _solPatternNames() As String Public Sub New() _resultString = "" _totalCost = 0.0 _sheetsCut = 0 _totalSheets = 0 _totalWaste = 0 ReDim _solPatternCount(0) ReDim _solPatternNames(0) End Sub Private Function loadModel(ByVal model As Model, ByVal sheetPrice As Double, ByVal sheetsAvail As Integer, _ ByVal numWidths As Integer, ByVal cutWidths() As Integer, ByVal cutDemands() As Integer, _ ByVal numPatterns As Integer, ByVal patternWaste() As Integer, _ ByVal patternTable(,) As Integer) As ResultType Try model.IndexSets.Add("patterns", "p", 1, numPatterns) model.IndexSets.Add("cuts", "w", 1, numWidths) model.DataConstants.Add("PriceSheet", sheetPrice) model.DataConstants.Add("SheetsAvail", sheetsAvail) model.DataVectors.Add("CutWidths[cuts]", cutWidths) model.DataVectors.Add("CutDemand[cuts]", cutDemands) model.DataVectors.Add("PatWaste[patterns]", patternWaste) model.DataVectors.Add("CutsInPattern[patterns, cuts]", patternTable) model.PlainVariables.Add("SheetsCut", "-> T1") model.PlainVariables.Add("TotalCost", "-> TC") model.VariableVectors.Add("PatternCount[patterns]", "-> """"") model.VariableVectors.Add("ExcessCuts[cuts]", "-> X") model.Objectives.Add("Obj", ObjectSense.Minimize, "TotalCost") model.PlainConstraints.Add("TotCost", "TotalCost = PriceSheet*SheetsCut") model.PlainConstraints.Add("RawAvail", "SheetsCut < SheetsAvail") model.PlainConstraints.Add("Sheets", "SheetsCut = SUM(patterns: PatternCount[patterns])") model.ConstraintVectors.Add("CutReq[cuts]", _ "SUM(patterns: CutsInPattern[patterns, cuts] * PatternCount[patterns]) = CutDemand[cuts] + ExcessCuts[cuts]") Catch ex As Exception Console.WriteLine(ex.Message) End Try Return model.LastResult End Function Public Function SolveModel(ByVal solverName As String, ByVal priceSheet As Double, ByVal sheetsAvail As Integer, _ ByVal numWidths As Integer, ByVal cutWidths() As Integer, ByVal cutDemands() As Integer, _ ByVal numPatterns As Integer, ByVal patternWaste() As Integer, _ ByVal patternTable(,) As Integer) As Boolean Dim mpl As OptiMax = New OptiMax() Dim model As Model = mpl.Models.Add("CutStock") Dim solver As Solver = mpl.Solvers.Add(solverName) If solver Is Nothing Then _resultString = "Solver " & solverName & " was not found." Return False End If model.WorkingDirectory = mpl.ModelDirectory Dim result As ResultType = loadModel(model, priceSheet, sheetsAvail, numWidths, cutWidths, _ cutDemands, numPatterns, patternWaste, patternTable) If Not result = ResultType.Success Then _resultString = model.Error.ToString() Return False End If 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) computeSolutionTotals(_solPatternCount, patternWaste) Return True End Function Private Sub getSolutionValues(ByVal model As Model) _totalCost = model.Solution.ObjectValue Dim sheetsCutVar As Variable = model.PlainVariables("SheetsCut") _sheetsCut = Convert.ToInt32(sheetsCutVar.Activity) Dim solPatternNames As List(Of String) = New List(Of String) Dim solPatterns As List(Of Integer) = New List(Of Integer) Dim PatternCountVect As VariableVector = model.VariableVectors("PatternCount") For Each var As Variable In PatternCountVect solPatternNames.Add(PatternCountVect.Subscripts(1).ValueStr) solPatterns.Add(Convert.ToInt32(var.Activity)) Next var _solPatternNames = solPatternNames.ToArray() _solPatternCount = solPatterns.ToArray() End Sub Private Sub computeSolutionTotals(ByVal patternCount() As Integer, ByVal patternWaste() As Integer) _totalSheets = 0 _totalWaste = 0 For p As Integer = 0 To patternCount.Length - 1 If patternCount(p) > 0 Then _totalSheets = _totalSheets + patternCount(p) _totalWaste = _totalWaste + patternWaste(p) * patternCount(p) End If Next p End Sub Public ReadOnly Property ResultString() As String Get Return _resultString End Get End Property Public ReadOnly Property TotalCost() As Double Get Return _totalCost End Get End Property Public ReadOnly Property SheetsCut() As Integer Get Return _sheetsCut End Get End Property Public ReadOnly Property TotalSheets() As Integer Get Return _totalSheets End Get End Property Public ReadOnly Property TotalWaste() As Integer Get Return _totalWaste End Get End Property Public ReadOnly Property SolPatternCount() As Integer() Get Return _solPatternCount End Get End Property Public ReadOnly Property SolPatternNames() As String() Get Return _solPatternNames End Get End Property End Class