Migrating wiki contents from Google Code

This commit is contained in:
Google Code Exporter 2015-08-06 15:58:07 -04:00
commit e6f681d87a
5 changed files with 208 additions and 0 deletions

1
Architecture.md Normal file
View File

@ -0,0 +1 @@
# Встроенный сервер #

0
Models.md Normal file
View File

25
OptimalControl.md Normal file
View File

@ -0,0 +1,25 @@
# Введение #
В окружающем мире большинство процессов протекают непрерывно с течением времени. Вода не льется из под крана маленькими кубиками, она течет постоянной непрерывной струей, машина не едет "рывками", она плавно едет по извилистой змейке дороги.
Но, тем не менее, почти все непрерывные процессы мы можем представить в качестве дискретных. Струю воды можно считать по каплям, а путь автомобиля по пройденным сантиметрам. Такой подход несколько неудобен для человека, который привык к плавности движений и форм. Однако, для вычислительных машин нет ничего лучше! Компьютеры все меряют отдельными значениями. Но если маленьких отдельных значений очень много, то они становятся похожи на непрерывный набор данных, поэтому, в сущности, какая в конечном счете разница что использовать: непрерывные функции или их дискретные аналоги?
# Дискретная задача #
Дискретную задачу оптимального управления можно рассматривать и описывать как многошаговый процесс. На каждом шагу такой процесс характеризуется набором переменных состояния (фазовых переменных) _X_ = (x<sup>k</sup><sub>1</sub> ... x<sup>k</sup><sub>n</sub>) и набором переменных управления _U_ = (u<sup>k</sup><sub>1</sub> ... u<sup>k</sup><sub>n</sub>). Если подробнее, то на каждом шаге процесс описывается некоторым набором значений, которых характеризуют его состояние, а также переменными, которых характеризуют воздействие на процесс.
## Начальные условия ##
Изначально нам известны только стартовые параметры системы, а, так как процесс изменяется со временем, вычисляются с помощью заданной функции, которая определяет динамику процесса. В общем случае
f = f(x<sup>k</sup>, u<sup>k</sup>, k),
но может быть и так, что на каждом выбранном промежутке функция будет разной.
## Условие оптимальности ##
В общем случае задача управления дискретным процессом состоит в нахождении такого допустимого процесса, при котором функция
_I_(_U_) = _F_(x<sup>q</sup>} + Sum( f<sub>i</sub>(x<sup>k</sup>, u<sup>k</sup>, k), i = 0 .. q-1 )
стремится к минимуму (максимуму). В этой функции _F_() - заданная функция.

15
ProjectHome.md Normal file
View File

@ -0,0 +1,15 @@
Легкое и удобное управление моделями поиска оптимального управления.
Суть разработки в том, чтобы отделить сам алгоритм от всех "красивостей", которые уже будут реализованы в платформе. Это позволит программистам, занимающимся разработкой алгоритмов для решения задач оптимизации, сосредоточиться на самой задаче и не отвлекаться на создание графического интерфейса, графиков, таблиц отчетов. Среди запланированных возможностей платформы:
1. Готовый универсальный графический интерфейс. Чтобы алгоритм заработал на этом интерфейсе нужно всего лишь написать несколько строк кода, которые будут работать по необходимому протоколу и обеспечат связь между графическим интерфейсом и алгоритмом. Сейчас я как раз проектирую данный протокол с целью сделать его максимально простым и удобным в использовании.
1. Возможность управлять моделями и "методами" их решения. Под "методом" я понимаю алгоритм, который будет решать ту или иную модель: генетический алгоритм, метод проекции градиента, метод Беллмана и др. Можно будет создать одну модель, создать для нее несколько методов решения, чтобы узнать какие параметры будут более точны. Или создать несколько моделей (например, с разными коэффициентами в уравнениях), связать их с одним методом. И пока программа в автоматическом режиме производит расчеты, собирает данные и строит графики, не спеша выпить кофе.
1. Возможность построения графиков одной или нескольких моделей на одном листе, для того, чтобы быстро и в наглядной форме можно было сравнить (например) как от изменения одного параметра изменяется поведение результата. Несколько нажатий клавиш, и подробный отчет будет сделан!
1. Встроенные возможности экспорта таблиц в различные форматы: TeX, Excell, plain text и другие.
Еще несколько особенностей, которые я не буду включать в диплом из-за их громоздкости, но тем не менее, если проект вызовет интерес, их можно будет реализовать.
* Сетевой вариант приложения. Управлять с одного компьютера, например, ноутбука, в то время как все вычисления могут производиться на отдельном сервере. Зачем загромождать свой рабочий компьютер, ведь его назначение - управлять! Расширяя эту возможность, можно разработать web-интерфейс, который позволит управлять всеми задачами из любого места в сети.
* Возможность запуска задач не в виде написанного алгоритма, а в виде математической нотации, где для решения будут применяться уже готовые проверенные алгоритмы. Это несколько снизит скорость работы алгоритмов (универсализация всегда приводит к снижению скорости), но позволит проектировать и запускать задачи не имея больших навыков в программировании.
**It's brilliant! No. It's Opal.**

167
Protocol.md Normal file
View File

@ -0,0 +1,167 @@
---
# Общие сведения #
Протокол Opal специально разрабатывался с такой целью, чтобы быть максимально простым в использовании как человеку, так и машине. Не смотря на простоту, протокол обладает большой гибкостью и лаконичностью.
Описание протокола можно разделить на две части. Такое разделение связано с архитектурой проекта. Тем не менее, формат сообщений универсален.
## Формат сообщения ##
Все сообщения строятся по одному шаблону, очень похожему на протокол JSON. В основе выбранного стиля лежит набор пар ключ-значение, которое в большинстве языков программирования представляется в виде ассоциативного массива.
В общем случае сообщение выглядит следующим образом - это набор пар ключ-значение, заключенный в фигурные скобки.
```
{ тело сообщения }
```
Пример простейшего сообщения:
```
{ request = info }
```
## Ключевые слова ##
Некоторые из ключей являются специальными словами, жестко установленными, для возможности адекватного общения меду сервером и клиентом.
| **Слово** | Краткое описание |
|:----------|:-----------------|
| request | запрос какой-либо информации |
| answer | ответ на запрос |
| status | статус опрашиваемого процесса |
| main | секция с описанием параметров модели |
| algo | секция с описанием алгоритмов-методов модели |
| header | секция с описанием заголовка таблицы результатов |
| table | секция с описанием таблицы результатов |
| comment | комментарий |
Теперь более подробно о каждом из ключевых слов.
### request ###
### answer ###
## Типы данных ##
# Соединение сервер - задача #
## Запрос информации сервером ##
Перед запуском задачи для того, чтобы узнать какие параметры нужно передавать для корректного выполнения алгоритма, сервер запускает задачу с ключом -i или --info:
`task (-i|--info)`
Результатом работы будет набор строк, который описывает все доступные значения для данной задачи. Строки описываются в следующем формате:
_name_ = _type_ (choice _list_) (default _value_)
<a href='Hidden comment:
в будущем
_name_ = _type_ (choice _list_) (default _value_) (check _expr_)
'></a>
В ответе обязательно должна присутствовать секция Main, в которой описываются все параметры модели. Другие секции описывают параметры доступных алгоритмов в задаче и их количество не ограничено.
## Передача списка параметров ##
## Получение результата ##
# Соединение сервер - ГИП #
# Пример сессии #
```
// запрос сервера на получение информации о задаче
{
request = info
}
// ответ клиента-задачи
{
answer = ok
meta = {
detailed = true
}
main = {
size = int default 100
x = float default 20.0
y = float default 0.0
time = period default 00:00 to 24:00 comment twenty-four hours
}
algo = {
genetic = {
method = string choice [std, last] default std
poplulation = int default 1000
}
bellman = {
xpart = float partition 0 to 100 by 1
ypart = float partition 0 to 50 by 0.5
}
}
}
// запрос сервера на вычисления по указанным параметрам
{
request = calculate
main = {
size = 100
x = 20.0
y = 5.0
time = 00:00 to 48:00
}
algo = {
genetic = {
method = last
population = 1200
}
}
}
// ответ клиента задачи о том, что вычисления начались
{
answer = ok
status = inprogress
}
// запрос сервера о статусе вычислений
{
request = status
}
// ответ клиента-задачи о том, что прошла уже половина вычислений
{
answer = ok
status = inprogress
percent = 0.50
comment = 10 минут, полет нормальный
}
// снова запрос сервера о статусе
{
request = status
}
// клиент сообщает, что вычисления завершены, и предоставляет таблицу результатов
{
answer = ok
status = ready
header = {
time = datetime
x = float
y = float
u = float comment management
}
table = {
00:00 20.0 5.0 0.0
01:00 18.0 6.0 1.0
02:00 16.0 7.0 2.0
//...
}
}
```