From 356c6215f4872911205dcb2d155e7687ae4dd2a8 Mon Sep 17 00:00:00 2001
From: Harpreet
Date: Wed, 31 Aug 2016 10:22:01 +0530
Subject: intfminimax added and fmincon updated
---
build/Scilab/intfmincon.sci | 317 ++++++++++++++++++++++++++++----------------
1 file changed, 205 insertions(+), 112 deletions(-)
(limited to 'build/Scilab/intfmincon.sci')
diff --git a/build/Scilab/intfmincon.sci b/build/Scilab/intfmincon.sci
index 0d6cf6d..cd234de 100644
--- a/build/Scilab/intfmincon.sci
+++ b/build/Scilab/intfmincon.sci
@@ -10,48 +10,53 @@
// Email: toolbox@scilab.in
function [xopt,fopt,exitflag,gradient,hessian] = intfmincon (varargin)
- // Solves a constrainted multi-variable mixed integer non linear programming problem
- //
- // Calling Sequence
- // xopt = intfmincon(f,x0,intcon,A,b)
- // xopt = intfmincon(f,x0,intcon,A,b,Aeq,beq)
- // xopt = intfmincon(f,x0,intcon,A,b,Aeq,beq,lb,ub)
- // xopt = intfmincon(f,x0,intcon,A,b,Aeq,beq,lb,ub,nlc)
- // xopt = intfmincon(f,x0,intcon,A,b,Aeq,beq,lb,ub,nlc,options)
- // [xopt,fopt] = intfmincon(.....)
- // [xopt,fopt,exitflag]= intfmincon(.....)
- // [xopt,fopt,exitflag,gradient]=intfmincon(.....)
- // [xopt,fopt,exitflag,gradient,hessian]=intfmincon(.....)
+ // Solves a constrainted multi-variable mixed integer non linear programming problem
+ //
+ // Calling Sequence
+ // xopt = intfmincon(f,x0,intcon,A,b)
+ // xopt = intfmincon(f,x0,intcon,A,b,Aeq,beq)
+ // xopt = intfmincon(f,x0,intcon,A,b,Aeq,beq,lb,ub)
+ // xopt = intfmincon(f,x0,intcon,A,b,Aeq,beq,lb,ub,nlc)
+ // xopt = intfmincon(f,x0,intcon,A,b,Aeq,beq,lb,ub,nlc,options)
+ // [xopt,fopt] = intfmincon(.....)
+ // [xopt,fopt,exitflag]= intfmincon(.....)
+ // [xopt,fopt,exitflag,gradient]=intfmincon(.....)
+ // [xopt,fopt,exitflag,gradient,hessian]=intfmincon(.....)
//
// Parameters
// f : a function, representing the objective function of the problem
- // x0 : a vector of doubles, containing the starting values of variables.
- // intcon : a vector of integers, represents which variables are constrained to be integers
- // A : a matrix of double, represents the linear coefficients in the inequality constraints A⋅x ≤ b.
- // b : a vector of double, represents the linear coefficients in the inequality constraints A⋅x ≤ b.
- // Aeq : a matrix of double, represents the linear coefficients in the equality constraints Aeq⋅x = beq.
- // beq : a vector of double, represents the linear coefficients in the equality constraints Aeq⋅x = beq.
- // lb : Lower bounds, specified as a vector or array of double. lb represents the lower bounds elementwise in lb ≤ x ≤ ub.
- // ub : Upper bounds, specified as a vector or array of double. ub represents the upper bounds elementwise in lb ≤ x ≤ ub.
- // nlc : a function, representing the Non-linear Constraints functions(both Equality and Inequality) of the problem. It is declared in such a way that non-linear inequality constraints are defined first as a single row vector (c), followed by non-linear equality constraints as another single row vector (ceq). Refer Example for definition of Constraint function.
- // options : a list, containing the option for user to specify. See below for details.
- // xopt : a vector of doubles, containing the the computed solution of the optimization problem.
- // fopt : a scalar of double, containing the the function value at x.
- // exitflag : a scalar of integer, containing the flag which denotes the reason for termination of algorithm. See below for details.
- // gradient : a vector of doubles, containing the Objective's gradient of the solution.
- // hessian : a matrix of doubles, containing the Objective's hessian of the solution.
- //
- // Description
- // Search the minimum of a multi-variable function on bounded interval specified by :
- // Find the minimum of f(x) such that
+ // x0 : a vector of doubles, containing the starting values of variables.
+ // intcon : a vector of integers, represents which variables are constrained to be integers
+ // A : a matrix of double, represents the linear coefficients in the inequality constraints A⋅x ≤ b.
+ // b : a vector of double, represents the linear coefficients in the inequality constraints A⋅x ≤ b.
+ // Aeq : a matrix of double, represents the linear coefficients in the equality constraints Aeq⋅x = beq.
+ // beq : a vector of double, represents the linear coefficients in the equality constraints Aeq⋅x = beq.
+ // lb : Lower bounds, specified as a vector or array of double. lb represents the lower bounds elementwise in lb ≤ x ≤ ub.
+ // ub : Upper bounds, specified as a vector or array of double. ub represents the upper bounds elementwise in lb ≤ x ≤ ub.
+ // nlc : a function, representing the Non-linear Constraints functions(both Equality and Inequality) of the problem. It is declared in such a way that non-linear inequality constraints are defined first as a single row vector (c), followed by non-linear equality constraints as another single row vector (ceq). Refer Example for definition of Constraint function.
+ // options : a list, containing the option for user to specify. See below for details.
+ // xopt : a vector of doubles, containing the the computed solution of the optimization problem.
+ // fopt : a scalar of double, containing the the function value at x.
+ // exitflag : a scalar of integer, containing the flag which denotes the reason for termination of algorithm. See below for details.
+ // gradient : a vector of doubles, containing the Objective's gradient of the solution.
+ // hessian : a matrix of doubles, containing the Objective's hessian of the solution.
//
- //
- // \begin{eqnarray}
- // &\mbox{min}_{x}
- // & f(x)\\
- // & \text{subject to} & x1 \ < x \ < x2 \\
- // \end{eqnarray}
- //
+ // Description
+ // Search the minimum of a mixed integer constrained optimization problem specified by :
+ // Find the minimum of f(x) such that
+ //
+ //
+ // \begin{eqnarray}
+ // &\mbox{min}_{x}
+ // & f(x) \\
+ // & \text{subject to} & A*x \leq b \\
+ // & & Aeq*x \ = beq\\
+ // & & c(x) \leq 0\\
+ // & & ceq(x) \ = 0\\
+ // & & lb \leq x \leq ub \\
+ // & & x_i \in \!\, \mathbb{Z}, i \in \!\, I
+ // \end{eqnarray}
+ //
//
// The routine calls Bonmin for solving the Bounded Optimization problem, Bonmin is a library written in C++.
//
@@ -72,65 +77,146 @@ function [xopt,fopt,exitflag,gradient,hessian] = intfmincon (varargin)
// The exitflag allows to know the status of the optimization which is given back by Ipopt.
//
// exitflag=0 : Optimal Solution Found
- // exitflag=1 : Maximum Number of Iterations Exceeded. Output may not be optimal.
- // exitflag=2 : Maximum CPU Time exceeded. Output may not be optimal.
- // exitflag=3 : Stop at Tiny Step.
- // exitflag=4 : Solved To Acceptable Level.
- // exitflag=5 : Converged to a point of local infeasibility.
+ // exitflag=1 : InFeasible Solution.
+ // exitflag=2 : Objective Function is Continuous Unbounded.
+ // exitflag=3 : Limit Exceeded.
+ // exitflag=4 : User Interrupt.
+ // exitflag=5 : MINLP Error.
//
//
// For more details on exitflag see the Bonmin documentation, go to http://www.coin-or.org/Bonmin
- //
- // Examples
- // //Find x in R^6 such that it minimizes:
- // //f(x)= sin(x1) + sin(x2) + sin(x3) + sin(x4) + sin(x5) + sin(x6)
- // //-2 <= x1,x2,x3,x4,x5,x6 <= 2
- // //Objective function to be minimised
- // function y=f(x)
- // y=0
- // for i =1:6
- // y=y+sin(x(i));
- // end
- // endfunction
- // //Variable bounds
- // x1 = [-2, -2, -2, -2, -2, -2];
- // x2 = [2, 2, 2, 2, 2, 2];
- // intcon = [2 3 4]
- // //Options
- // options=list("MaxIter",[1500],"CpuTime", [100])
- // [x,fval] =intfmincon(f ,intcon, x1, x2, options)
- // // Press ENTER to continue
- //
- // Examples
- // //Find x in R such that it minimizes:
- // //f(x)= 1/x^2
- // //0 <= x <= 1000
- // //Objective function to be minimised
- // function y=f(x)
- // y=1/x^2;
- // endfunction
- // //Variable bounds
- // x1 = [0];
- // x2 = [1000];
- // intcon = [1];
- // [x,fval,exitflag,output,lambda] =intfmincon(f,intcon , x1, x2)
- // // Press ENTER to continue
- //
- // Examples
- // //The below problem is an unbounded problem:
- // //Find x in R^2 such that it minimizes:
- // //f(x)= -[(x1-1)^2 + (x2-1)^2]
- // //-inf <= x1,x2 <= inf
- // //Objective function to be minimised
- // function y=f(x)
- // y=-((x(1)-1)^2+(x(2)-1)^2);
- // endfunction
- // //Variable bounds
- // x1 = [-%inf , -%inf];
- // x2 = [ %inf , %inf];
- // //Options
- // options=list("MaxIter",[1500],"CpuTime", [100])
- // [x,fval,exitflag,output,lambda] =intfmincon(f,intcon, x1, x2, options)
+ //
+ // Examples
+ // //Find x in R^2 such that it minimizes:
+ // //f(x)= -x1 -x2/3
+ // //x0=[0,0]
+ // //constraint-1 (c1): x1 + x2 <= 2
+ // //constraint-2 (c2): x1 + x2/4 <= 1
+ // //constraint-3 (c3): x1 - x2 <= 2
+ // //constraint-4 (c4): -x1/4 - x2 <= 1
+ // //constraint-5 (c5): -x1 - x2 <= -1
+ // //constraint-6 (c6): -x1 + x2 <= 2
+ // //constraint-7 (c7): x1 + x2 = 2
+ // //Objective function to be minimised
+ // function [y,dy]=f(x)
+ // y=-x(1)-x(2)/3;
+ // dy= [-1,-1/3];
+ // endfunction
+ // //Starting point, linear constraints and variable bounds
+ // x0=[0 , 0];
+ // intcon = [1]
+ // A=[1,1 ; 1,1/4 ; 1,-1 ; -1/4,-1 ; -1,-1 ; -1,1];
+ // b=[2;1;2;1;-1;2];
+ // Aeq=[1,1];
+ // beq=[2];
+ // lb=[];
+ // ub=[];
+ // nlc=[];
+ // //Options
+ // options=list("GradObj", "on");
+ // //Calling Ipopt
+ // [x,fval,exitflag,grad,hessian] =intfmincon(f, x0,intcon,A,b,Aeq,beq,lb,ub,nlc,options)
+ // // Press ENTER to continue
+ //
+ // Examples
+ // //Find x in R^3 such that it minimizes:
+ // //f(x)= x1*x2 + x2*x3
+ // //x0=[0.1 , 0.1 , 0.1]
+ // //constraint-1 (c1): x1^2 - x2^2 + x3^2 <= 2
+ // //constraint-2 (c2): x1^2 + x2^2 + x3^2 <= 10
+ // //Objective function to be minimised
+ // function [y,dy]=f(x)
+ // y=x(1)*x(2)+x(2)*x(3);
+ // dy= [x(2),x(1)+x(3),x(2)];
+ // endfunction
+ // //Starting point, linear constraints and variable bounds
+ // x0=[0.1 , 0.1 , 0.1];
+ // intcon = [2]
+ // A=[];
+ // b=[];
+ // Aeq=[];
+ // beq=[];
+ // lb=[];
+ // ub=[];
+ // //Nonlinear constraints
+ // function [c,ceq,cg,cgeq]=nlc(x)
+ // c = [x(1)^2 - x(2)^2 + x(3)^2 - 2 , x(1)^2 + x(2)^2 + x(3)^2 - 10];
+ // ceq = [];
+ // cg=[2*x(1) , -2*x(2) , 2*x(3) ; 2*x(1) , 2*x(2) , 2*x(3)];
+ // cgeq=[];
+ // endfunction
+ // //Options
+ // options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", "on","GradCon", "on");
+ // //Calling Ipopt
+ // [x,fval,exitflag,output] =intfmincon(f, x0,intcon,A,b,Aeq,beq,lb,ub,nlc,options)
+ // // Press ENTER to continue
+ //
+ // Examples
+ // //The below problem is an unbounded problem:
+ // //Find x in R^3 such that it minimizes:
+ // //f(x)= -(x1^2 + x2^2 + x3^2)
+ // //x0=[0.1 , 0.1 , 0.1]
+ // // x1 <= 0
+ // // x2 <= 0
+ // // x3 <= 0
+ // //Objective function to be minimised
+ // function y=f(x)
+ // y=-(x(1)^2+x(2)^2+x(3)^2);
+ // endfunction
+ // //Starting point, linear constraints and variable bounds
+ // x0=[0.1 , 0.1 , 0.1];
+ // intcon = [3]
+ // A=[];
+ // b=[];
+ // Aeq=[];
+ // beq=[];
+ // lb=[];
+ // ub=[0,0,0];
+ // //Options
+ // options=list("MaxIter", [1500], "CpuTime", [500]);
+ // //Calling Ipopt
+ // [x,fval,exitflag,grad,hessian] =intfmincon(f, x0,intcon,A,b,Aeq,beq,lb,ub,[],options)
+ // // Press ENTER to continue
+ //
+ // Examples
+ // //The below problem is an infeasible problem:
+ // //Find x in R^3 such that in minimizes:
+ // //f(x)=x1*x2 + x2*x3
+ // //x0=[1,1,1]
+ // //constraint-1 (c1): x1^2 <= 1
+ // //constraint-2 (c2): x1^2 + x2^2 <= 1
+ // //constraint-3 (c3): x3^2 <= 1
+ // //constraint-4 (c4): x1^3 = 0.5
+ // //constraint-5 (c5): x2^2 + x3^2 = 0.75
+ // // 0 <= x1 <=0.6
+ // // 0.2 <= x2 <= inf
+ // // -inf <= x3 <= 1
+ // //Objective function to be minimised
+ // function [y,dy]=f(x)
+ // y=x(1)*x(2)+x(2)*x(3);
+ // dy= [x(2),x(1)+x(3),x(2)];
+ // endfunction
+ // //Starting point, linear constraints and variable bounds
+ // x0=[1,1,1];
+ // intcon = [2]
+ // A=[];
+ // b=[];
+ // Aeq=[];
+ // beq=[];
+ // lb=[0 0.2,-%inf];
+ // ub=[0.6 %inf,1];
+ // //Nonlinear constraints
+ // function [c,ceq,cg,cgeq]=nlc(x)
+ // c=[x(1)^2-1,x(1)^2+x(2)^2-1,x(3)^2-1];
+ // ceq=[x(1)^3-0.5,x(2)^2+x(3)^2-0.75];
+ // cg = [2*x(1),0,0;2*x(1),2*x(2),0;0,0,2*x(3)];
+ // cgeq = [3*x(1)^2,0,0;0,2*x(2),2*x(3)];
+ // endfunction
+ // //Options
+ // options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", "on","GradCon", "on");
+ // //Calling Ipopt
+ // [x,fval,exitflag,grad,hessian] =intfmincon(f, x0,intcon,A,b,Aeq,beq,lb,ub,nlc,options)
+ // // Press ENTER to continue
// Authors
// Harpreet Singh
@@ -146,14 +232,14 @@ function [xopt,fopt,exitflag,gradient,hessian] = intfmincon (varargin)
//Storing the Input Parameters
fun = varargin(1);
x0 = varargin(2);
- intcon = varargin(3);
- A = varargin(4);
- b = varargin(5);
- Aeq = [];
- beq = [];
- lb = [];
- ub = [];
- nlc = [];
+ intcon = varargin(3);
+ A = varargin(4);
+ b = varargin(5);
+ Aeq = [];
+ beq = [];
+ lb = [];
+ ub = [];
+ nlc = [];
if (rhs>5) then
Aeq = varargin(6);
@@ -282,9 +368,9 @@ options = list('integertolerance',1d-06,'maxnodes',2147483647,'cputime',1d10,'al
options(10) = param(2*i);
case 'gradobj' then
Checktype("intfmincon_options", param(2*i), param(2*i-1), 2*i, "string");
- if(convstr(options(2*i),'l') == "on") then
+ if(convstr(param(2*i),'l') == "on") then
options(12) = "on"
- elseif(convstr(options(2*i),'l') == "off") then
+ elseif(convstr(param(2*i),'l') == "off") then
options(12) = "off"
else
error(999, 'Unknown string passed in gradobj.');
@@ -292,11 +378,11 @@ options = list('integertolerance',1d-06,'maxnodes',2147483647,'cputime',1d10,'al
case 'hessian' then
Checktype("intfmincon_options", param(2*i), param(2*i-1), 2*i, "function");
options(14) = param(2*i);
- case 'GradCon' then
+ case 'gradcon' then
Checktype("intfmincon_options", param(2*i), param(2*i-1), 2*i, "string");
- if(convstr(options(2*i),'l') == "on") then
+ if(convstr(param(2*i),'l') == "on") then
options(16) = "on"
- elseif(convstr(options(2*i),'l') == "off") then
+ elseif(convstr(param(2*i),'l') == "off") then
options(16) = "off"
else
error(999, 'Unknown string passed in gradcon.');
@@ -315,19 +401,20 @@ options = list('integertolerance',1d-06,'maxnodes',2147483647,'cputime',1d10,'al
end
if(options(12) == "on") then
- if(execstr('[grad_y,grad_dy]=fun(x1)','errcatch')==59) then
+ if(execstr('[grad_y,grad_dy]=fun(x0)','errcatch')==59) then
errmsg = msprintf(gettext("%s: Gradient of objective function is not provided"), "intfmincon");
error(errmsg);
end
+ if(grad_dy<>[]) then
Checkvector("intfmincon_options", grad_dy, "dy", 12, nbVar);
+ end
end
if(options(14) == "on") then
- if(execstr('[hessian_y,hessian_dy,hessian]=fun(x1)','errcatch')==59) then
+ if(execstr('[hessian_y,hessian_dy,hessian]=fun(x0)','errcatch')==59) then
errmsg = msprintf(gettext("%s: Gradient of objective function is not provided"), "intfmincon");
error(errmsg);
end
-
if ( ~isequal(size(hessian) == [nbVar nbVar]) ) then
errmsg = msprintf(gettext("%s: Size of hessian should be nbVar X nbVar"), "intfmincon");
error(errmsg);
@@ -338,7 +425,8 @@ options = list('integertolerance',1d-06,'maxnodes',2147483647,'cputime',1d10,'al
numNlec = 0;
numNlc = 0;
- if (type(nlc) == 13 | type(nlc) == 11) then
+ if (type(nlc) == 13 | type(nlc) == 11) then
+ [sample_c,sample_ceq] = nlc(x0);
if(execstr('[sample_c,sample_ceq] = nlc(x0)','errcatch')==21) then
errmsg = msprintf(gettext("%s: Non-Linear Constraint function and x0 did not match"), intfmincon);
error(errmsg);
@@ -387,6 +475,8 @@ options = list('integertolerance',1d-06,'maxnodes',2147483647,'cputime',1d10,'al
function [y,check] = _addnlc(x)
x= x(:)
+ c = []
+ ceq = []
try
if((type(nlc) == 13 | type(nlc) == 11) & numNlc~=0) then
[c,ceq]=nlc(x)
@@ -404,7 +494,10 @@ options = list('integertolerance',1d-06,'maxnodes',2147483647,'cputime',1d10,'al
function [dy,check] = _gradnlc(x)
if (options(16) =="on") then
try
- [y,dy]=nlc(x)
+ [y1,y2,dy1,dy2]=nlc(x)
+ //Adding derivative of Linear Constraint
+ dylin = [A;Aeq]
+ dy = [dy1;dy2;dylin];
[dy,check] = checkIsreal(dy)
catch
dy = 0;
--
cgit