Программа поиска минимального значения скалярной функции, зависящей от нескольких независимых аргументов. |
Предлагаемые Вашему вниманию модули предназначены для решения задачи определения миниума скалярной функции f(x1,…,xn) нескольких независимых скалярных переменных, область изменения которых, представляет из себя n-мерный параллепипед (xmin <= x <= xmax)
Он позволяет:
Как это видно из описания 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, содержащей Вашу минимизируемую функцию необходимо проделать следующее:
В 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
Класс | Назначение |
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]