The following program calculates the minimum point of a multi-variable function using the grid search method. This method performs a multi-dimensional grid search. The grid is defined by a multiple dimensions. Each dimension has a range of values. Each range is divided into a set of equal-value intervals. The multi-dimensional grid has a centroid which locates the optimum point. The search involves multiple passes. In each pass, the method local a node (point of intersection) with the least function value. This node becomes the new centroid and builds a smaller grid around it. Successive passes end up shrinking the multidimensional grid around the optimum.
The program prompts you to enter for each variable (i.e. dimension):
1. The values that define the lower and upper limits of a search range for a variable,
2. The number of divisions for a range.
3. The minimum range value, used to determine when to stop searching..
The program also asks you to enter the function tolerance. The program uses this value to possible stop iterating when successive best function values are close enough.
The program displays intermediate values for the function and the variables. The program displays the following final results:
1. The coordinates of the minimum point.
2. The minimum function value.
3. The number of iterations
The current code finds the minimum for the following function:
f(x1,x2) = 10 + (x1 ^ 2 - 1) ^ 2 + (x2^2 - 2) ^ 2
Here is a sample session to solve for the optimum of the above function:
Here is the BASIC listing:
! Grid Search Optimization OPTION TYPO OPTION NOLET DECLARE NUMERIC MAX_VARS, MAX_ITER DECLARE NUMERIC N, I, J, Iter DECLARE NUMERIC F, XX DECLARE NUMERIC BestF, LastBestF, EPSF DECLARE NUMERIC bGoOn, bTrue, bFalse DIM NumDiv(1) DIM X(1), XBest(1), XCenter(1) DIM Delta(1), MinDelta(1) DIM XLo(1), XHi(1) bTrue = 1 bFalse = 0 SUB MyFx(X(), N, funRes) LOCAL I funRes = 10 For I = 1 To N funRes = funRes + (X(I) ^ 2 - I) ^ 2 Next I End Sub ! Grid Search Optimization ! ! Routine performs grid search. The iterations relocate the centroid to be the current optimum. ! The routine srhinks the grid size in each iteration. ! ! MAX_VARS = 2 MAX_ITER = 5000000 MAT REDIM NumDiv(MAX_VARS) MAT REDIM X(MAX_VARS), XBest(MAX_VARS), XCenter(MAX_VARS) MAT REDIM Delta(MAX_VARS), MinDelta(MAX_VARS) MAT REDIM XLo(MAX_VARS), XHi(MAX_VARS) N = MAX_VARS PRINT "Grid Search Optimization" For I = 1 To N ! Get lower range PRINT "XLow(";I;")"; INPUT Xlo(I) ! Get upper range PRINT "XHigh(";I;")"; INPUT XHi(I) ! Calculate center XCenter(I) = (XLo(I) + XHi(I)) / 2 ! Get number of divisions PRINT "Number of divisions for X(";I;")"; INPUT NumDiv(I) ! Calculate initial search step Delta(I) = (XHi(I) - XLo(I)) / NumDiv(I) ! Get minimum search step PRINT "Minimum search step for X(";I;")"; INPUT MinDelta(I) X(I) = XLo(I) ! set initial X Next I INPUT PROMPT "Enter function tolerance? ": EPSF ! calculate and display function value at initial point CALL MyFx(XCenter, N, BestF) LastBestF = 100 + BestF Iter = 0 Do Do Iter = Iter + 1 CALL MyFx(X, N, F) If F < BestF Then LastBestF = BestF BestF = F For I = 1 To N XBest(I) = X(I) Next I End If !***************************************************** ! The next For loop implements a programming trick ! that simulated nested loops using just one For loop !***************************************************** ! search next grid node For I = 1 To MAX_VARS If X(I) >= XHi(I) Then If I < MAX_VARS Then X(I) = XLo(I) Else Exit Do End If Else X(I) = X(I) + Delta(I) Exit For End If Next I Loop Iter = Iter + 1 PRINT "Best F = "; BestF;" "; For I = 1 To N PRINT "X(";I;") = ";XBest(I);" "; XCenter(I) = XBest(I) Delta(I) = Delta(I) / NumDiv(I) XLo(I) = XCenter(I) - Delta(I) * NumDiv(I) / 2 XHi(I) = XCenter(I) + Delta(I) * NumDiv(I) / 2 X(I) = XLo(I) ! reset array X Next I PRINT bGoOn = bFalse For I = 1 To N If Delta(I) > MinDelta(I) Then bGoOn = bTrue Next I If (Abs(BestF - LastBestF) <= EPSF) OR (Iter > MAX_ITER) Then bGoOn = bFalse End If Loop While bGoOn = bTrue PRINT "********FINAL RESULTS***********" For I = 1 To N PRINT "X(";I;") = ";XBest(I) Next I PRINT "Function value =";BestF PRINT "Iterations = ";Iter END
Copyright (c) Namir Shammas. All rights reserved.