Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GUI для мультиагентной системы, поиск решения 
:(
    Опции темы
Fieral
Дата 4.6.2009, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



При работе над мультиагентной системой на java возникла такая задача:

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

Для этого преполагается написать нечто позволяющее:
1) во время работы налету строить графический интерфейс пользователя, тем самым транслировать вопросы удалённого агента в человеко-понятный вид
2) после чего пользователь "вибирает опции, проставляет галочки" - тем самым обрабатывает запрос от удаленного агента
3) затем локальный агент транслирует это всё в машинный вид и отправляет ответ удалённому.

Поясню на примерах:

Есть два независимых сервиса (агенты): А и Б
А - подргужает данные из BD и отправляет B
B - проверяет данные и просит A уточнить кое-какие параметры (например P1 = false/true?)
A - находит данные в базе и доотправляет B
B - обрабатывает их и присылает обратно A 
А - сохраняет результат в BD

Теперь собсно появляется тема этого топика - агент C:
1) его можно подключить вместо A - тем самым роль BD будет играть пользователь
что позволит, например, провести отладку B налету - если ещё не готова BD для A
Аналогично подключить C вместо B, для отладки A.
2) если A не находит что-то в BD то он спрашивает значение  недостающего параметра (P1 = false/true?) у C - то есть фактически преренаправляет запрос к пользователю
...

Так вот. Для решения этой задачи, я, в роли C использую TomCat 6.0 - который генерит на лету станицы на основании ответов/вопросов агента с которым он работает.

Тоесть, например, сейчас мой томкат получает в качестве запроса о значении параметра P1 некоторый инстанс-сообщение класса MessageClass где указано:
что имя параметра - P1,  а список возможных значений - true, false. Получив это сообщение, томкат создаёт группу элементов с выпадающим списоком - всё просто.
-----------------------
Теперь переходим к вопросу, к которому мы так долго шли: как лучше организовать междуагентный "разговор".
Тоесть - как организовать структуру java класса MessageClass, чтобы получить следующие возможности:

1) агент может попросить указать целое и вещественное число из диапазона
2) агент может попросить указать строку подходящую под регулярное вырадение
3) агент может попросить выбрать одну из опций в представленном списке (пример списка: true/false/unknown/not_defined)
4) агент может попросить выбрать несколько опций из списка
5) агент может комбинированный запрос - например: запросить данные паспорта. А данные паспорта состоят из подзапросов где нужно указать имя(String), фамилию(String), Пол( один элемент из множества {male,female})
6) ну и конечно за одну транзакцию могут спрашивать значение не одного параметра

пример: B просит указать дату рождения, имя, фамилию и пол
на что томкат строит форму которая содержит 2 тектовых поля под имя,фамилию, один javascript для указания даты и выпадающий список "Пол: (M/Ж)?"                    

Как организовать структуру MessageClass? 
-----------------------
У меня пока есть 2 варианта:

1)
написать абстрактный класс Request 
и отнего наследовать абстрактный класс NumberRequest
от которого в свою очеред наследовать IntegerNumberRequest и DoubleNumberRequest

однако тут например не понятно вот что: как в классе NumberRequest определить понятие диапазона значений? какого типа будут поля From и To?

далее я создам SetRequest

и в MessageClass создам поле: ArrayList<Request>
 - теперь томкату придётся идти по этому списку и проверять каждого к какому типу запроса он пренадлежит и в соответствии с этим генерировать html код? как это вообще делать?

Код

try{
       SetRequest S = (SetRequest)ArrayList<Request>.get(i)
        generateHTML(S);
     }catch(exception e){
            
             try{
                           IntegerNumberRequest S = (IntegerNumberRequest)ArrayList<Request>.get(i)
                            generateHTML(S);
                  }catch(exception e){
                              .......(и так пока не отловим все варианты?)

                  }
     
 
     }


выглядит как-то сомнительно

2) второй вариант
создать
в MessageClass поля: 
 ArrayList<IntegerNumberRequest> R1;  - список запросов IntegerNumberRequest
 ArrayList<SetRequest> R2; - список запросов SetRequest
 ...
и т.д.

и отдельно список пар  ArrayList<Descript> Order - где

Код

class Descript{
     
          String type; \\указывает тип запроса - в каком списке искать сам запрос (R1, R2...?)
          int index; \\ указывает каким номером запрос идёт в этом соответствующем списке

}



в этом варианте тоже особо радоваться нечему

Собсно хотелось бы услышать мнение присутствубщих об организации класса MessageClass или вообще организации общения агентов.
Спасибо тем кто дочитал до конца  smile 



Это сообщение отредактировал(а) Fieral - 4.6.2009, 20:29
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
AntonSaburov
Дата 5.6.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Прочитав и постаравшись понять, что именно надо, пришел к таким выводам:

1. Однозначно передавать надо коллекции.
2. А вот дальше неоднозначно:
 а. Наследники какого-то определенного класса.
 б. Классы с реализацией какого-то интерфейса.
 б. Просто список разных классов.
Я бы выбрал интерфейс.

Еще не очень понятно какой танспорт используется - в смысле по какому протоколу агенты общаются. Но видимо это не так важно.
PM MAIL WWW ICQ   Вверх
Fieral
Дата 5.6.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



чесно говоря, я не понял как это понимать.
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
AntonSaburov
Дата 5.6.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Если бы было просто понять, что конкретно надо smile
Было много слов и в итоге как я понимаю надо было придумать формат сообщений о том, какие данные еще надо получить. Я предложил, чтобы они были в виде списка и каждый элемент описывал бы что именно он хочет получить. Я и написал свое видение. В той мере, в которой понял вопрос.
PM MAIL WWW ICQ   Вверх
Fieral
Дата 5.6.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



Цитата(AntonSaburov @  5.6.2009,  15:18 Найти цитируемый пост)
Если бы было просто понять, что конкретно надо 

давайте поговорим об этом smile

начнём с простого:

например я хочу запрашивать число из диапазона,
я создам класс Diapazon и начну определять поля From и To 
и тут выяснится что Ява это на матанализ - она разделяет понятие целого и вещественного типов, значит я не могу определить тип полей From и To

тогда есть 2 варианта
1) создать классы IntegerDiapazon и DoubleDiapason у которых поотдельности определить From и To
2) либо создать класс Chislo<T> и класс Diapazon<T> с полями Chislo<T> From; и Chislo<T> To 

я пока не вижу чем из них один этих вариантов хуже или лучше другого, но уже чувствую что где-то дальше появятся грабли

ваши рекомендации?



Это сообщение отредактировал(а) Fieral - 5.6.2009, 15:46
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
AntonSaburov
Дата 5.6.2009, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Сложно рекомендовать не зная типов данных. 
В одних случаях возможно удобно использовать Generics, в других это просто бессмысленно. Возможна и смесь - для одной подгруппы Generics подойдет, для другой - нет.

Еще возникает вопрос конвертации - если пользователь вводит данные, то скорее всего это строка. Значит нужны конверторы из/в строку. Для каждого типа.
Посему я не могу предложить какого-то решения. Могу предложить путь - просмотреть полный список возможных данных и составить для них описание. Ну и на основе описания создать нужные классы.
PM MAIL WWW ICQ   Вверх
Fieral
Дата 5.6.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



а потом их собрать в одну коллекцию и сортировать методом:
Код

if (request instanceof Class1) {
  generateHTML((Class1)request);
} else if (request instanceof Class2) {
  generateHTML((Class2)request);
}....



?

Это сообщение отредактировал(а) Fieral - 5.6.2009, 17:34
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
Fieral
Дата 5.6.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



возможно ли создать "гибкие" классы, которые будут находу подстраиваться под данные им "описания возможных данных"?

--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
Fieral
Дата 5.6.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



а ещё такой вопрос:

например я создам класс SetRequest
там будут поля:
Код

String ParameterName;
Vector<String> ListOfPossibleElements;


то есть по сути запрос вида: "укажите значение параметра %ParameterName% выбрав один из возможных вариантов из списка ListOfPossibleElements"

а дальше я хочу создать класс BooleanRequest.
и тут есть 2 варианта
1) написать под него отдельный класс - что вынуждает меня исправлять/дописывать код отвечающий за генерацию html`a для него тут:
Код

if (request instanceof Class1) {
  generateHTML((Class1)request);
} else if (request instanceof Class2) {
  generateHTML((Class2)request);
}....

.....

generateHTML(BooleanRequest request){
.....
}



2) либо унаследовать BooleanRequest от SetRequest указав в конструкторе:

Код

public BooleanRequest(){
    super();
    ListOfPossibleElements.add("True");
    ListOfPossibleElements.add("False");
}


тогда не придётся менять html генератор, НО придётся следить чтобы никто не напихал в список ListOfPossibleElements ничего лишнего (кстати интересный вопрос как это делать?)


ваши рекомендации?


Это сообщение отредактировал(а) Fieral - 5.6.2009, 17:35
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
AntonSaburov
Дата 5.6.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Давайте по порядку - невозможно ответчать на 25 вопросов smile

1. По поводу генерации HTML.
Как я уже говорил - лучше определить интерфейс, в котором описать те функции, которые нужны для взаимодействия. Ту же функцию, которая будет возвращать HTML для конкретно этого элемента.
Также можно определить функцию, которая будет конвертировать строку (а из HTML скорее всего придет именно строка) в нужные данные.
Ну и так далее.

2. По поводу гибких "классов". Я не большой любитель гибких классов. Слишком гибкие классы будут сложны в использвании. Надо искать что-то более-менее удобное. И здесь как раз потребуется более четкое понимание назначения этих классов.

3. Я бы сделал отдельные классы. Как раз для класса с набором можно было бы использовать Generics для указания того, какие типы данных использовать для доступных значений.
PM MAIL WWW ICQ   Вверх
Fieral
Дата 5.6.2009, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



Цитата

Как раз для класса с набором можно было бы использовать Generics для указания того, какие типы данных использовать для доступных значений.

а можно эту фразу расписать попобробнее? 
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
AntonSaburov
Дата 5.6.2009, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Ну что-то вроде такого описания (не уверен на счет абсолютной правильности синтаксиса, но где-то так)

Код

public class SetRequest<T> 
{
   String ParameterName;
   Vector<T> ListOfPossibleElements;

   ....
}

PM MAIL WWW ICQ   Вверх
Fieral
Дата 5.6.2009, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



угу, но это попрежнему не решает вопроса с BooleanRequest из поста выше
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
AntonSaburov
Дата 5.6.2009, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Почему не решается ? Для него можно отдельный класс. Я думаю. что даже нужно.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0548 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.