Initializing help system before first use

Non-connected feasible region


Type: Programming
Rating: 2 (easy-medium)
Description: Nonlinear example demonstrating non-connected feasible regions and initial points
File(s): xnlp_nonconnected.mos


xnlp_nonconnected.mos
! XNLP example demonstrating non-connected feasible regions and initial points
!
! This examples defines a feasible region that resembles a uniformly layed out 
! mesh of feasible rectangles 2*2 experiments are carried out:
!  - starting from a random rectangle, can the solver move to another one where 
!    the optimim is?
!  - starting from a random rectangle, can the solver stay in the same rectangle 
!    if the optimim is located there?
! The experiment is repeated with and without model transformation
!
! This example demonstrates a particular non-linear optimization concept as related 
! to Xpress NonLinear.
! The version of the example is for Xpress 7.5.
!
!  (c) 2013 Fair Isaac Corporation
!       author: Zsolt Csizmadia
model mmxnlp_nonconnected
uses "mmxnlp"; 

Mesh := 300..400;

declarations	
  x,y : mpvar
  slp_average, knitro_average : real
  slp_average_stay, knitro_average_stay : real
  reform_slp_average, reform_knitro_average : real
  reform_slp_average_stay, reform_knitro_average_stay : real
end-declarations
x is_free
y is_free

! These constrants define a feasible region resembling a mesh 
sin(x*3.14) >= 0
sin(y*3.14) >= 0

! the target is to get as close to (0,0) as possbile
! it is interesting to see how far a solver can jump between the 
! non-connected parts of the feasible region

forall (PASS in 1..2) do

	if (PASS = 1) then
		! Make sure XNLP does not reformulate the problem, so it is always solved
		! purely with the selected solver
		setparam("xnlp_loadasnl",1)
		setparam("xnlp_reformulate",0)	
	else
		! Allow for reformulation
		setparam("xnlp_loadasnl",0)
		setparam("xnlp_reformulate",-1)	
	end-if			

	writeln("XSLP:")
	setparam("xnlp_solver",XNLP_SOLVER_XSLP)
	if (PASS = 1) then 
		slp_average := 0;
	else
		reform_slp_average := 0;
	end-if
	forall (i in Mesh) do
		setinitval(x,i)	
		setinitval(y,100-i)
		minimize( x^2 + y^2 )
	    if (getparam("xnlp_nlpstatus") <> XNLP_STATUS_LOCALLY_OPTIMAL) then
			writeln("UNEXPECTED solve status!")
		else
		    writeln(i," - ", getobjval)	    
		end-if    
		if (PASS = 1) then 
			slp_average := slp_average + getobjval;
		else 
			reform_slp_average := reform_slp_average + getobjval;
		end-if
	end-do
	if (PASS = 1) then 
		slp_average := slp_average / getsize(Mesh);
	else
		reform_slp_average := reform_slp_average / getsize(Mesh);
	end-if
	
	writeln
	writeln("----------------------")
	writeln("Knitro:")
	setparam("xnlp_solver",XNLP_SOLVER_KNITRO)
	if (PASS = 1) then 
		knitro_average := 0;
	else
		reform_knitro_average := 0;
    end-if
	forall (i in Mesh) do
		setinitval(x,i)	
		setinitval(y,100-i)
		minimize( x^2 + y^2 )
	    if (getparam("xnlp_nlpstatus") <> XNLP_STATUS_LOCALLY_OPTIMAL) then
			writeln("UNEXPECTED solve status!")
		else
		    writeln(i," - ", getobjval)	    
		end-if    
		if (PASS = 1) then 
			knitro_average := knitro_average + getobjval;
		else
			reform_knitro_average := reform_knitro_average + getobjval;
		end-if
	end-do
	if (PASS = 1) then 
		knitro_average := knitro_average / getsize(Mesh);
	else		
		reform_knitro_average := reform_knitro_average / getsize(Mesh);
	end-if
	
	
	writeln("XSLP:")
	setparam("xnlp_solver",XNLP_SOLVER_XSLP)
	if (PASS = 1) then 
		slp_average_stay := 0;
	else
		reform_slp_average_stay := 0;
	end-if
	forall (i in Mesh) do
		setinitval(x,i)	
		setinitval(y,100-i)
		minimize( (x-i)^2 + (y-(100-i))^2 )
	    if (getparam("xnlp_nlpstatus") <> XNLP_STATUS_LOCALLY_OPTIMAL) then
			writeln("UNEXPECTED solve status!")
		else
		    writeln(i," - ", getobjval)	    
		end-if    
		if (PASS = 1) then		
			slp_average_stay := slp_average_stay + getobjval;
		else
			reform_slp_average_stay := reform_slp_average_stay + getobjval;
		end-if
	end-do
	if (PASS = 1) then		
		slp_average_stay := slp_average_stay / getsize(Mesh);
	else
		reform_slp_average_stay := reform_slp_average_stay / getsize(Mesh);
	end-if
	
	writeln
	writeln("----------------------")
	writeln("Knitro:")
	setparam("xnlp_solver",XNLP_SOLVER_KNITRO)
	if (PASS = 1) then		
		knitro_average_stay := 0;
	else
		reform_knitro_average_stay := 0;
	end-if
	forall (i in Mesh) do
		setinitval(x,i)	
		setinitval(y,100-i)
		minimize( (x-i)^2 + (y-(100-i))^2 )
	    if (getparam("xnlp_nlpstatus") <> XNLP_STATUS_LOCALLY_OPTIMAL) then
			writeln("UNEXPECTED solve status!")
		else
		    writeln(i," - ", getobjval)	    
		end-if    
		if (PASS = 1) then		
			knitro_average_stay := knitro_average_stay + getobjval;
		else
			reform_knitro_average_stay := reform_knitro_average_stay + getobjval;
		end-if
	end-do
	if (PASS = 1) then		
		knitro_average_stay := knitro_average_stay / getsize(Mesh);
	else
		reform_knitro_average_stay := reform_knitro_average_stay / getsize(Mesh);
	end-if
end-do

writeln
writeln("I. NLP formulation as is")
writeln("Move towards a selected cell:")
writeln("----------------------")
writeln("Average distance:")
writeln("XSLP   : ", slp_average)
writeln("Knitro : ", knitro_average)
writeln
writeln("Stay in the starting cell:")
writeln("----------------------")
writeln("Average distance:")
writeln("XSLP   : ", slp_average_stay)
writeln("Knitro : ", knitro_average_stay)
writeln
writeln

! Reformulating allows for a more global view in terms of the quadratic objective
writeln("II. Reformulated")
writeln("Move towards a selected cell:")
writeln("----------------------")
writeln("Average distance:")
writeln("XSLP   : ", reform_slp_average)
writeln("Knitro : ", reform_knitro_average)
writeln
writeln("Stay in the starting cell:")
writeln("----------------------")
writeln("Average distance:")
writeln("XSLP   : ", reform_slp_average_stay)
writeln("Knitro : ", reform_knitro_average_stay)

end-model


© 2001-2020 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.