FICO
FICO Xpress Optimization Examples Repository
FICO Optimization Community FICO Xpress Optimization Home
Back to examples browserPrevious example

Folio - Examples from 'Getting Started'

Description
Different versions of a portfolio optimization problem.

Basic modelling and solving tasks:
  • modeling and solving a small LP problem (foliolp)
  • performing explicit initialization (folioinit)
  • data input from file, index sets (foliodata, requires foliocpplp.dat)
  • modeling and solving a small MIP problem with binary variables (foliomip1)
  • modeling and solving a small MIP problem with semi-continuous variables (foliomip2)
  • modeling and solving QP and MIQP problems (folioqp, requires foliocppqp.dat)
  • heuristic solution of a MIP problem (folioheur)
Advanced modeling and solving tasks:
  • enlarged version of the basic MIP model (foliomip3, to be used with data set folio10.cdat)
  • defining an integer solution callback (foliocb)
  • using the MIP solution pool (foliosolpool)
  • using the solution enumerator (folioenumsol)
  • handling infeasibility through deviation variables (folioinfeas)
  • retrieving IIS (folioiis, foliomiis)
  • using the built-in infeasibility repair functionality (foliorep)
Further explanation of this example: 'Getting Started with BCL' for the basic modelling and solving tasks; 'Advanced Evaluators Guide' for solution enumeration and infeasibilit handling


Source Files

Data Files





foliolp.cs

/********************************************************
  Xpress-BCL C# Example Problems
  ==============================

  file foliolp.cs
  ```````````````
  Modeling a small LP problem
  to perform portfolio optimization.

  (c) 2008-2024 Fair Isaac Corporation
      authors: S.Heipcke, D.Brett.
********************************************************/

using System;
using System.Text;
using System.IO;
using BCL;


namespace Examples
{
    public class TestUGFolioLP
    {

        const int NSHARES = 10;                   // Number of shares
        const int NRISK = 5;                      // Number of high-risk shares
        const int NNA = 4;                        // Number of North-American shares

        double[] RET = {5,17,26,12,8,9,7,6,31,21};  // Estimated return in investment
        int[] RISK = {1,2,3,8,9};            // High-risk values among shares
        int[] NA = {0,1,2,3};                // Shares issued in N.-America

        public static void Main()
        {
            XPRB.init();
            int s;
            XPRBprob p = new XPRBprob("FolioLP");              // Initialize a new problem in BCL
            XPRBexpr Risk,Na,Return,Cap;
            XPRBvar[] frac = new XPRBvar[NSHARES];              // Fraction of capital used per share
            TestUGFolioLP TestInstance = new TestUGFolioLP();

            // Create the decision variables
            for(s=0;s<NSHARES;s++) frac[s] = p.newVar("frac");  //, XPRB_PL, 0, 0.3);

            // Objective: total return
            Return = new XPRBexpr();
            for (s = 0; s < NSHARES; s++) Return += TestInstance.RET[s] * frac[s];
            p.setObj(p.newCtr("Objective", Return));                   // Set the objective function

            // Limit the percentage of high-risk values
            Risk = new XPRBexpr();
            for (s = 0; s < NRISK; s++) Risk += frac[TestInstance.RISK[s]];
            p.newCtr("Risk", Risk <= 1.0/3);

            /* Equivalent:
            XPRBctr CRisk;
            CRisk = p.newCtr("Risk");
            for(s=0;s<NRISK;s++) CRisk.addTerm(frac[RISK[s]], 1);
            CRisk.setType(XPRB_L);
            CRisk.addTerm(1.0/3);
            */

            // Minimum amount of North-American values
            Na = new XPRBexpr();
            for (s = 0; s < NNA; s++) Na += frac[TestInstance.NA[s]];
            p.newCtr("NA", Na >= 0.5);

            // Spend all the capital
            Cap = new XPRBexpr();
            for(s=0;s<NSHARES;s++) Cap += frac[s];
            p.newCtr("Cap", Cap == 1);

            // Upper bounds on the investment per share
            for(s=0;s<NSHARES;s++) frac[s].setUB(0.3);

            // Export matrix to a file
            /* p.exportProb(XPRB_MPS, "Folio");
            p.setSense(XPRB_MAXIM);
            p.exportProb(XPRB_LP, "Folio");
            */

            // Disable all BCL and Optimizer message printing, except error messages
            // p.setMsgLevel(1);

            // Solve the problem
            p.setSense(BCLconstant.XPRB_MAXIM);
            p.lpOptimize();              /* Solve the LP-problem */

            string[] LPSTATUS = {"not loaded", "optimal", "infeasible",
            "worse than cutoff", "unfinished", "unbounded", "cutoff in dual"};

            System.Console.WriteLine("Problem status: " + LPSTATUS[p.getLPStat()]);

            // Solution printing
            System.Console.WriteLine("Total return: " + p.getObjVal());
            for(s=0;s<NSHARES;s++)
            System.Console.WriteLine(s + ": " + frac[s].getSol()*100 + "%");

            return;
        }

    }

}
Back to examples browserPrevious example