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;
call ReadMember(selected,1,w);
/* 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;