• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

как реализовать алгоритм адаптивного тестирования?

  • Автор темы Guest_new_visitor_*
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest_new_visitor_*

Как реализовать алгоритм адаптивного тестирования? Есть БД в Interbase, клиент должен быть в Delphi. Адаптивное тестирование - это когда от того, как хорошо ты ответишь на первые нескольно вопросов зависит то, какой сложности вопрос тебе предложат следующим. Если правильно - то вопрос с большим весом (всего 3 - слабо, средне, сильно), а если неправильно - то легкий. Хранимая процедура или UDF? Если честно, уже голова кругом идет, а времени мало остается.
Пожалуйста, помогите кто чем может - буду рада любому совету! :)
 
B

Barmutik

Просто вариант .. есть множество вопросов и есть множество переходов из одного вопроса в другие с разными весами (в нашем случае правильно и не правильно ответили).

Начинаем в какой-либо точкемножества и дальше двигаясь по определнным переходам имеем путь из множества переходов..
 
S

Shurup

В БД все вопросы должны содержать дополнительный аттрибут: сложность.

Пусть сложность = Sloz: int и изменяется от Sloz_0 до Sloz_1.

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

Рассматриваем случай, когда без категорий.
Значит для тестируемого в профиле должен быть один аттрибут: "умность" :p.
Пусть умность = Um: double и изменяется от Um_0 до Um_1.
Если без профилей (аноним), то Um := (Um_0 + Um_1) / 2;

Итерация ответа: {
Находишь вопрос который подходит для текужего значения Um.
(Это можно делать разными способами) [1]
В зависимости от правильности ответа изменяешь значение Um
(Это можно делать разными способами) [2]
}

[1]
тут если размеры Sloz и Um разные, то надо нормировать:

Otv_Pow = (Sloz - Sloz_0) / (Sloz_1 - Sloz_0);
Usr_Pow = (Um - Um_0) / (Um_1 - Um_0);

Как видишь все эти нормированные переменные изменябются от 0.0 до 1.0 и типа double.

Находим рандомный вопрос с таким вычисленным (т.е. вычисляется для каждого вопроса) Otw_Pow наиболее близким к вычисленным для пользователя Usr_Pow. Сам придумывай как. Зависит от твоей бд, и способов, собственно тоже много. Лучше вынести такие вещи в отдельные методы (процедуры), и менять их подгоняя алгоритм под себя. Так например, следующий вопрос должен быть желательно чуть выше, чем уровень пользователя, иначе он никогда не научится ))

[2]
А.
Если ответил правильно то вычисляем для отвеченного вопроса:

Otv_Pow = (Sloz - Sloz_0) / (Sloz_1 - Sloz_0);

Вычисляем для пользователя:
Usr_Pow = (Um - Um_0) / (Um_1 - Um_0);

IF (Usr_Pow > Otv_Pow) {
Usr_Pow увеличивается, но не сильно
} ELSE IF (Usr_Pow == Otv_Pow) {
Usr_Pow увеличивается нормально
} ELSE {
Usr_Pow увеличивается до Otv_Pow или даже больше
}

Б.

Если ответил неправильно то вычисляем для неотвеченного вопроса:

Otv_Pow = (Sloz - Sloz_0) / (Sloz_1 - Sloz_0);

Вычисляем для пользователя:
Usr_Pow = (Um - Um_0) / (Um_1 - Um_0);

IF (Usr_Pow < Otv_Pow) {
Usr_Pow уменьшаем совсем чуть-чуть
} ELSE IF (Usr_Pow == Otv_Pov) {
Usr_Pow уменьшаем нормально
} ELSE {
Usr_Pow уменьшаем до Otv_Pow или даже меньше
}

Конечно, лучше все уменьшения-увеличения делать пропорционально: Abs(Usr_Pow - Otv_Pow); где Abs - модуль
 
N

Nastya

Спасибо большое за помощь, попробую что-нибудь из этого сделать :) Выбор вопросов будет происходить непосредственно в процессе тестирования из БД вопросов. Этот контроль знаний будет встроен в электронное методическое пособие (по одной дисциплине). Это ЭМУ будет устанавливаться на каждый компьютер. А как свести всю статистику в одно место? Чтобы результаты каждого студента были у преподавателя? Целесообразно ли делать 2-х звенную или это совсем неэффективно?
И еще :) Я предполагала сделать три типа вопросов или два (выбор одного, выбор нескольких, ввод одного рпавильного слова), возможно ли разместить их в одной таблице?
 
S

Shurup

<!--QuoteBegin-Nastya+23:04:2006, 00:51 -->
<span class="vbquote">(Nastya @ 23:04:2006, 00:51 )</span><!--QuoteEBegin-->Спасибо большое за помощь, попробую что-нибудь из этого сделать :( Выбор вопросов будет происходить непосредственно в процессе тестирования из БД вопросов. Этот контроль знаний будет встроен в электронное методическое пособие (по одной дисциплине). Это ЭМУ будет устанавливаться на каждый компьютер. А как свести всю статистику в одно место? Чтобы результаты каждого студента были у преподавателя?[/quote]
Если ты используешь клиентсерверную БД, то все данные по-любому будут храниться централизованно и будут доступы всем одинаково.
А на каждый комп будет ставиться клиент, работающий с этой одной БД.
<!--QuoteBegin-Nastya+23:04:2006, 00:51 -->
<span class="vbquote">(Nastya @ 23:04:2006, 00:51 )</span><!--QuoteEBegin-->Целесообразно ли делать 2-х звенную или это совсем неэффективно?
И еще :) Я предполагала сделать три типа вопросов или два (выбор одного, выбор нескольких, ввод одного рпавильного слова), возможно ли разместить их в одной таблице?[/quote]
Вот например можно сделать так (грубо) с одной таблицей:

Код:
TABLE QUESTION {
ID: INTEGER;
CATEGORY_ID: INTEGER;
QUESTION_TYPE: INTEGER;
QUESTION_POWER: INTEGER;
QUESTION_STRING: VARCHAR;
}

TABLE QUESTION_STRING { // содержит просто строки, на кот. будем ссылаться
ID: INTEGER;
STRING: VARCHAR;
WEIGHT: INTEGER; // говорит о том правилен ли вариант либо любая другая инфа
}

TABLE QUESTION2STRING {
QUESTION_ID: INTEGER;
STRING_ID: INTEGER;
}

..keep it simple..
 
N

new_visitor

Я хотела делать как положено клиент-серверную, ну а как иначе проводить тестирование и вести статистику успеваемости и т.д. и т.п. Но у моего руководителя на этот счет другие соображения. Придумал, чтобы на каждом компе была установлена своя локальная версия, и БД соотв. тоже на каждом (как я поняла :) ) А результаты должны записываться в какую-то системную таблицу, которая будет создаваться на этом же компьютере. Не совсем понятно. Просто тесты в сосставе методич. пособия. И в этой же сист. таблице д/б что-то вроде статистики посещения разделов ЭМП,... Про сист. таблицы вообще раньше не слышала. Причем вроде бы должны они создаваться не в той БД, где тесты, а втой, которую студент создаст для лабораторных работ. А как? Имена-то все разные дают, да и мето расположения на диске тоже... ИЛи просто у руководителя фантазия больная ? :)
Понимаю, что все вопросы звучат слишком глупо... Я попробовала доступ через БДЕ, раз уж не надо на сервере БД размещать. Для простого вывода данных из БД в Интербейс подходит. А посложнее... Вот такой вопрос: в БД в одной из таблиц есть поле, значение которого принимает значение 1 или 2 (это у меня обозначение типа вопроса). И я хотела, чтобы в клиенте, в зависимости от того, какой типа вопроса будет выбран (со значением поля 1 или 2) отображался либо компонент OptionGroup либо Edit. И заступорилось. Ничего в голову не лезет. Кое-какие свойства посмотрела - не получается. А кокой вопрос какого типа будет заранее неизвестно.

И еще (извините за СТОЛЬКО вопросов): Вы очень доступно объяснили механизм адаптивного тестирования, только вот теперь не знаю: это непосредственно в Делфи надо писать или все-таки в Интербейс хранимай процедурой? (глупый вопрос, но важный :angry: ). А еще проблема с тем, как идентифицировать/сравнить тот ответ, который введет или отметит студент с тем, который в БД в поле "правильный ответ" значится?
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!