11#include " dds.h"
2+ #include " ssc.h"
23
34OptDDS::OptDDS (const DDSCfg &cfg,const box_const ¶mbox,bool verbose)
4- :Opt(parambox),cfg(cfg),verbose(verbose)
5+ :Opt(parambox),cfg(cfg),
6+ verbose(verbose)
57{
68}
79
@@ -33,38 +35,23 @@ Opt::ppoint OptDDS::run_single(opt_func func,const vec1D &xstart)
3335 if (verbose) std::cout << xb.first << ' \n ' ;
3436
3537 double sigma=cfg.sigma_init ;
36- # ifdef DDS_SIGMA_ADAPT
37- int c_succ= 0 ,c_fail= 0 ;
38- # endif
38+
39+ // step size control
40+ SSC0 ssc (cfg. c_succ_max ,cfg. c_fail_max );
3941
4042 while (nfunc<cfg.nfunc_max ) {
4143 ppoint x_gen;
4244 x_gen.second =generate_candidate (xb.second ,nfunc,sigma);
4345 x_gen.first =func (x_gen.second );
44-
45- #ifndef DDS_SIGMA_ADAPT
46- if (x_gen.first <xb.first )
47- xb = x_gen;
48- #else
49- if (x_gen.first <xb.first ) {
50- xb=x_gen;
51-
52- c_succ+=1 ;
53- c_fail=0 ;
54- } else {
55- c_fail+=1 ;
56- c_succ=0 ;
57- };
58-
59- if (c_succ >= cfg.c_succ_max ) {
60- sigma=std::min (2.0 *sigma,cfg.sigma_max );
61- c_succ=0 ;
62- } else if (c_fail >= cfg.c_fail_max ) {
63- sigma=std::max (sigma/2.0 ,cfg.sigma_min );
64- c_fail=0 ;
65- }
66- #endif
6746 nfunc++;
47+
48+ double lambda=0.0 ;
49+ if (x_gen.first <xb.first ) {
50+ xb = x_gen;
51+ lambda=1.0 ;
52+ }
53+ sigma = ssc.update (sigma,lambda);
54+
6855 if (verbose) std::cout << " DDS " << std::format (" {:5}" ,nfunc) << " : " << std::format (" {:0.4f}" ,xb.first ) << " s=" << sigma << " \r " ;
6956 }
7057 return xb;
@@ -80,9 +67,12 @@ Opt::ppoint OptDDS::run_mt(opt_func func,const vec1D &xstart)
8067
8168 double sigma=cfg.sigma_init ;
8269
70+ // step size control
71+ SSC1 ssc (0.05 ,0.10 ,0.05 );
72+
8373 int nfunc=1 ;
8474 while (nfunc<cfg.nfunc_max ) {
85- int nthreads = std::min (cfg.nfunc_max -nfunc,cfg.num_threads );
75+ const int nthreads = std::min (cfg.nfunc_max -nfunc,cfg.num_threads );
8676
8777 // generate candidates around current xbest
8878 opt_points x_gen (nthreads);
@@ -91,14 +81,21 @@ Opt::ppoint OptDDS::run_mt(opt_func func,const vec1D &xstart)
9181 nfunc++;
9282 };
9383
94- eval_points_mt (func,std::span ( x_gen) );
84+ eval_points_mt (func,x_gen);
9585
9686 // select
97- for (int i=0 ;i<nthreads;i++)
98- if (x_gen[i].first <xb.first )
99- xb = x_gen[i];
87+ ppoint xb_old=xb;
88+ int nsucc=0 ;
89+ for (const auto &xg : x_gen)
90+ if (xg.first <xb_old.first ) {
91+ nsucc++; // count as success, if better than parent
92+ if (xg.first < xb.first ) // replace overall best
93+ xb = xg;
94+ }
95+ double lambda=nsucc/static_cast <double >(nthreads);
96+ sigma=ssc.update (sigma,lambda);
10097
101- if (verbose) std::cout << " DDS mt=" << nthreads << " : " << std::format (" {:5}" ,nfunc) << " : " << std::format (" {:0.4f}" ,xb.first ) << " s=" << std::format (" {:0.3f}" ,sigma) << " \r " ;
98+ if (verbose) std::cout << " DDS mt=" << nthreads << " : " << std::format (" {:5}" ,nfunc) << " : " << std::format (" {:0.4f}" ,xb.first ) << " s=" << std::format (" {:0.3f}" ,sigma) << " , p_succ= " << ssc. p_succ << " \r " ;
10299 }
103100 return xb;
104101}
@@ -108,7 +105,7 @@ OptDDS::ppoint OptDDS::run(opt_func func,const vec1D &xstart)
108105 assert (pb.size ()==xstart.size ());
109106
110107 ppoint pbest;
111- if (cfg.num_threads <=1 ) pbest=run_single (func,xstart);
108+ if (cfg.num_threads <=0 ) pbest=run_single (func,xstart);
112109 else pbest=run_mt (func,xstart);
113110
114111 if (verbose) std::cout << ' \n ' ;
0 commit comments