![]() |
![]() |
Программа поиска минимального значения скалярной функции, зависящей от нескольких независимых аргументов. |
Предлагаемые Вашему вниманию модули предназначены для решения задачи определения миниума скалярной функции 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]
