ssize_t MemKeyCache::Del(const char* pKey,const ssize_t KEYSIZE) { ssize_t iOldDataFlag = 0; ssize_t iRet = _Del(pKey,KEYSIZE,iOldDataFlag); if(iRet != 0) { return iRet; } if (m_iBinLogOpen) { if(iOldDataFlag != F_DATA_CLEAN) { char szTmpBuffer[MIN_DATA_LEN+MAX_KEY_LEN]; *(char*)szTmpBuffer = op_del; ssize_t iEncodeLen = EncodeBufferKeyFormat(szTmpBuffer+sizeof(char),MIN_DATA_LEN+MAX_KEY_LEN-sizeof(char), iOldDataFlag,KEYSIZE,pKey); ASSERT(iEncodeLen > 0) ssize_t iRet = m_stBinLog.WriteToBinLog(szTmpBuffer,sizeof(char)+iEncodeLen); if(iRet != 0) return E_WRITE_BINLOG; } } return 0; }
//------------------- search ---------------------- void CIncrementalImprovement::search(){ int trial; //Генерируем случайное решение while (_Add()); //Сохраняем найденное решение BestCost = CurCost; BestProfit = CurProfit; for (int i = 0; i < NumItem; i++) best[i] = cur[i]; //Несколько раз удаляем произвольную инвестицию и добавляем новую(ые) и сохраняем лучшее for (trial = 0; trial < NumItem; trial++){ //Удаляем произвольную инвестицию _Del(); //Случайный выбор до тех пор, пока не исчерпан лимит средств while (_Add()); //Лучше полученное решение предыдущего? //Если Да, то сохраняем изменения, если Нет, то отказываемся от полученного решения if (CurProfit > BestProfit){ BestProfit = CurProfit; BestCost = CurCost; for (int i = 0; i < NumItem; i++) best[i] = cur[i]; } else{ CurProfit = BestProfit; CurCost = BestCost; for (int i = 0; i < NumItem; i++) cur[i] = best[i]; } } }
//------------------- search ---------------------- void CStopMoment::search(){ int bad_trials, non_changes; bad_trials = 0; //Испытания повторяются до тех пор, //пока не досигнем NumItem испытаний в строке без изменений do{ //Генерируем случайное решение while (_Add()); //Начинаем работать с этим решением как с испытываемым int trial_cost = CurCost; int trial_profit = CurProfit; bool *trial_bool = new bool[NumItem]; for (int i = 0; i < NumItem; i++) trial_bool[i] = cur[i]; //Повторяем до тех пор, пока не попробуем //NumItem изменений в строке без улучшения non_changes = 0; while (non_changes < NumItem){ //Удаление случайного элемента _Del(); //Случайный выбор до тех пор, пока не исчерпан лимит средств while (_Add()); //Если это улучшает решение, сохраняем его, //в противном случае востанавливаем исходные значения if (CurProfit > trial_profit){ trial_profit = CurProfit; trial_cost = CurCost; for (int i = 0; i < NumItem; i++) trial_bool[i] = cur[i]; non_changes = 0; //Это хооршее изменение } else{ CurProfit = trial_profit; CurCost = trial_cost; for (int i = 0; i < NumItem; i++) cur[i] = trial_bool[i]; ++non_changes; //Это плохое изменение } } //Конец While - попытки изменения //Если испытание является наилучшим решением на данный момент, //сохраняем его if (trial_profit > BestProfit){ BestProfit = trial_profit; BestCost = trial_cost; for (int i = 0; i < NumItem; i++) best[i] = trial_bool[i]; bad_trials=0; // Это хорошее испытание } else ++bad_trials; //Это плохое испытание //Сброс исследуемого решения для следующего испытания CurProfit = 0; CurCost = 0; for (int i = 0; i < NumItem; i++) cur[i] = false; } while (bad_trials >= NumItem); }
//--------------------------------------------------------- void CWKSP_Data_Menu_File::Del(const wxString &FileName) { if( m_Recent && m_Recent_Count > 0 ) { wxString s_tmp(FileName); for(int i=m_Recent_Count-1; i>=0; i--) { if( m_Recent[i].Cmp(s_tmp) == 0 ) { _Del(m_Recent_First + i); } } } }
// ------------------ search ---------------------- void CLocalOptimum::search() { int bad_tests, // кол-во неэффективных испытаний bad_changes; // кол-во неэффективных изменений trial = new bool[NumItem]; // Испытания поторяются до тех пор, пока // не произойдет max_bad_test испытаний без улучшений. bad_tests = 0; while (bad_tests <= max_bad_tests) { // формирование начального случайного решения while (_Add()); TrialProfit = CurProfit; TrialCost = CurCost; for (int i=0; i<NumItem; i++) trial[i] = cur[i]; // Повторять до max_bad_changes отсутствия улучшений в решениях. bad_changes = 0; while (bad_changes <= max_bad_changes) { // Удаление num случайных элементов for (int i=0; i<num; i++) _Del(); // Добавление num случайных элементов while (_Add()); // Если данное изменение улучшает решение, то сохраняю его. // Иначе восстанавливаю предыдущее. if (CurProfit > TrialProfit) { // Сохранение решения TrialProfit = CurProfit; TrialCost = CurCost; copybool(cur, trial); bad_changes = 0; // Сброс счетчика плохих изменений } else { // Восстановление решения CurProfit = TrialProfit; CurCost = TrialCost; copybool(trial, cur); ++bad_changes; // Очередное плохое изменение } } // while (bad_changes <= max_bad_changes) // Если это испытание лучше лучшего, то его нужно сохранить. if (TrialProfit > BestProfit) { BestProfit = TrialProfit; BestCost = TrialCost; copybool(trial, best); bad_tests = 0; // Сброс счетчика прохих решений } else ++bad_tests; // Очередное плохое решение // Очистка текущего решения CurProfit = 0; CurCost = 0; for (int i=0; i<NumItem; i++) cur[i] = false; } delete[] trial; }
// ------------------ search ---------------------- void CSimulatedAnnealing::search() { if (NumItem < 2) return; // поиск максимальной и минимальной прибыли int max_profit = invest[0].profit, min_profit = max_profit; for (int i=1; i<NumItem; i++) { if (max_profit < invest[i].profit) max_profit = invest[i].profit; if (min_profit > invest[i].profit) min_profit = invest[i].profit; } // начальное значение T float T = 0.75 * (max_profit - min_profit); // формирование начального случайного решения while (_Add()); // принятия случайного решения как лучшего BestProfit = CurProfit; BestCost = CurCost; for (int i=0; i<NumItem; i++) best[i] = cur[i]; int num_save = 0, num_unch = 0; bool save_changed, save; while (num_unch < MaxUnchanged) { // удаление K_ch случайных элементов for (int i=0; i<K_ch; i++) _Del(); // добавление K_ch случайных элементов while (_Add()); // если есть улучшение if (CurProfit > BestProfit) { save_changed = true; save = false; } else if (CurProfit == BestProfit) { // формула вероятности даст 1 save = save_changed = false; } else { // нужно ли сохранять решение save = save_changed = (rand() < expl(abs(CurProfit - BestProfit)/T)); } // если нужно сохранить новое решение if (save_changed) { // сохраняю новое решение BestProfit = CurProfit; BestCost = CurCost; copybool(cur, best); num_unch = 0; // было сохранено изменение } else { // восстановление пердыдущего решения CurProfit = BestProfit; CurCost = BestCost; copybool(best, cur); ++num_unch; } // если сохранено решение, которое НЕ ЛУЧШЕ предыдущего if (save) { if (++num_save > MaxSaved) { num_save = 0; T *= 0.8; num_unch = 0; } } // if (save) } // while (num_unch < MaxUnchanged) }