Optimizing with a Generating Set Search Method (GSS)

OptGSS is an implementation of a derivative-free algorithm for unconstrained optimization called Generating Set Search. In GSS, the next point in the optimization is determined solely by the value of the function on a set of points around the current point. These search points are generated from a fixed set of directions, called the generating set, hence the name of the algorithm. The evaluation of the function on the search points, or search step, lends itself naturally to a parallel implementation.

In this example, we outline the steps needed to set up GSS, taking advantage of a parallel computing environment if present. Further information and examples can be found in the Setting up and Solving an Optimization Problem section.

First, include the header files. The MPI header file is included if and only if the program is compiled with the MPI flag.

    #ifdef HAVE_CONFIG_H
    #include "OPT++_config.h"
    #endif

    #include <iostream>
    #include <fstream>
    #ifdef HAVE_STD
    #include <cstdio>
    #else
    #include <stdio.h>
    #endif 

    #ifdef WITH_MPI
    #include "mpi.h"
    #endif 

    #include "GenSet.h"
    #include "OptGSS.h"
    #include "NLF.h"
 
    #include "tstfcn.h"
 
    using NEWMAT::ColumnVector;
    using std::cerr;
 
    using namespace OPTPP;

Next, we have a subroutine declaration particular to this example. The subroutine takes in a string that identifies one of the test problems defined in tstfcn.h and returns the objective and initialization functions for that problem.

   void SetupTestProblem(string test_id, USERFCN0 *test_problem, INITFCN *init_problem);

After an argument check, initialize MPI. This does not need to be done within an "ifdef", but if you want the option of also building a serial version of your problem, then it should be. (Note: An argument check is used here because this example is set up to work with multiple problems. Such a check is not required by OPT++.)

   int main (int argc, char* argv[])
{
    if (argc != 3) {
        cout << "Usage: tstgss problem_name ndim\n";
        exit(1);
    } 
    #ifdef WITH_MPI
        int me;
        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &me);
     #endif

Define the variables.

    string test_id = argv[1];
    int    ndim    = atoi(argv[2]);

    ColumnVector x(ndim);
    SetupTestProblem(test_id, &test_problem, &init_problem);

Now set up the output file. If you are running in parallel, you may want to designate an output file for each processor. Otherwise, the output from all of the processors will be indiscriminantly intertwined in a single file. If the function evaluation does any file I/O, you should set up a working directory for each processor and then have the each process chdir (or something comparable) into its corresponding directory. Each working directory should have a copy of the input file(s) needed by the function evaluation. If the function evaluation requires file I/O and working directories are not used, the function evaluation will not work properly.

    char outfname[20];
    sprintf(outfname,"%s.out",test_id);
    #ifdef WITH_MPI 
    sprintf(outfname,"%s.%d", outfname, me); 
    #endif

Next construct a nonlinear problem object of the given dimension, with the functions obtained from the SetupTestProblem routine.

    NLF0 nlp(ndim, test_problem, init_problem);              

Create a GSS algorithm object with a nonlinear problem and standard generating set object of dimension dim .

    GenSetStd gs(ndim);                              
    OptGSS optobj(&nlp, &gs);     

After constructing the GSS algorithm object, we can adjust the algorithm's default parameters, starting with the output file name. The next three parameters common to all OPT++ algorithms. The last parameter is specific to OptGSS: if "full-search" is true, the algorithm evaluates all directions around the current point searching for the point with greatest function decrease; otherwise the current search-step stops once a point of sufficient decrease is found.

    optobj.setOutputFile(outfname);
    optobj.setMaxIter(1000); 
    optobj.setMaxFeval(10000); 
    optobj.setFcnTol(1e-9);  
    optobj.setFullSearch(true);

Optimize and clean up.

    optobj.optimize();

    optobj.printStatus("Final Status:");

    optobj.cleanup();

Finally, shutdown MPI.

    #ifdef WITH_MPI
      MPI_Finalize();
    #endif
    
}

Next Section: Optimization Methods | Back to Main Page

Last revised September 14, 2006


Bug Reports    OPT++ Developers    Copyright Information    GNU Lesser General Public License
Documentation, generated by , last revised August 30, 2006.