Error costs and penalty multipliers
Nonlinear example demonstrating the role of setting the value of penalty multipliers
Further explanation of this example: 'Xpress NonLinear Reference Manual'
! XNLP example demonstrating the role of setting the value of penalty multipliers ! and demonstrating the effect of the penalty terms in the solution process ! and also the role of nonlinear infeasiblity ! ! This is an SLP specific example. ! In this example a hihgly combinatorial and hihgly nonlienar problem is solved. ! The high constraint nonlinear gives rise to very large violations that needs ! attention otherwise SLP overcompensates. ! The example also demonstrates how feasibility and integrality might interact in ! an MINLP search. ! ! 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 ! ! Based on AMPL model seven11.mod by M.J.Chlond ! Source: alt.math.recreational ! Mosel version by S.Heipcke model "seven11" uses "mmxnlp", "mmsystem" ! A function to translate the status of the solver ot text public function nlpstatustext(val: integer): text case val of XNLP_STATUS_UNSTARTED: returned:= "NLP solving not started." XNLP_STATUS_LOCALLY_OPTIMAL: returned:= "Local optimum found." XNLP_STATUS_OPTIMAL: returned:= "Optimal solution found." XNLP_STATUS_LOCALLY_INFEASIBLE: returned:= "NLP locally infeasible." XNLP_STATUS_INFEASIBLE: returned:= "Problem is infeasible." XNLP_STATUS_UNBOUNDED: returned:= "Problem is unbounded." XNLP_STATUS_UNFINISHED: returned:= "NLP solving unfinished." end-case end-function declarations m = 4 ! Number of variables M = 1..m x: array(M) of mpvar start : real; end-declarations !setparam("xnlp_verbose",true) forall(i in M) x(i) is_integer forall(i in M) x(i) >= 1 forall(i in M) x(i) <= 708 711 = sum(i in M) x(i) 711000000 = x(1)*x(2)*x(3)*x(4) ! Solve the problem using SLP writeln("Solving seven11 using defaults:") setparam("xnlp_solver",XNLP_SOLVER_XSLP) start := gettime minimize(0) writeln(" solver returned status = ",nlpstatustext(getparam("XNLP_STATUS")), " in ", gettime-start,"s") writeln writeln ! The solution out of the box with SLP will fail due to unresonable error costs ! and automatic row enforcement ! This is due to the very large deviation from the nonlienar surface, and the ! consequent very large error cost setcallback(XSLP_CB_INTSOL, "IntegerSolutionCallback") ! Set the initial errorcost small. This can be done freely, as there is no ! net objective in the model to consider ! Observe the unexpected objetcive values in the MIP search ! As the very last iteration shows, those are in fact the errorcosts! setparam("xslp_errormaxcost",1) writeln("Solving seven11 using reduced errormaxcost:") start := gettime minimize(0) writeln(" solver returned status = ",nlpstatustext(getparam("XNLP_STATUS")), " in ", gettime-start,"s") writeln writeln ! The solution is to address the accuracy in terms of the feasibility of the ! nonlienar constraints setparam("xslp_ecftol_a",1e-6) setparam("xslp_ecftol_r",1e-6) writeln("Solving seven11 using reduced errormaxcost and stricter feasibility ", "requirements:") start := gettime minimize(0) writeln(" solver returned status = ",nlpstatustext(getparam("XNLP_STATUS")), " in ", gettime-start,"s") writeln writeln ! final solution printing forall(i in M) writeln(i, ": ", getsol(x(i))) ! Printing a solution while performing the MIP search function IntegerSolutionCallback:integer writeln("+Integer solution:") write(" ") forall(i in M) write("x(",i,")=", getsol(x(i))," ") writeln writeln(" Sum = ", sum(i in M) getsol(x(i))) writeln(" Prod = ", floor(x(1).sol*x(2).sol*x(3).sol*x(4).sol)) end-function end-model
|Copyright 2017 Fair Isaac Corporation.|