1

我遇到了在 NLopt 软件中实现的少数全局优化算法的问题。特别是,ESCH(进化算法)在我的情况下无法正常工作,能量函数称为大量迭代,能量不会改变。这就是我的代码调用函数的方式

    void OPTIMIZESTRUCTURENLOPT (Conformer **conformer, 
    long int NBONDS, Fragment *fragments, 
    long int NATOMS, long int ITER, double TESTSIZE) {

    //  printf("Start of opt\n");
    long int i1, j, ii;
    nlopt_opt opt;
    opt = nlopt_create(NLOPT_GN_ESCH, NBONDS);
    nlopt_set_min_objective(opt, ENERGYNLOPT, (void *) (*conformer));
    nlopt_set_xtol_rel(opt, 1e-3);

    // the initial guess
    (**conformer).IT=0;
    double *x = malloc(NBONDS*sizeof(double)); //   [NBONDS];
    double *dx = malloc(NBONDS*sizeof(double)); //[NBONDS];
    double *lb = malloc(NBONDS*sizeof(double));
    double *ub = malloc(NBONDS*sizeof(double));
    for (i1=0;i1<NBONDS;i1++) {
        x[i1] = (**conformer).angles[i1];
        dx[i1] = 0.1;
        lb[i1] = -360;
        ub[i1] = 360;
    }
    nlopt_set_initial_step(opt, dx);
    nlopt_set_lower_bounds(opt, lb);
    nlopt_set_upper_bounds(opt, ub);
   //   printf ("Start: ");
    for (i1=0;i1<NBONDS;i1++) {
    //      printf ("%f ", x[i1]);
    }
    //  printf ("\n");

    //////////////////////////////////////////////

    nlopt_opt opt_loc;
    opt_loc = nlopt_create(NLOPT_LN_PRAXIS, NBONDS);
    nlopt_set_local_optimizer(opt, opt_loc);
    nlopt_set_xtol_rel(opt_loc, 1e-5);
    nlopt_set_ftol_rel(opt_loc, 1e-5);

    double minf; // the energy function value
    if (nlopt_optimize(opt, x, &minf) < 0) {
        printf ("nlopt failed!\n");
     }
    else {
        printf ("found minimum after (%li) iterations = %0.010g\n", 
     (**conformer).IT, minf);
        for (i1=0;i1<NBONDS;i1++) {
    //          printf ("%f ", x[i1]);
        }
    //      printf ("\n");
     }

这是能量函数调用:

Iter: 10047  E = -1629.325853 
Iter: 10048  E = -1629.325853 
Iter: 10049  E = -1629.325853 
Iter: 10050  E = -1629.325853 
Iter: 10051  E = -1628.944283 
Iter: 10052  E = -1629.325853 
Iter: 10053  E = -1629.325853 
Iter: 10054  E = -1628.997908 
Iter: 10055  E = -1629.325853 
Iter: 10056  E = -1629.325853 
Iter: 10057  E = -1629.325853 
Iter: 10058  E = -1629.325853 
Iter: 10059  E = -1629.325853 
Iter: 10060  E = -1629.325853 
Iter: 10061  E = -1629.325853 
Iter: 10062  E = -1629.325853 
Iter: 10063  E = -1629.325853 
Iter: 10064  E = -1629.325853 
Iter: 10065  E = -1629.325853 
Iter: 10066  E = -1629.325853 
Iter: 10067  E = -1629.325853 
Iter: 10068  E = -1629.325853 
Iter: 10069  E = -1629.325853 
Iter: 10070  E = -1628.745543 
Iter: 10071  E = -1629.325853 
Iter: 10072  E = -1629.325853 
Iter: 10073  E = -1629.325853 
Iter: 10074  E = -1629.325853 
Iter: 10075  E = -1629.325853 
Iter: 10076  E = -1629.325853 
Iter: 10077  E = -1628.540874 
Iter: 10078  E = -1629.325853 
Iter: 10079  E = -1629.325853 
Iter: 10080  E = -1629.325853 

其他算法效果更好——比如 ISRES(改进的随机排序进化策略)和具有局部突变的受控随机搜索(CRS)。

任何提示/想法?

4

0 回答 0