Полигон алгоритмов/Пошаговая реализация собственного алгоритма

Материал из MachineLearning.

(Различия между версиями)
Перейти к: навигация, поиск
(4. Напишите логику работы с сервисом)
(4. Напишите логику работы с сервисом)
Строка 93: Строка 93:
a. Поскольку при вызове любой функции сервиса требуются параметры авторизации, введите переменные, отвечающие за эти данные.
a. Поскольку при вызове любой функции сервиса требуются параметры авторизации, введите переменные, отвечающие за эти данные.
-
:<code>
+
<code>
:const string algSynonim = "algSynonim";
:const string algSynonim = "algSynonim";
-
:const string algPassword = "algPassword";</code>
+
:const string algPassword = "algPassword";
 +
</code>
b. Рассмотрим схему получения и обработки одного задания алгоритмом со вставками кода:
b. Рассмотрим схему получения и обработки одного задания алгоритмом со вставками кода:
Строка 115: Строка 116:
#:(algSynonim, algPassword, procTask.PocketId, learnResults.ToArray(), testResults.ToArray());
#:(algSynonim, algPassword, procTask.PocketId, learnResults.ToArray(), testResults.ToArray());
#:</code>
#:</code>
 +
Полный код простой логики запроса и обработки одного задания:
Полный код простой логики запроса и обработки одного задания:
:<code>
:<code>
Строка 181: Строка 183:
:}</code>
:}</code>
 +
 +
 +
c. После каждого вызова функций веб-сервиса стоит проверять возвращенный статус (структура ''ProcessingState'') на произошедшие ошибки или выданные сервером предупреждения.
 +
 +
Например:
 +
 +
:<code>
 +
://вызов функции получения задачи с сервиса
 +
:ProblemData data = procService.GetProblem(algSynonim, algPassword, procTask.ProblemSynonim);
 +
 +
 +
://Проверка на ошибку при получении данных задачи
 +
:if (data.ProcessingState.Status == StatusType.Error)
 +
::throw new Exception("Данные задачи возвращены с ошибкой: " + procTask.ProcessingState.Message);</code>
 +
 +
При вызове функций обрабатывающего сервиса ошибками могут являться неверный синоним или пароль алгоритма (ошибки авторизации). При регистрации результатов ошибку может вызвать неверный формат регистрируемых данных (результатов теста) (подробнее в пункте Тестирование взаимодействия алгоритма с системой).
 +
 +
Нужно определить действия программы в случае возникновения ошибки – сгенерировать исключение (<code>throw new Exception</code>), записать ошибку в файл или выдать сообщение пользователю.
 +
 +
 +
d. Поскольку для расчета статистик по одной задаче алгоритму требуется рассчитать несколько заданий, можно добавить проверку новых заданий в цикле. При этом следует ставить таймер между запросами заданий, чтобы обращения к серверу не были слишком частыми (возможен бан).
 +
 +
:<code>
 +
:for (int counter = 0; counter < 1000; counter++)
 +
:{
 +
::/*
 +
::Запрос и последующая обработка одного задания (см.выше)
 +
:: */
 +
::Thread.Sleep((procTask != null) ? 500 : 60000);
 +
:}</code>
 +
 +
 +
В данном примере программа ждет полсекунды, если задание приходило, и минуту, если задания не было. Число 1000 соответствует суммарному числу запросов заданий программой. Алгоритм может запрашивать задания в вечном цикле или конечное число раз на усмотрение автора.
 +
 +
 +
e. Для оптимизации трафика можно данные задачи сохранять в алгоритме и запрашивать новые, только если в задании указана другая задача.
 +
 +
Для этого нужно:
 +
 +
Перед объявлением цикла ввести переменную, в которой будут храниться данные последней полученной задачи, и переменную с синонимом последней полученной задачи:
 +
 +
:<code>
 +
:ProblemData lastData = null;
 +
 +
:string lastProblemSyn = "";</code>
 +
 +
Вместо прежнего кода запроса данных задачи вставить новый:
 +
 +
<code>
 +
:if (lastProblemSyn != procTask.ProblemSynonim)
 +
:{
 +
::lastData = procService.GetProblem(algSynonim, algPassword, procTask.ProblemSynonim);
 +
::/* проверка ошибок */
 +
::lastProblemSyn = procTask.ProblemSynonim;
 +
:}
 +
:ProblemData data = lastData;
 +
</code>
=5. Напишите логику тестирования алгоритма на задании=
=5. Напишите логику тестирования алгоритма на задании=

Версия 21:45, 2 апреля 2010

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

Далее описывается написание программы алгоритма на C# в Microsoft Visual Studio 2008. Соответствующую реализованную программу можно скачать по адресу http://poligon.machinelearning.ru/files/ExampleAlg.rar

Скачать данную инструкцию в формате pdf можно здесь

Краткий список действий
  1. Создайте новый проект
  2. Добавьте в проект Web Reference на обрабатывающий сервис системы
  3. Добавьте Web Reference на тестовый сервис системы
  4. Напишите логику работы с сервисом
  5. Напишите логику тестирования алгоритма на задании
  6. Напишите код самого алгоритма
  7. Протестируйте взаимодействие алгоритма с системой, работу алгоритма
  8. Зарегистрируйте алгоритм на сайте
  9. Проверьте работоспособность алгоритма на сайте: создание отчета, запуск программы алгоритма, просмотр отчета












1. Создайте новый проект

Создайте новый проект типа ConsoleApplication. Дайте ему название. В нашем примере используется название TestServiceAlgorithm.

2. Добавьте в проект Web Reference на обрабатывающий сервис системы

a. Правой кнопкой нажмите на название проекта в Solution Explorer, выберете пункт Add Service Reference

b. В появившемся окне в левом нижнем углу нажмите на кнопку “Advanced…”

Изображение:AddWebReferenceStep1.png

c. В появившемся окне в левом нижнем углу нажмите на кнопку “Add Web Reference…”

Изображение:AddWebReferenceStep2.png

d. Введите URL-адрес веб-сервиса: http://poligon.machinelearning.ru/ProcessingService.asmx. Нажмите на кнопку “Go”

Изображение:AddWebReferenceStep3.png

e. Назовите новый Web Reference подходящим образом

Изображение:AddWebReferenceStep4.png

f.Нажмите на кнопку "Add Reference"

Изображение:AddWebReferenceStep5.png

В нашем проекте появляется новый namespace <название проекта>.<объявленное название web reference> (в нашем случае TestServiceAlgorithm.ProcessService), содержащий все типы и функции веб-сервиса. Включите данный namespace во все используемые файлы кода (Program.cs):

using TestServiceAlgorithm.ProcessService;

Для обращения к функциям сервиса создайте экземпляр класса ProcessingService, описание которого находится в подключенном namespace:

var procService = new ProcessingService();

3. Добавьте Web Reference на тестовый сервис системы

Аналогичным образом добавьте в проект тестовый веб-сервис, который расположен по адресу http://poligon.machinelearning.ru/TestService.asmx. В данном примере этот web reference называется TestService. Тогда для использования функций тестового сервиса вместо обрабатывающего нужно подключать namespace, соответствующий тестовому сервису:

using TestServiceAlgorithm.TestService;

И для обращения к функциям тестового сервиса нужно создать экземпляр класса TestService, находящийся в данном namespace:

var procService = new TestService();

При настройке взаимодействия и отладке работы алгоритма следует обращаться именно к тестовому сервису.


Далее считаем, что переменная procService соответствует нужному нам сервису.

4. Напишите логику работы с сервисом

Данный код следует писать в функции Main файла Program.cs.

a. Поскольку при вызове любой функции сервиса требуются параметры авторизации, введите переменные, отвечающие за эти данные.

const string algSynonim = "algSynonim";
const string algPassword = "algPassword";

b. Рассмотрим схему получения и обработки одного задания алгоритмом со вставками кода:

  1. запрос задания для алгоритма
    ProcessingTask procTask = procService.GetTask(algSynonim, algPassword);
  2. если задание получено и не было ошибки, то запрос данных задачи
    ProblemData data = procService.GetProblem(algSynonim, algPassword, procTask.ProblemSynonim);
  3. тестирование алгоритма на полученном задании (подробнее в пункте Логика тестирования алгоритма на задании)
    В результате тестирования возвращаются наборы результатов теста на обучении и на контроле:
    //Определение числа тестов
    int learnTaskCount = procTask.LearnIndexes.Length;
    //создание наборов результатов тестов
    var learnResults = new List<TestResult>(learnTaskCount);
    var testResults = new List<TestResult>(learnTaskCount);
  4. регистрация результатов
    ProcessingState state = procService.RegisterResult
    (algSynonim, algPassword, procTask.PocketId, learnResults.ToArray(), testResults.ToArray());

Полный код простой логики запроса и обработки одного задания:

//Запрос задания для алгоритма
ProcessingTask procTask = procService.GetTask(algSynonim, algPassword);


if (procTask != null)
{
//Проверка на ошибку при получении задания
if (procTask.ProcessingState.Status == StatusType.Error)
throw new Exception("Задание возвращено с ошибкой: " + procTask.ProcessingState.Message);


//Если задание есть и не было ошибки, надо получить данные по задаче
ProblemData data = procService.GetProblem(algSynonim, algPassword,procTask.ProblemSynonim);


//Проверка на ошибку при получении данных задачи
if (data.ProcessingState.Status == StatusType.Error)
throw new Exception("Данные задачи возвращены с ошибкой: " + procTask.ProcessingState.Message);


//Определение числа тестов
int learnTaskCount = procTask.LearnIndexes.Length;


//создание наборов результатов тестов
var learnResults = new List<TestResult>(learnTaskCount);
var testResults = new List<TestResult>(learnTaskCount);


/*
Код обработки задания (заполнение списков learnResults и testResults)
*/


//Регистрация результатов
ProcessingState state = procService.RegisterResult(algSynonim, algPassword, procTask.PocketId, learnResults.ToArray(), testResults.ToArray());


//Проверка на ошибки при сохранении результатов:
if (state.Status == StatusType.Warning)
throw new Exception("При сохранении результата" + procTask.PocketId + " было выдано предупреждение: " + state.Message);
if (state.Status == StatusType.Error)
throw new Exception("Произошла ошибка при сохранении результата" + procTask.PocketId + ": " + state.Message);
}


c. После каждого вызова функций веб-сервиса стоит проверять возвращенный статус (структура ProcessingState) на произошедшие ошибки или выданные сервером предупреждения.

Например:

//вызов функции получения задачи с сервиса
ProblemData data = procService.GetProblem(algSynonim, algPassword, procTask.ProblemSynonim);


//Проверка на ошибку при получении данных задачи
if (data.ProcessingState.Status == StatusType.Error)
throw new Exception("Данные задачи возвращены с ошибкой: " + procTask.ProcessingState.Message);

При вызове функций обрабатывающего сервиса ошибками могут являться неверный синоним или пароль алгоритма (ошибки авторизации). При регистрации результатов ошибку может вызвать неверный формат регистрируемых данных (результатов теста) (подробнее в пункте Тестирование взаимодействия алгоритма с системой).

Нужно определить действия программы в случае возникновения ошибки – сгенерировать исключение (throw new Exception), записать ошибку в файл или выдать сообщение пользователю.


d. Поскольку для расчета статистик по одной задаче алгоритму требуется рассчитать несколько заданий, можно добавить проверку новых заданий в цикле. При этом следует ставить таймер между запросами заданий, чтобы обращения к серверу не были слишком частыми (возможен бан).

for (int counter = 0; counter < 1000; counter++)
{
/*
Запрос и последующая обработка одного задания (см.выше)
*/
Thread.Sleep((procTask != null) ? 500 : 60000);
}


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


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

Для этого нужно:

Перед объявлением цикла ввести переменную, в которой будут храниться данные последней полученной задачи, и переменную с синонимом последней полученной задачи:

ProblemData lastData = null;
string lastProblemSyn = "";

Вместо прежнего кода запроса данных задачи вставить новый:

if (lastProblemSyn != procTask.ProblemSynonim)
{
lastData = procService.GetProblem(algSynonim, algPassword, procTask.ProblemSynonim);
/* проверка ошибок */
lastProblemSyn = procTask.ProblemSynonim;
}
ProblemData data = lastData;

5. Напишите логику тестирования алгоритма на задании

6. Напишите код самого алгоритма

7. Протестируйте взаимодействие алгоритма с системой, работу алгоритма

8. Зарегистрируйте алгоритм на сайте

9. Проверьте работоспособность алгоритма на сайте: создание отчета, запуск программы алгоритма, просмотр отчета

Статья в настоящий момент дорабатывается.
Sintsova 00:16, 3 апреля 2010 (MSD)


Личные инструменты