Imports System
Imports Microsoft.VisualBasic
Imports Optimizer
Imports System.IO
'/***************************************************************************************\
'* Name: MipSolEnum.vb FairIsaac 13/06/2008 *
'* Purpose: 10 best solutions with the MIP solution enumerator *
'* Description: We take the power generation problem stored in hpw15.mps which seeks to *
'* optimise the operating pattern of a group of electricity generators. We *
'* run the MIP solution enumerator on the problem using the default setup *
'* obtaining the best 10 solutions. The best 10 solutions are stored to a *
'* MIP solution pool. The solutions' objectives and solution values are *
'* printed to screen. *
'* Input: hpw15.mps *
'\***************************************************************************************/
Module MipSolEnum
Public Sub RunMipSolEnum(ByRef Log As TextWriter)
XPRS.Init("")
Log.WriteLine(XPRS.GetBanner)
Dim prob As New XPRSprob
' Tell Optimizer to send all messages to Log '
prob.AddMsgHandlerCallback(Log)
' Get and display the Optimizer version number
Log.WriteLine( _
vbCrLf & "Xpress Optimizer Subroutine Library Release {0}" & vbCrLf & vbCrLf, _
prob.Version / 100 _
)
Dim msp As New XPRSmipsolpool
Dim mse As New XPRSmipsolenum
prob.ReadProb("../Data/hpw15")
Dim nCols As Integer = prob.Cols
' Avoid duplicated solutions from heuristics.
msp.DuplicateSolutionsPolicy = 3
' Disable dual reductions to prevent dominated solutions from being
' presolved away.
prob.MIPDualReductions = 2
' Run the enumeration '
Dim nMaxSols As Integer = 10
mse.Minim(prob, msp, XPRSdefaultMipSolEnumHandler.GetDefaultHandlerCallback(), Nothing, nMaxSols)
' Print out the solutions found
Dim nSols As Integer = mse.Solutions
Log.WriteLine("Enumerated best {0} solutions", nSols)
Dim i As Integer
For i = 1 To nSols
Dim iSolutionId(1) As Integer
Dim dObj As Double
Dim nSols2, nReturnedSolIds, solutionIdStatus As Integer
mse.GetSolList(XPRSattribute.Mse_Metric_MipObject, i, i, iSolutionId, nReturnedSolIds, nSols2)
mse.GetSolMetric(iSolutionId(0), solutionIdStatus, XPRSattribute.Mse_Metric_MipObject, dObj)
Log.WriteLine("--------")
Log.WriteLine("{0} = {1}", i, dObj)
Dim j As Integer
For j = 0 To nCols - 1
Dim dSol(1) As Double
Dim nValuesReturned As Integer
msp.GetSol(iSolutionId(0), solutionIdStatus, dSol, j, j, nValuesReturned)
Log.WriteLine("{0} = {1}", j, dSol(0))
Next
Next
End Sub
End Module
|