CSsharp Example:
using System;
using System.Collections.Generic;
using Maximal.OptiMax;
namespace Portfolio
{
class MplPortfolio
{
private OptiMax _mpl;
private Model _model;
private Solver _solver;
private string _resultString;
private double _riskVariance;
private string[] _investNames;
private double[] _investAmounts;
private bool _isSolving;
public MplPortfolio()
{
_mpl = null;
_model = null;
_solver = null;
_resultString = "";
_riskVariance = 0.0;
_investNames = null;
_investAmounts = null;
_isSolving = false;
}
private ResultType loadModel(Model model, double targetReturn, string[] monthNames,
string[] stockNames, double[] stockPrices)
{
const double minInvest = 0.0;
const double maxInvest = 1.0;
const int minStock = 5;
const int maxStock = 10;
try
{
IndexSet idxStock = model.IndexSets.Add("stock", stockNames);
model.IndexSets.Add("stock2", idxStock);
model.IndexSets.Add("month", monthNames);
model.IndexSets.Add("period[month]", "month - (First(month))");
model.DataConstants.Add("MinInvest", minInvest);
model.DataConstants.Add("MaxInvest", maxInvest);
model.DataConstants.Add("MinStocks", minStock);
model.DataConstants.Add("MaxStocks", maxStock);
model.DataConstants.Add("TargetReturn", targetReturn);
model.DataVectors.Add("Price[stock,month]", stockPrices);
model.ReadFilePart("Portfolio.mpl", "DATA_RETURN_MARKER");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return model.LastResult;
}
public bool SolveModel(string solverName, double targetReturn, string[] monthNames,
string[] stockNames, double[] stockPrices)
{
_mpl = new OptiMax();
_model = _mpl.Models.Add("Portfolio");
_solver = _mpl.Solvers.Add(solverName);
if (_solver == null)
{
_resultString = "Solver " + solverName + " was not found.";
return false;
}
_mpl.Options["ModelType"].ValueStr = "Quadratic";
_model.WorkingDirectory = _mpl.ModelDirectory;
ResultType result = loadModel(_model, targetReturn, monthNames, stockNames, stockPrices);
if (result != ResultType.Success)
{
_resultString = _model.Error.ToString();
return false;
}
result = _model.Solve(_solver);
if (result != ResultType.Success)
{
_resultString = "Solver " + _solver.Name + ": " + _model.ResultString + "\n" + _model.Solution.ResultString;
return false;
}
_resultString = _model.Solution.ResultString;
getSolutionValues(_model);
return true;
}
public bool ResolveModelForNewTarget(double targetReturn)
{
if (_mpl == null)
{
_resultString = "Model has not been solved yet.";
return false;
}
if (_isSolving)
{
return true;
}
_isSolving = true;
Constraint conMeetTarget = _model.PlainConstraints["MeetTarget"];
conMeetTarget.RHSValue = targetReturn;
ResultType result = _model.Solve(_solver);
if (result != ResultType.Success)
{
_resultString = "Solver " + _solver.Name + ": " + _model.ResultString + "\n" + _model.Solution.ResultString;
return false;
}
_resultString = _model.Solution.ResultString;
getSolutionValues(_model);
_isSolving = false;
return true;
}
private void getSolutionValues(Model model)
{
VariableVector investVect = model.VariableVectors["Invest"];
investVect.ZeroTol = 0.001;
List<string> solNames = new List<string>();
List<double> solValues = new List<double>();
foreach (Variable var in investVect.NonzeroVariables)
{
solNames.Add(investVect.Subscripts[1].ValueStr);
solValues.Add(var.Activity);
}
_investAmounts = solValues.ToArray();
_investNames = solNames.ToArray();
_riskVariance = model.Solution.ObjectValue;
}
public string ResultString
{
get { return _resultString; }
}
public double RiskVariance
{
get { return _riskVariance; }
}
public string[] InvestNames
{
get { return _investNames; }
}
public double[] InvestAmounts
{
get { return _investAmounts; }
}
public string DataDir
{
get
{
if (_mpl == null)
{
return GetDataDir();
}
return _mpl.ModelDirectory;
}
}
public static string GetDataDir()
{
OptiMax tempMpl = new OptiMax();
string dataDir = tempMpl.ModelDirectory;
tempMpl = null;
return dataDir;
}
}
}