Example #1
0
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)

}