Financing an Early Retirement Scheme

Contents

Problem description

The National Agricultural Bank (NAB) decides to establish an early retirement scheme for fifteen employees who are taking early retirement. These employees will retire over a period of seven years starting from the next year. To finance this early retirement scheme, the bank decides to invest in bonds for this seven-year period. The necessary amounts to cover the pre-retirement leavers are given in the following table; they have to be paid at the beginning of every year.

Amounts required every year

+------------------+----+---+---+---+---+----+---+
|Year              |   1|  2|  3|  4|  5|   6|  7|
+------------------+----+---+---+---+---+----+---+
|Amount (in 1000 $)|1000|600|640|480|760|1020|950|
+------------------+----+---+---+---+---+----+---+

For the investments, the bank decides to take three different types of bonds, SNCF bonds, Fujitsu bonds, and Treasury bonds. The money that is not invested in these bonds is placed as savings with a guaranteed yield of 3.2%. The table below lists all information concerning the yield and the durations of the bonds and also the value of a bond. In this type of bond, it is only possible to buy an integer number of bonds, and the invested capital remains locked in for the total duration of the bond. Every year, only the interest on the capital is distributed. The person in charge of the retirement plan decides to buy bonds at the beginning of the first year, but not in the following years. How should he organize the investments in order to spend the least amount of money to cover the projected retirement plan?

Information about loans

+--------+----------------------+---------+--------+
|Loan    |Value of bonds (in k$)| Interest|Duration|
+--------+----------------------+---------+--------+
|SNCF    |     1.0              |   7.0%  | 5 years|
|Fujitsu |     0.8              |   7.0%  | 4 years|
|Treasury|     0.5              |   6.5%  | 6 years|
+--------+----------------------+---------+--------+

Variables

amounts                    Retirement costs
baseinterest               Interest from money not invested in bonds
values                     Values of a bond
interest                   Interest from bonds
duration                   Years to place the money

Reference

Applications of optimization... Gueret, Prins, Seveaux

% Marcus Edvall, Tomlab Optimization Inc, E-mail: tomlab@tomopt.com
% Copyright (c) 2005-2009 by Tomlab Optimization Inc., $Release: 7.2.0$
% Written Oct 7, 2005.   Last modified Apr 8, 2009.

Problem setup

amounts       = [1000 600 640 480 760 1020 950]'*1000;
baseinterest  = 3.2;
values        = [1000 800 500]';
interest      = [7.0 7.0 6.5]';
duration      = [5.0 4.0 6.0]';

b  = length(values);    % Bonds to buy
t  = length(amounts)-1; % Invest occasions

buy = tom('buy',b,1,'int');
invest = tom('invest',t,1);
capital = tom('capital',1,1);

% Some variables are integer.
bnds = {capital >= 0, invest >= 0, buy >= 0};

% First year constr
con1 = {capital - sum(values.*buy) - invest(1) == amounts(1)};

% 2nd - 4th year constr.
con2 = cell(3,1);
for i=1:3
    con2{i} = {values'.*interest'/100*buy + ...
        invest(i)*(1+baseinterest/100) - invest(i+1) == ...
        amounts(i+1)};
end

% 5th - 6th year constr.
con3 = cell(2,1);
for i=1:2
    idx1 = find(duration == i+3);
    idx2 = find(duration >= i+4);
    con3{i} = {values(idx1)'.*(1+interest(idx1)'/100)*buy(idx1) + ...
        values(idx2)'.*interest(idx2)'/100*buy(idx2) + ...
        (1+baseinterest/100)*invest(i+3) - invest(i+4) == ...
        amounts(i+4)};
end

% 7th year constr.
idx = find(duration == 6);
con4 = {values(idx)'.*(1+interest(idx)'/100)*buy(idx) + ...
    (1+baseinterest/100)*invest(6) == amounts(7)};

% Objective
objective = capital;

constraints = {bnds, con1, con2, con3, con4};
options = struct;
options.solver = 'cplex';
options.name   = 'Financing an Early Retirement Scheme';
Prob = sym2prob('mip',objective,constraints,[],options);
Prob.MIP.cpxControl.EPGAP = 1e-10;

PriLev = 1;
Result = tomRun('cplex', Prob, PriLev);
sol = getSolution(Result);

if PriLev > 0
    buy_bonds = sol.buy;
    buy_other = sol.invest;

    for i = 1:length(buy_bonds),
        if buy_bonds(i) ~= 0,
            disp(['buy ' num2str(buy_bonds(i)) ' bonds of type ' ...
                num2str(i)])
        end
    end

    for i = 1:length(buy_other),
        if buy_other(i) ~= 0,
            disp(['buy "other things" for $ ' ...
                num2str(buy_other(i)) ' year ' num2str(i)])
        end
    end
end

% MODIFICATION LOG
%
% 051201 med   Created.
% 060116 per   Added documentation.
% 060125 per   Moved disp to end
% 090308 med   Converted to tomSym
===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2010-02-05
=====================================================================================
Problem: ---  1: Financing an Early Retirement Scheme  f_k 4548916.886277667200000000
                                              sum(|constr|)      0.000000000000000233
                                     f(x_k) + sum(|constr|)4548916.886277667200000000
                                                     f(x_0)      0.000000000000000000

Solver: CPLEX.  EXIT=0.  INFORM=101.
CPLEX Branch-and-Cut MIP solver
Optimal integer solution found

FuncEv    5 Iter   20 
buy 911 bonds of type 1
buy 747 bonds of type 2
buy 1760 bonds of type 3
buy "other things" for $ 1160316.8863 year 1
buy "other things" for $ 760249.0266 year 2
buy "other things" for $ 307378.9955 year 3
buy "other things" for $ 17.1233 year 4
buy "other things" for $ 419.6713 year 5
buy "other things" for $ 12403.1008 year 6