## Nonlinear Objective and Constraints Using Repair(ga2)

```
/*****************************************************************/
/*                                                               */
/*          S A S   S A M P L E   L I B R A R Y                  */
/*                                                               */
/*    NAME: ga2                                                  */
/*   TITLE: Nonlinear Objective and Constraints Using Repair(ga2)*/
/* PRODUCT: OR                                                   */
/*  SYSTEM: ALL                                                  */
/*    KEYS: OR                                                   */
/*   PROCS: GA                                                   */
/*    DATA:                                                      */
/*                                                               */
/* SUPPORT:                             UPDATE:                  */
/*     REF:                                                      */
/*    MISC: Example 2 from the GA chapter of Local Search        */
/*          Optimization.                                        */
/*                                                               */
/*****************************************************************/

proc ga seed = 555;
call SetEncoding('R3R2');
npoints = 3;
array cvxhull[3,2] /nosym ( -2 0
0 2
2 -2 );
/* Objective function */
function sixhump(selected[*],cvxhull[*,*],npoints);
/* Function has global minimum value of -1.0316
* at x = {-0.0898  0.7126} and
*    x = { 0.0898 -0.7126}
*/
array w[1] /nosym;
call dynamic_array(w,npoints);
array x[2] /nosym;
/* make sure that weights add up to 1 */
sum = 0;
do i = 1 to npoints;
sum + w[i];
end;
/* if all weights 0, then reinitialize */
if sum=0 then do;
sum = npoints;
do i = 1 to npoints;
w[i] = 1;
end;
end;
/* re-normalize weights */
do i = 1 to npoints;
w[i] = w[i] / sum;
end;
call WriteMember(selected,1,w);
/* convert weights to x-coordinate form */
x[1] = 0;
x[2] = 0;
do i = 1 to npoints;
x[1] + w[i] * cvxhull[i,1];
x[2] + w[i] * cvxhull[i,2];
end;
/* write out x coordinates to second segment */
call WriteMember(selected,2,x);
/* compute objective value */
r = (4 - 2.1*x[1]**2 + x[1]**4/3)*x[1]**2 + x[1]*x[2] +
(-4 + 4*x[2]**2)*x[2]**2;
return(r);
endsub;
call SetObjFunc('sixhump',0);
array lower[1] /nosym;
array upper[1] /nosym;
call dynamic_array(lower, npoints);
call dynamic_array(upper, npoints);
do i = 1 to npoints;
lower[i] = 0;
upper[i] = 1;
end;
call SetBounds(lower, upper, 1);
array delta[3] /nosym (0.01 0.01 0.01);
call SetMut('delta', 'nchange', 1, 'delta', delta);
call SetMutProb(0.05);
call SetCross('Twopoint', 'alpha', 0.9);
call SetCrossProb(0.8);
call SetSel('tournament', 'size', 2);
call SetElite(3);
call Initialize('DEFAULT', 200);
call ContinueFor(200);
run;

```