FICO Xpress Optimization Examples Repository
 FICO Optimization Community FICO Xpress Optimization Home

Description
The problem
               Maximize
2x + y
subject to
c1:  x + 4y <= 24
c2:       y <=  5
c3: 3x +  y <= 20
c4:  x +  y <=  9
and
0 <= x,y <= +infinity
and the extra constraint
               c5: 6x + y <= 20
are first stored in the user's data structures. The LP is then loaded into Optimizer, using loadprob, and solved using the primal simplex algorithm. Next, the extra constraint is added to the problem matrix, using addrows, and the revised problem solved using the dual algorithm. In each case, the problem matrix is output to a file, the objective function value displayed on screen, and the problem statistics are are stored in a log file.

Source Files
By clicking on a file name, a preview is opened at the bottom of this page.

Imports System
Imports Microsoft.VisualBasic
Imports System.IO
Imports Optimizer

Public Sub RunLoadLP(ByVal Log As TextWriter)
' Store the problem
' Row data
Dim nRow As Integer = 4
Dim sRowType() As Char = {"L", "L", "L", "L"}
Dim dRHS() As Double = {24.0, 5.0, 20.0, 9.0}
Dim sRowName() As String = {"c1", "c2", "c3", "c4"}

' Column data
Dim nCol As Integer = 2
Dim dObj() As Double = {2.0, 1.0}
Dim dLowerBd() As Double = {0, 0}
Dim dUpperBd() As Double = {XPRS.PLUSINFINITY, XPRS.PLUSINFINITY}

Dim sColName() As String = {"x", "y"}

' Matrix data
Dim nColStart() As Integer = {0, 3, 7}
Dim nRowInd() As Integer = {0, 2, 3, 0, 1, 2, 3}
Dim dMatElem() As Double = {1, 3, 1, 4, 1, 1, 1}

' Store extra constraint
Dim nNewRow As Integer = 1
Dim nNewElem As Integer = 2
Dim sNewRowType() As Char = {"L"}
Dim sNewRowName() As String = {"c5"}

Dim dNewRHS() As Double = {20}
Dim dNewRowElem() As Double = {6, 1}
Dim nNewRowStart() As Integer = {0, 2}
Dim nNewColInd() As Integer = {0, 1}

Dim dObjValue As Double

Const sLogFile As String = "loadlp.log"
Const sProblem1 As String = "lp"
Const sProblem2 As String = "revised"

Dim prob As XPRSprob
prob = Nothing

Try
XPRS.Init("")

prob = New XPRSprob
prob.SetLogFile(sLogFile)

' Tell the Optimizer to call OptimizerMsg whenever a message is output

sProblem1, _
nCol, _
nRow, _
sRowType, _
dRHS, _
Nothing, _
dObj, _
nColStart, _
Nothing, _
nRowInd, _
dMatElem, _
dLowerBd, _
dUpperBd _
)

prob.AddNames(1, sRowName, 0, nRow - 1)

prob.AddNames(2, sColName, 0, nCol - 1)

' Output the matrix
prob.WriteProb(sProblem1, "")
Log.WriteLine("Matrix file {0}.mat has been created", sProblem1)

' Solve the LP problem
prob.LpOptimize()

' Get and display the value of the objective function
dObjValue = prob.LPObjVal
Log.WriteLine("The optimal objective value is {0}", dObjValue)

' Add the extra constraint and solve again

nNewRow, _
nNewElem, _
sNewRowType, _
dNewRHS, _
Nothing, _
nNewRowStart, _
nNewColInd, _
dNewRowElem _
)

' Output the revised matrix
prob.WriteProb(sProblem2, "")
Log.WriteLine("Matrix file {0}.mat has been created", sProblem2)

' Solve with dual - since the revised problem inherits dual feasibility from the
' original
prob.LpOptimize("d")

' Get and display the value of the objective function
dObjValue = prob.LPObjVal
Log.WriteLine("The revised optimal objective value is {0}", dObjValue)

Catch ex As Exception
Log.WriteLine(ex.ToString)

Finally
If (Not prob Is Nothing) Then
prob.Destroy()
End If
XPRS.Free()
End Try

End Sub

Private Sub HandleOptimizerMessage(ByVal prob As Optimizer.XPRSprob, ByVal data As Object, _
ByVal message As String, ByVal len As Integer, _
ByVal msglvl As Integer)
Dim log As TextWriter
log = data
If (msglvl = 3 Or msglvl = 4) Then
log.WriteLine(message)
End If
End Sub

End Module