Организация интеллектуальной совместной деятельности в сфере образования с использованием Lotus Connections: Часть 2. Oптимизация назначения студентов в исследовательские проекты

Использование модели оптимизации IBM ILOG с данными из реляционной базы данных

В статье описывается создание Web-приложения, которое помогает оптимизировать назначение студентов на вакансии в исследовательских проектах. Процесс назначения извлекает данные из удаленной базы данных DB2 и выполняет оптимизацию, используя ILOG CPLEX. Основанный на Web-браузере клиент взаимодействует с приложением из IBM Lotus Connections® посредством iWidgets.

Карл Осипов, архитектор ПО, IBM

Карл Осипов (Carl Osipov) - архитектор ПО, подразделениe стратегий и технологий IBM Software Group. Обладает большим опытом в области распределенных вычислений, разработке приложений по распознаванию живой речи и компьютерной обработке естественного языка. Имеет ряд публикаций и выступлений по вопросам Сервис-ориентированной архитектуры и управлением разпознования речи перед образовательской и бизнес аудиторией. На данный момент он в основном занимается проектированием технологий повторного использования для составных бизнес-сервисов.



Антон Зорин, инженер-программист, IBM

Антон Зорин (Anton Zorin) - фотографияАнтон Зорин (Anton Zorin) работает инженером-программистом IBM с 2006 года. В основном занимается Web-разработкой, линейной оптимизацией и анализом текстов. Также занимался мультипрограммными системами, обработкой изображений и реконфигурируемыми вычислительными системами.



21.11.2011

Введение

В статье описывается создание Web-приложения, которое предоставляет рекомендации по назначению студентов на вакансии в исследовательских проектах. Приложение извлекает данные из удаленной базы данных и исходя из этих данных выполняет оптимизацию, используя ILOG CPLEX. Для задания ограничений и весовых параметров, а также для представления результата оптимизации пользователю используется Web-интерфейс. Оптимизационные вычисления запрашиваются сервлетом, который извлекает исходные данные для процесса оптимизации из удаленной базы данных DB2, запускает процесс, представляет результат вычисления в виде выходного XML и отправляет его пользователю. Сервлет установлен на том же узле сети и той же операционной системе, что и экземпляр механизма оптимизации ILOG CPLEX.

В первой части статьи описываются инструменты и технологии, используемые для создания приложения. Объясняется общее назначение каждого инструмента , а также использование инструмента в приложении.

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

В третьей части статьи приводится подробный обзор архитектуры приложения, а также исследуются роли в архитектуре приложения сервлета, Java™ API и механизма оптимизации ILOG CPLEX. В этой части также описывается библиотека Dojo, используемая при реализации Web-интерфейса взаимодействия с пользователем и формата обмена данными между сервлетом и браузерным клиентом.

В четвертой части содержится анализ измерений времени выполнения различных этапов процесса оптимизации.

Исходный код решения, описанного в статье, можно загрузить и просмотреть (см. раздел Загрузки).

Среда, инструменты и технологии

Начнем с инструментов, используемых в приложении.

Рисунок 1. Архитектура приложения
Рисунок 1. Архитектура приложения

Вычисления для процесса оптимизации выполняет продукт ILOG Optimization Decision Manager Enterprise 3.4 (ODME) (чтобы загрузить ознакомительную версию продукта, обратитесь к разделу Ресурсы). Это мощная платформа для разработки и развертывания решений по оптимальному проектированию и планированию с возможностями анализа совместной деятельности и анализа "что-если". В статье описывается использование приложением продукта IBM ILOG CPLEX (CPLEX) (показан в правой части рисунка 1), который является одним из механизмов оптимизации в ODME, для создания более интеллектуальных, экономящих ресурсы проектов и планов (см. увеличенную версию рисунка 1). Платформа поддерживает различные области применения, предоставляя интерфейсы для языков программирования C++, Java и .Net. В данной статье описывается интеграция с использованием Java API ILOG.

К приложению можно обратиться через Интернет посредством HTTP-запросов. Сервлеты предоставляют приложению средства обработки и реагирования на HTTP-запросы. Сервлеты поддерживают компонентный, независящий от платформы метод создания Web-приложений. В качестве контейнера для сервлетов Java мы использовали WebSphere Application Server Community Edition (WASCE).

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

Браузерные клиенты взаимодействуют с приложением посредством Web-интерфейса. В качестве исполнительной среды для Web-приложений мы использовали продукт IBM Lotus Connections. В архитектуре приложения он отвечает за взаимодействие с сервлетом и за предоставление клиентам Web-интерфейса. Lotus Connections поддерживает интерфейс iWidget – стандартную спецификацию IBM для виджетов, обеспечивающую совместимость между платформами и продуктами IBM (см. раздел Ресурсы).


Пример клиентского сеанса

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

Рекомендации генерируются проектами (примеры проектов показаны на рисунке 2). Каждый проект содержит одну или несколько связанных с ним вакансий различных видов (например, ученый-генетик или инженер-программист); возможно наличие несколько вакансий одного и того же вида.

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

  • На основе правила — использование правила, указывающего, что если кандидат имеет четырехлетний опыт работы на Java, а описание вакансии требует пяти лет, к оценке добавляется 0,8 пункта.
  • На основе графа — использование оценок силы связей в социальном и семантическом графах кандидата.
  • На основе анализа текста — измерение частоты совпадения терминов в резюме кандидата и описании работы.

Подробности вычисления оценки соответствия выходят за рамки данной статьи. Однако в других статьях данной серии описывается подход на основе анализа текста, который можно использовать для получения оценки соответствия. Приложение находит назначение, заполняющее столько вакансий, сколько возможно для имеющихся кандидатов, пытаясь достичь максимальной оценки соответствия для каждого назначения. Результаты отображаются пользователю в виде рекомендаций по назначению.

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

Специалист по кадрам запускает приложение, открыв его URL в браузере (в данной статье это http://<wasce_host>/smash_ilog/), где iWidget выводит список проектов (см. рисунок 2). Для продолжения работы необходимо выбрать проект.

Рисунок 2. Экран выбора проекта
Рисунок 2. Экран выбора проекта

Затем можно просмотреть и изменить данные вакансий, нажав кнопку Select seats (см. рисунок 3).

Рисунок 3. Выбор вакансий
Рисунок 3. Выбор вакансий

После выполнения всех изменений выполняется запрос на оптимизацию путем нажатия кнопки Optimization result. Вакансии проекта и рекомендуемые в результате оптимизации кандидаты на них отображаются на вкладке solution, как показано на рисунке 4.

Рисунок 4. Решение
Рисунок 4. Решение

Внутренние CPLEX-переменные, используемые в процессе оптимизации, отображаются на вкладке calculation data (см. рисунок 5).

Рисунок 5. Вкладка calculation data
Рисунок 5. Вкладка сalculation data

Журнал регистрации событий механизма CPLEX и статистика времени отображаются на вкладке engine log (см. рисунок 6).

Рисунок 6. Вкладка engine log
Рисунок 6. Вкладка engine log

Приложение изнутри

Структура и интеграция базы данных IBM DB2

Исходные данные, используемые в процессе оптимизации, находятся в базе данных DB2. Структура таблиц базы данных показана ниже.

Рисунок 7. Данные для оптимизации
Рисунок 7. Данные для оптимизации

Для взаимодействия с экземпляром DB2 сервлет оптимизации использует соединение JDBC. Предполагая, что контейнер сервлета (WASCE в нашем случае) был предварительно настроен на jdbc/YOUR_DB_NAME в качестве источника данных базы данных DB2, сервлет создает соединение с экземпляром DB2 и извлекает данные из базы:

Создание соединения и получение данных с помощью запроса
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ilogdb = (DataSource) envCtx.lookup("jdbc/YOUR_DB_NAME");
Connection con = (Connection) ilogdb.getConnection();

long id = 10;
ArrayList<Seat> al = new ArrayList<Seatt>();
String sql = "SELECT * FROM SEATS WHERE PROJECT_ID = " + id;
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
while (rs.next())
{
	Seat sl = new Seat();
	sl.setId(rs.getLong("ID"));
	sl.setPId(rs.getLong("PROJECT_ID"));
	sl.setName(rs.getString("NAME"));
	sl.setNmb(rs.getInt("COUNT"));
	sl.setAvl(rs.getBoolean("IS_AVAILABLE"));
	al.add(sl);
}
rs.close();
st.close();

Для передачи SQL-запросов используется класс Connection, con. Итоговая таблица представлена экземпляром класса ResultSet, rs.

Цикл while генерирует массив экземпляров Seat, чье содержимое соответствует строкам, извлеченным из таблицы SEATS базы данных DB2. Классы Project, Seat, Practitioner, Compatibility и OptimizationModel описывают другие элементы, хранящиеся в базе данных и использующиеся в процессе оптимизации.

Они создаются и группируются в коллекции при помощи соответствующих *Peer-классов (например, ProjectPeer, SeatPeer и т.д.), которые выполняют SQL-запросы к базе данных для извлечения операций жизненного цикла: создание, извлечение, обновление и удаление. Например, для извлечения данных используются приведенные ниже SQL-запросы; здесь id - это идентификатор проекта, передаваемый в извлекающий метод.

Запрос информации о проекте:

"SELECT * FROM PROJECTS"

Запрос информации о соответствии:

"SELECT * FROM COMP_LOSS WHERE SEAT_ID IN "
			+ "(SELECT ID FROM SEATS WHERE PROJECT_ID = "
			+ id
			+ ")"                       
			+ " ORDER BY SEAT_ID"

Запрос информации об исполнителе:

“SELECT * FROM PRACTITIONERS”.

Каждый из *Peer-классов возвращает результаты извлечения в виде массива ArrayList. Элементы ArrayList используются в процессе оптимизации путем создания специального источника данных ILOG, как описано в следующем разделе.

Java API для IBM ILOG

Для обращения к механизму CPLEX с целью выполнения оптимизации сервлет использует Java API ODME. С точки зрения Java API оптимизация процесса состоит из пяти этапов:

  1. Инициализация среды.
  2. Настройка модели.
  3. Настройка исходных данных.
  4. Выполнение вычислений.
  5. Очистка среды.

Ниже приведен пример использования API для IBM ILOG на языке Java.

Пример кода, использующего Java API для IBM ILOG
The complete listing should appear here

IloOplFactory.setDebugMode(false);
IloOplFactory oplF_ = new IloOplFactory();
IloOplErrorHandler errHandler_ = oplF_.createOplErrorHandler(System.err);
IloOplSettings settings_ = oplF_.createOplSettings(errHandler_);
IloCplex cplex_ = oplF_.createCplex();
cplex_.setParam(IloCplex.DoubleParam.WorkMem, 512);
String modelText = ModelPeer.getModelByName("tonkawa", con).getValue();
IloOplModelSource modelSource = 
	oplF_.createOplModelSourceFromString(modelText, “tonkawa”); 		
IloOplModelDefinition definition = oplF_.createOplModelDefinition(modelSource,settings_); 
opl_ = oplF_.createOplModel(definition, cplex_);
IloOplDataHandler handler = getDataHandler();
handler.startElement("ilog_var"
handler.addIntItem(10);
handler.endElement();
opl_.addDataSource(dataSource);
opl_.generate();
if ( cplex_.solve() == true)
	opl_.postProcess();
opl.end();
cplex.end();		
oplF.end();

Рассмотрим этот листинг поэтапно. На первом этапе сервлет создает экземпляр механизма оптимизации CPLEX и несколько вспомогательных переменных для обработки ошибок и настроек модели.

IloOplFactory.setDebugMode(false);
IloOplFactory oplF_ = new IloOplFactory();
IloOplErrorHandler errHandler_ = oplF_.createOplErrorHandler(System.err);
IloOplSettings settings_ = oplF_.createOplSettings(errHandler_);
IloCplex cplex_ = oplF_.createCplex();
cplex_.setParam(IloCplex.DoubleParam.WorkMem, 512);

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

Модель оптимизации настраивается в следующем фрагменте кода:

String modelText = ModelPeer.getModelByName("tonkawa", con).getValue();
IloOplModelSource modelSource = 
	oplF_.createOplModelSourceFromString(modelText, “tonkawa”); 		
IloOplModelDefinition definition = oplF_.createOplModelDefinition(modelSource,settings_); 
opl_ = oplF_.createOplModel(definition, cplex_);

Первая строка извлекает текст определения модели из базы данных, где она хранится под именем tonkawa. Две следующие строки создают объект, представляющий исходные данные модели оптимизации. Следующая строка создает определение модели, которое является внутренним представлением источника модели. Наконец, последняя строка кода создает экземпляр модели оптимизации.

На третьем этапе (настройка исходных данных) приложение создает входные переменные оптимизации во внутреннем формате ILOG и прикрепляет их к модели. Приложение использует в модели специальный источник данных. Это подразумевает назначение переменных оптимизации во внутреннем формате CPLEX и присваивание им значений до начала процесса оптимизации.

Чтобы использовать специальный источник данных, необходимо определить производный от IloCustomOplDataSource класс и метод customRead(), создающий переменные, которые будут использоваться в процессе оптимизации. Определение переменных выполняется с помощью экземпляра IloOplDataHander, возвращаемого путем вызова метода getDataHandler.

IloOplDataHandler handler = getDataHandler();

Новую переменную можно определить с помощью метода StartElement() класса handler:

handler.startElement("ilog_var");

Целые значения присваиваются посредством addIntItem(), а действительные - посредством addNumItem().

handler.addIntItem(10);

После присваивания метод endElement() завершает определение.

handler.endElement();

Обратите внимание: если переменная является массивом, ее можно обработать следующим образом:

handler.startElement("ilog_array");
handler.startArray();
for(int i=0; i<10; ++i)
	handler.addIntItem(i);
handler.endArray();
handler.endElement();

Массивы могут быть вложенными.

После определения переменных источник данных прикрепляется к модели OPL путем вызова метода addDataSource() класса IloOplModel:

opl_.addDataSource(dataSource);

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

opl_.generate();

Теперь задачу можно решить:

if ( cplex_.solve() == true)
	opl_.postProcess();

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

Чтобы очистить среду, необходимо вызвать метод end() для экземпляров модели, механизма CPLEX и фабрики:

opl.end();
cplex.end();		
oplF.end();

На рисунке 8 показаны классы, взаимодействующие с механизмом оптимизации ILOG.

Рисунок 8. Классы упаковщика оптимизации ILOG
Рисунок 8. Классы упаковщика оптимизации ILOG

Класс IlogOptimizer работает с API ILOG и запускает вычисления оптимизации. Он создает экземпляр класса OptimizationDataSource, который представляет источник данных для оптимизации.

Класс IlogDataRendererXML извлекает и упаковывает в XML-формате внутренние ILOG-переменные.

Теперь, познакомившись с взаимодействием сервлета и механизма оптимизации ILOG, давайте посмотрим на клиентскую сторону.

Библиотека Dojo

Библиотека Dojo - это высокоуровневая JavaScript-библиотека, используемая для создания клиентской части приложения. Она предназначена для создания и визуализации пользовательского интерфейса. Dojo предоставляет два способа описания элементов пользовательского интерфейса: декларативный и программный, как показано ниже.

Листинг 3. Декларативный стиль
<div id="mainTabContainer" dojoType="dijit.layout.TabContainer">
<div id="tab1" dojoType="dijit.layout.ContentPane" 
	title=" solution ">
  </div>
<div id="tab2" dojoType="dijit.layout.ContentPane"
 	title=" calculation data ">
  </div>
<div id="tab3" dojoType="dijit.layout.ContentPane"
 	title="engine log ">                        
  </div>            
</div>
Листинг 4. Программный стиль
var labelStep = new dijit.form.TextBox({value:"step:",            
                                     disabled:true,
                                     style:"width:50px;text-align:right"
                                            });        

var valEBox = new dijit.form.NumberTextBox({value:parmProps.defVal,
                                     constraints:
                                     {min:parmProps.minVal},
                                     style:"width:50px;text-align:right"
                                                });

Приложение также использует эту библиотеку для отправки запросов и анализа XML-ответов от сервлета оптимизации.

Клиентский пользовательский интерфейс состоит из двух частей: статической и динамической. Первая описывается в XML-формате в декларативном стиле, а вторая формируется программным способом в режиме реального времени. Пользовательский интерфейс заключен в стековый виджет-контейнер, который содержит три панели для выбора проектов, выбора вакансий и просмотра результата оптимизации (см. рисунки 2, 3 и 4). Стековый контейнер, содержащий панели, является статическим, но контент панели создается динамически.

Приведенные ниже классы создают контент и осуществляют взаимодействие с сервлетом:

ProjectSelectionItem
SeatSelectionItem
OptimizationResultItem

Они являются подклассами класса IlogInterfaceItem, который обеспечивает функциональность для отправки запросов и обработки ответов сервлета. Экземпляры трех этих классов агрегируются классом IlogInterface, который создается в Dojo-функции OnLoad.

Кроме того, IlogInterface посылает начальный запрос, сообщая сервлету, сколько элементов должно быть показано вдоль горизонтальной и вертикальной осей. Этот запрос выполняется из метода doRequest класса IlogInterface. Передачу первоначального запроса и создание классов обработки панелей выполняет конструктор класса IlogInterface.

Обмен данными между клиентом и сервлетом

Сообщения клиента и ответы сервлета приведены в таблице 1. Подзапросы, такие как upd_seats (обновить вакансии), связаны со своими высокоуровневыми запросами.

Таблица 1. Взаимодействие клиента и сервлета
Идентификатор сообщенияИдентификатор субсообщенияАтрибутыОтвет сервлетаПримечания
init maxNumX
maxNumY
Пустой Сообщение устанавливает количество элементов, отображаемых в вертикальном и горизонтальном направлениях.
sel_project positionY
Список имеющихся в базе данных проектов Атрибут postionY используется для разбиения на страницы и указывает возможное расположение в таблице PROJECTS базы данных.
sel_seats projectId,
positionY
Список вакансий для выбранного проекта Проект для обработки указывается через пользовательский интерфейс; атрибут positionY используется для разбиения на страницы.
sel_seats upd_seats ids[], counts[], availabilities[] Пустой Сообщение посылается для обновления базы данных при изменении пользователем каких-либо данных о вакансии.
opt_result calc_req projectId
Решение, переменные механизма, статистика Сообщение запускает процесс вычисления.
opt_result sol_req positionY Решение Используется для разбиения на страницы.
opt_result var_req name, positionX, positionY (необязательный) Значения переменных механизма Сообщение используется для навигации по переменным механизма.

Сервлет отправляет клиенту данные в XML-формате, поскольку XML легко создавать и анализировать в Dojo.

Пример XML-сообщения, возвращаемого клиенту
<solution objective="3054.3639800807873">
	<position title="Software engineer C++" index="0">
		<candidate index="0">
		John Doe
		</candidate>
		<candidate index="2">
		John Smith
		</candidate>
	</position>
	<position title="Software engineer Java" index="1">
		<candidate index="3">
		Jane Smith
		</candidate>
	</position>
</solution>

Одномерные данные заключаются в тег <d1>, в котором значения разделяются пробелами. Многомерные массивы обрабатываются следующим образом: каждое измерение заключается в тег dN, где N - номер измерения. Ниже приведен пример упаковки двумерного массива. В этом примере XML-сообщение является ответом на запрос upd_var о предоставлении значений переменной compatibility.

<item name="compatibility" type="MAP_NUM">
	<d2>
	<d1>
	432.67874830187907 157.5568843778936
	987.0323098531833 294.0221485741561 
	</d1>
	<d1>
	441.28662423809857 606.1236490975754
	117.37416729043002 539.3803607400704 
	</d1>
	<d1>
	579.6263501729665 380.9399328362894
	826.7802763365257 65.91520976844086 
	</d1>
	<d1>
	859.9294772959771 944.3249593145671 
	857.7524070538518 443.84433586006287 
	</d1>
	</d2>
</item>

Архитектура сервлета

Архитектура сервлета по сути состоит из трех частей: обработки запроса клиента, взаимодействия с DB2 и взаимодействия с ILOG ODM. Две последние части были описаны выше. Архитектура обработки запросов клиента изображена на рисунке 9.

Рисунок 9. Архитектура обработки запроса клиента
Рисунок 9. Архитектура обработки запроса клиента

Класс IlogServiceDB реализует функциональность сервлета (например, интерфейс HttpServlet) и отвечает за обработку HTTP-запросов GET от клиента пользовательского интерфейса.

Класс ClientRequestsHandler обрабатывает запросы от клиента, пока сеанс клиента активен. Он отправляет запросы обработчикам, которые агрегированы в экземпляр класса контейнером TreeMap.

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

Класс InitRequest получает максимальное число элементов для отображения в случае многомерных данных и сохраняет эти параметры в статических переменных класса ClientRequestSession.

Класс RequestProjects получает данные из таблицы PROJECTS и отправляет их клиенту.

Класс RequestSeats делает то же самое, что и RequestProjects, для таблицы SEATS.

OptimizationResultsRequest обрабатывает запросы либо на выполнение оптимизации, либо на получение результатов оптимизации. Каждый тип запроса обрабатывается соответствующим методом.

StatisticsLog выводит сообщения на указанное устройство, добавляя при необходимости отметки времени.

Диаграммы последовательности на рисунках 10 и 11 показывают, как обрабатываются клиентские HTTP-запросы GET. На рисунке 10 показано использование вызова метода GetAttribute для получения экземпляра сессии класса ClientRequestHandler (см. увеличенную версию рисунка 10).

Рисунок 10. Последовательность обработки HTTP-запроса GET
Рисунок 10. Последовательность обработки HTTP-запроса GET

Диаграмма последовательности на рисунке 11 показывает, как обрабатывается запрос вычисления. Диаграмма также иллюстрирует взаимодействие с ODME при выполнении оптимизации (см. увеличенную версию рисунка 11).

Рисунок 11. Последовательность обработки запроса вычисления
Рисунок 11. Последовательность обработки запроса вычисления

Заключение

Приложение было протестировано с различными наборами тестовых данных; измеренные временные характеристики приведены в таблице 2.

Вычисления всегда требовали больше времени, чем извлечение и передача данных, потому что в развернутой среде, используемой для измерений, ODME и экземпляр DB2 располагались на разных виртуальных машинах, находящихся на одном физическом сервере.

Таблица 2. Статистика времени для процесса оптимизации
Размер (вакансии х исполнители)Передача данных в память JVMВычисление
4x4 вакансиисоответствияисполнителиВсего
выполнение запроса 00:00,000 00:00,000 00:00,015 00:00,015 00:00,063
передача данных 00:00,000 00:00,000 00:00,000
100x100 вакансиисоответствияисполнителиВсего
выполнение запроса 00:00,016 00:00,015 00:00,015 00:00,234 00:00,594
передача данных 00:00,000 00:00,188 00:00,000
1000x1000 вакансиисоответствияисполнителиВсего
выполнение запроса 00:00,015 00:00,062 00:00,078 00:10,812 01:35,344
передача данных 00:00,063 00:10,579 00:00,015

Каждый компонент приложения наряду со своими основными функциями обеспечивает возможности для интеграции в единую среду. В связи с этим разработчики имеют возможность создавать сложную распределенную инфраструктуру простым и понятным способом. В качестве единой платформы разработки каждого из компонентов можно использовать Eclipse IDE. В комплекте с Web-контейнером WASCE она предоставляет мощные возможности для отладки Java-кода.

В статье представлено Web-приложение, извлекающее данные из удаленной базы данных и использующее ILOG CPLEX для выполнения оптимизации.


Загрузка

ОписаниеИмяРазмер
Исходный код примера клиентаtonkawa_iwidget_jscript.zip9.71 КБ
Исходный код примера сервераtonknawa_src_java.zip10 КБ

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


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

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Lotus
ArticleID=775941
ArticleTitle=Организация интеллектуальной совместной деятельности в сфере образования с использованием Lotus Connections: Часть 2. Oптимизация назначения студентов в исследовательские проекты
publish-date=11212011