Програмую я тут одну задачку, трапився в ній код, наведений нижче. При чому, даний код викликається дуже часто, займаючи третину часу роботи програми.
Код, варіант 1:
Код, варіант 1:
double hamiltonian(const FK_GA_c::Individual & _indi) { double sum = 0; for (unsigned i = 0; i < _indi.size(); i=i+2) { //i -- n_f, //i+1 -- n_d double n_f_i = _indi[i]; double n_d_i = _indi[i+1]; sum-=defparams.mu_f*n_f_i; sum-=defparams.mu_d*n_d_i; sum+=defparams.U*n_f_i*n_d_i; // auto i_plus_1 = i+2; //i+1 в математичному сенсі --- наступний вузол // Циклічні граничні умови if(i_plus_1>=_indi.size()-1) i_plus_1=0; double n_f_i_1 = _indi[i_plus_1]; double n_d_i_1 = _indi[i_plus_1+1]; double base_hopping = (1-n_d_i)*n_d_i_1; double hopping=defparams.t1; hopping+=defparams.t2*(n_f_i+n_f_i_1); hopping+=defparams.t3*(n_f_i*n_f_i_1); hopping*=base_hopping; sum+=hopping; } return -sum; }
Це давня робоча версія, яка має ряд фундаментальних недоліків, але навряд чи мені буде охота повторювати весь цей цикл модифікацій, про які розповідатиму, заново -- треба зразу нормально писати :-), тому ілюструвати буду на ній. Сподіваюся, пробачите деякі вульгарності.