45
Программа поиска минимального значения скалярной функции,
зависящей от нескольких независимых аргументов.

 

Назначение:
в начало

Предлагаемые Вашему вниманию модули предназначены для решения задачи определения миниума скалярной функции f(x1,…,xn) нескольких независимых скалярных переменных, область изменения которых, представляет из себя n-мерный параллепипед (xmin <= x <= xmax)

Алгоритмы:
в начало

Краткое описание компонент:

Модуль ChkRSearcher.exe - выполняет поиск минимального значения пользовательской функции, загружаемой через dll (Win32 API Dynamic Link Library)
в начало

rsrchr1.jpg (35032 bytes)

Он позволяет:

Библиотека MyFunction.dll – содержащая пользовательскую минимизируемую функцию

Общие сведенья:
в начало

Как это видно из описания ChkRSearcher.exe, чтобы воспользоваться этим модулем, необходимо, чтобы минимизируемая функция была оформлена в виде динамически загружаемой библиотеки (Win32 API Dynamic Link Library), ожидается, что эта библиотека будет содержать всего две функции factor() и initargs():

Пример функций:

#ifdef PARABOLA_EXPORTS
#define PARABOLA_API __declspec(dllexport)
#else
#define PARABOLA_API __declspec(dllimport)
#endif

extern "C" PARABOLA_API double factor(double args[], int nsize)
{
   double f1, f2;
   f1 = args[0]-args[1];
   f2 = args[0]+args[1]-10.0;
   return f1*f1+f2*f2/9.0;
}

extern "C" PARABOLA_API void initargs(CRSearcher* pRSearcher)
{
   pRSearcher->AddArg(-10.0, 10.0);
   pRSearcher->AddArg(-9.0, 11.0);
   pRSearcher->m_lpszComment = _T("(x1-x2)**2+(x1+x2-10)**2/9");
}

Здесь строки

   pRSearcher->AddArg(-10.0, 10.0);
   pRSearcher->AddArg(-9.0, 11.0);

в функции initargs() означают, что функция зависит от двух независимых аргументов, причём допустимые значения первого находятся в интервале [-10.0, 10.0], в то время как второго в [-9.0, 11.0], и средняя точка этих интервалов будет выбрана в качестве начальной пробной точки.

Строка:

   pRSearcher->m_lpszComment = _T("(x1-x2)**2+(x1+x2-10)**2/9");

определяет комментарий для Вашей функции, который выводится в файл результатов и позволит Вам отличать одни функции от других.

Как создать dll-библиотеку, содержащую функции factor() и initargs()
в начало

Для создание dll, содержащей Вашу минимизируемую функцию необходимо проделать следующее:

В Microsoft Visual C++ 6.0 создайте новый проект (пункт File\New… на закладке Projects введите название Вашей будущей dll (поле Project name) типа Win32 Dynamic-Link Library и поместите его в подкаталог (поле Location) …\RandomSearcher\Functions\ (на шаге 1 из 1 отметьте пункт: A DLL that exports some symbols, чтобы уменьшить себе трудоёмкость создания библиотеки)

Находясь в созданном проекте, откройте закладку FileView и проделайте следующее:

в файле stdafx.h замените строку

// TODO: reference additional headers your program requires here

на

#include "..\..\RSearcher\Common.h"
#include "..\..\RSearcher\RFileLog.h"
#include "..\..\RSearcher\RArg.h"
#include "..\..\RSearcher\RPoint.h"
#include "..\..\RSearcher\RGradient.h"
#include "..\..\RSearcher\RMinOnLine.h"
#include "..\..\RSearcher\RSearcher.h"

в Вашем файле MyDllName.h удалите весь текст после строки

// This class is exported from the MyDllName.dll

и вставьте туда следующее:

extern "C" MYDLLNAME_API double factor(double args[], int nsize);
extern "C" MYDLLNAME_API void initargs(CRSearcher* pRSearcher);

здесь, конечно, константу MYDLLNAME_API необходимо заменить на Вашу константу, определённую в начале Вашего файла MyDllName.h

в Вашем файле MyDllName.cpp удалите весь текст после строки

// This is an example of an exported variable

и вставьте туда следующее:

// This are an exported functions:

extern "C" MYDLLNAME_API double factor(double args[], int nsize)
{
   /*
     double f1, f2;
     f1 = args[0]-args[1];
     f2 = args[0]+args[1]-10.0;
     return f1*f1+f2*f2/9.0;
   */
}

extern "C" MYDLLNAME_API void initargs(CRSearcher* pRSearcher)
{
   /*
     pRSearcher->AddArg(-10.0, 10.0);
     pRSearcher->AddArg(-9.0, 11.0);
     pRSearcher->m_lpszComment = _T("(x1-x2)**2+(x1+x2-10)**2/9");
   */
}

здесь, константу MYDLLNAME_API также необходимо заменить на Вашу константу, определённую в начале файла MyDllName.h

Далее, удалите комментарий в телах функций factor(), initargs() и напишите вместо этого Ваши их определения.

Обратите внимание, что количество обращений к pRSearcher->AddArg(MyMinArgValue, MyMaxArgValue); в функции initargs() и порядок их следования должен соответствовать количеству аргументов (элементов массива args[]) в Вашей функции factor() и отвечать порядку их следования в массиве args[]

Используя пункт меню Project\Insert Project into WorkSpace… добавьте в Ваш проект, проект с названием RSearcher (..\..\ Rsearcher\ RSearcher.dsp) и далее, воспользовавшись пунктом меню Project\Dependence… следует установить зависимость Вашего проекта от проекта RSearcher (отметьте его галочкой для Вашего проекта)

Установите каталог, в который будет создаваться Ваша DLL. Для этого выберите в дереве объектов Ваш проект, нажмите правую клавишу мыши и из возникшего меню выберите пункт Set as Active Project. Далее, используя пункт меню Project\Settings…, в возникшем диалоге переключитесь на Ваш проект, выберите закладку Link и для Category General в поле Output file name введите следующее ..\..\Bin\MyDllName.dll, что позволит получать создаваемую Вами Dll прямо в каталоге …\RandomSearcher\Bin\

После устранения всех синтаксических ошибок, как надеюсь, Вы получите dll-файл, содержащий Вашу минимизируемую функцию, и способный динамически подключаться из программы ChkRSearcher.exe

Библиотека RSearcher.dll – содержит следующие классы:
в начало

Класс Назначение
CRSearcher - реализует алгоритмы поиска
CRArg - содержит необходимые свойства и методы аргумента функции
CRPoint - обеспечивает хранение пробной точки
CRGradient - позволяет вычислять и хранить вектор-градиент для множества пробных точек
CRMinOnLine - осуществляет поиск миниума функции одного скалярного аргумента
CRFileLog - обеспечивает запись информации в файл на диске

Класс CRArg – содержит аргумент функции
в начало

Название Тип Назначение
CRArg(double min, double max) Метод Конструктов
CRArg(double min, double max, double cur) Метод Конструктов
void ResetArg(double min, double max) Метод Переустанавливает граничные значения аргумента
Double m_min Свойство Минимальное значение
Double m_max Свойство Максимальное значение
Double m_cur Свойство Центр случайного разброса пробных точек
Double m_width Свойство Диапазон случайного разброса пробных точек
Double m_MinWidth Свойство Минимальное значение m_width, после которого считается бессмысленным разброс пробных точек для аргумента
BOOL ResetWidth(double factor, double curvalue) Метод Переустанавливает значения m_width и m_cur
void ResetCurValue(double newcurvalue) Метод Переустанавливает значение m_cur
Double GetRandArg() Метод Возвращает случайное значение аргумента, используя датчик случайных чисел, m_cur и m_width

Класс CRPoint – содержит пробную точку
в начало

Название Тип Назначение
CRPoint(double args[], int nsize, double value) Метод Конструктов
CRPoint(int nsize) Метод Конструктов
CRPoint& operator=(const CRPoint& point) Оператор =
CRPoint& operator=(const CRPoint* point) Оператор =
Bool operator<(const CRPoint& point) Оператор <
Bool operator==(const CRPoint& point) Оператор ==
Double* m_pArgs Свойство Ссылка на массив аргументов для точки
Double m_value Свойство Значение функции в точке
Int m_nSize Свойство Количество элементов в массиве m_pArgs

Класс CRGradient – вычисляет вектор-градиент функции в пробной точке
в начало

Название Тип Назначение
Double* m_pGradient Свойство Ссылка на массив элементов вектора-градиента
Int m_nSize Свойство Количество элементов в массиве m_pGradient
CRPoint m_MinPoint Свойство Пробная точка, относительно которой вычислен вектор-градиент m_pGradient
BOOL Calculate(CRPoint* pMinPoint, vector<CRPoint*>* paPoints) Метод Для множества пробных точек paPoints относительно точки pMinPoint (пере)вычисляет элементы массива m_pGradient

Класс CRMinOnLine – ищет значение аргумента, для которого функция принимает минимальное значение
в начало

Название Тип Назначение
BOOL Init(vector<CRArg*>* paArgs, CRGradient* pGradient, PFUNC pFunction) Метод Для множества аргументов paArgs, вектора-градиента pGradient и функции pFunction подготавливает данные для поиска миниума функции
BOOL CalcRangeArg(vector<CRArg*>* paArgs, CRGradient* pGradient) Метод На множестве аргументов paArgs и для вектора-градиента pGradient находит диапазон (m_MinArg, m_MaxArg) изменения независимой переменной прямой линии, такой, что для любой точки из этого диапазона мы остаёмся в области определения минимизируемой функции m_pFunction
Double Find() Метод Организует поиск значения аргумента, для которого функция принимает минимальное значение. Возвращает вычисленное значение функции m_pFunction в найденной точке
PFUNC m_pFunction Свойство Ссылка на минимизируемую функцию
Double fun(double x) Метод Возвращает вычисленное значение функции m_pFunction для независимого аргумента прямой линии x (который изменяется в диапазоне [m_MinArg, m_MaxArg])
Double FindMin(double ax, double bx, double tol) Метод Осуществляет поиск значения независимого аргумента прямой линии в интервале [ax, bx], с длиной интервала неопределённости tol, для которого функция принимает минимальное значение. Возвращает значение независимого аргумента прямой линии, для которого функции m_pFunction принимает минимальное значение
Double m_tol Свойство Желаемая длина интервала неопределённости конечного результата для независимого аргумента прямой линии x (>= 0.0) (типичное значение 1.0e-5)
Double* m_pArgs Свойство Ссылка на массив значений аргументов, для которых функция имеет минимальное значение на прямой, в заданном диапазоне
Long m_nCountCallsFn Свойство Количество вычислений минимизируемой функции за время поиска
Double m_MinArg Свойство Левая граница независимой переменной прямой, для которой аргументы функции остаются в области определения
Double m_MaxArg Свойство Правая граница независимой переменной прямой, для которой аргументы функции остаются в области определения
Double m_Value Свойство Вычисленное значение функции pFunction в найденной точке
CRGradient* m_pGradient Свойство Ссылка на экземпляр класса CRGradient, для которого производятся вычисления
Int m_nSize Свойство Количество элементов в массиве m_pArgs

Класс CRFileLog - выводит данные в файл на диске
в начало

Название Тип Назначение
CRFileLog(LPCTSTR lpszLogFile) Конструктор lpszLogFile ссылка на название файла
BOOL Open() Метод Выполняет открытие файла
LPCTSTR m_lpszLogFile Свойство Название файла
FILE* m_pStream Свойство Ссылка на поток
BOOL PutStr(LPCTSTR lpszStr) Метод Выводит lpszStr в файл. Возвращает TRUE, если нет ошибок.
BOOL PutVal(LPCTSTR lpszStr, double val) Метод Выводит lpszStr и val в файл. Возвращает TRUE, если нет ошибок.
BOOL PutVal(LPCTSTR lpszStr, double aVal[], int nsize) Метод Выводит lpszStr и массив aVal размерности nsize в файл. Возвращает TRUE, если нет ошибок.

Класс CRSearcher – используя вышеописанные классы, реализует алгоритмы поиска
в начало

Название Тип Назначение
Enum Scenario Свойство Перечисление реализованных алгоритмов
Void ClearAll() Метод Удаляет (переустанавливает в исходное состояние) значения всех свойств класса
BOOL Find(pstThreadInfo pThreadInfo) Метод Для данных, передаваемых через ссылку pThreadInfo, организует поиск минимального значения функции. Возвращает TRUE, если поиск завершился удачно.
BOOL InitPoints(pstThreadInfo pThreadInfo) Метод Для данных, передаваемых через ссылку pThreadInfo, устанавливает в начальное состояние значения всех свойств класса. Возвращает TRUE, если установка произведена успешно.
BOOL ResetPoints(pstThreadInfo pThreadInfo) Метод Для данных, передаваемых через ссылку pThreadInfo, выполняет один шаг минимизации. Возвращает TRUE, если шаг выполнен успешно, и процесс минимизации можно продолжить.
BOOL ChangeRangeArgs(BOOL bIsMin, BOOL bCurValOnly = FALSE) Метод Переустанавливает центры разбросов пробных точек для всех аргументов. При этом параметр bIsMin сигнализирует о том, что на предыдущем шаге был найден миниум, в то время как второй bCurValOnly, - требует только смещения центра разброса (без изменения интервала разброса).
BOOL AddArg(double min, double max) Метод Добавляет новый аргумент в вектор аргументов m_aArgs. Возвращает TRUE, если добавление выполнено успешно
Void WriteResalt(pstThreadInfo pThreadInfo, LPCTSTR lpszFile) Метод Для данных, передаваемых через ссылку pThreadInfo, в файл lpszFile записывает окончательный результат минимизации функции
PFUNC m_pFunction Свойство Ссылка на минимизируемую функцию
CRPoint m_MinPoint Свойство Лучшая пробная точка в смысле миниума функции m_pFunction
Double m_MinValue Свойство Значение функции m_pFunction в точке m_MinPoint
Vector<CRArg*> m_aArgs Свойство Вектор ссылок на независимые аргументы функции m_pFunction
Vector<CRPoint*> m_aPoints Свойство Вектор ссылок на множество пробных точек
CRGradient m_Gradient Свойство Экземпляр класса CRGradient
CRMinOnLine m_MinOnLine Свойство Экземпляр класса CRMinOnLine
Long m_nCurStep Свойство Текущий номер шага процесса минимизации
Long m_nMaxSteps Свойство Заказанное количество шагов процесса минимизации
Long m_nMaxPoints Свойство Заказанное количество пробных точек на шаге
Long m_nCountCallsFn Свойство Количество вычислений минимизируемой функции за время поиска
Scenario m_Scenario Свойство Заказанный алгоритм минимизации
Double m_DescendingFactor Свойство Коэффициент уменьшения области разброса пробных точек для аргументов
Double m_IncreasingFactor Свойство Коэффициент увеличения области разброса пробных точек для аргументов
Static double m_eps Свойство Величина, характеризующая относительную машинную погрешность
LPCTSTR m_lpszLogFile Свойство Название файла протокола
LPCTSTR m_lpszComment Свойство Комментарий к минимизируемой функции
BOOL m_bOutLog Свойство Признак вывода данных в файл протокола
CRFileLog m_FileLog Свойство Экземпляр класса CRFileLog

Скачать исходники [458KB]
Скачать примеры [442KB]

 
 
Hosted by uCoz