Colaboração Mais Inteligente para o Segmento de Mercado de Educação Usando o Lotus Connections, Parte 2: Otimize a designação de estudantes a projetos de pesquisa

Use um modelo de otimização IBM ILOG com dados provenientes de um banco de dados relacional

Este artigo descreve como desenvolver um aplicativo da web que ajuda a otimizar a designação de estudantes para posições de projetos de pesquisa. O processo de designação recupera dados a partir de um banco de dados DB2 remoto, e usa o ILOG CPLEX para executar a otimização. Um cliente baseado em um navegador da web interage com o aplicativo a partir do IBM Lotus® Connections, por meio do iWidgets.

Anton Zorin, Software Engineer, IBM

Photograph of Anton ZorinAnton Zorin é engenheiro de software IBM desde 2006. Seu foco principal são as áreas de desenvolvimento web, otimização linear e analítica de texto. Também participou do desenvolvimento de sistemas multi-ware, processamento de imagens e computação reconfigurável.



Carl Osipov, Software Architect, IBM

CarlCarl Osipov é um experiente arquiteto de software da organização de estratégia e tecnologia do IBM Software Group. Suas qualificações estão relacionadas às áreas de computação distribuída, desenvolvimento de aplicativos de fala e entendimento do idioma natural por computadores. Ele já publicou e fez apresentações sobre SOA (Arquitetura Orientada a Serviços) e gerenciamento de diálogo de conversação para colegas do segmento de mercado e do mundo acadêmico. Seu foco atual é o design de técnicas de reutilização para serviços de negócios compostos.



14/Mai/2014

Introdução

Este artigo descreve como desenvolver um aplicativo da web que fornece recomendações sobre a designação de estudantes para posições em projetos de pesquisa. O aplicativo recupera dados a partir de um banco de dados remoto, e usa o ILOG CPLEX para executar uma otimização com base nos dados. Usa-se uma interface da web para especificar restrições e parâmetros de peso, e para representar o resultado da otimização a um usuário. Os cálculos de otimização são solicitados pelo servlet, que recupera os dados de entrada do processo de otimização a partir de um banco de dados DB2 remoto, inicia o processo, representa o resultado do cálculo como saída em XML, e envia a saída de volta para o usuário. O servlet é instalado no mesmo nó de rede e no mesmo sistema operacional que a instância do mecanismo de otimização ILOG CPLEX.

A primeira parte do artigo descreve as ferramentas e tecnologias para desenvolver o aplicativo. Nela, cada ferramenta é explicada em termos do seu propósito geral e de como é usada no aplicativo.

A segunda parte dá um exemplo de uma sessão de cliente interativa, e explica como o usuário pode especificar os dados de entrada e iniciar o processo de otimização.

A terceira parte do artigo apresenta uma visão geral da arquitetura do aplicativo e explora as funções do servlet, da™ API Java e do mecanismo de otimização ILOG CPLEX na arquitetura do aplicativo. Esta parte também descreve a biblioteca Dojo, usada para implementar a interface da web para suportar a interação com o usuário, e o formato de troca de dados entre o servlet e um cliente do navegador.

A quarta parte conclui o artigo com uma análise das medições de tempo dos estágios do processo de otimização.

É possível fazer o download e visualizar o código de origem da solução descrita neste artigo (consulte Downloads para ver os links).

Ambiente, ferramentas e tecnologias.

Vamos começar com as ferramentas usadas dentro do aplicativo.

Figura 1. Arquitetura do aplicativo

Os cálculos para o processo de otimização são feitos pelo ILOG Optimization Decision Manager Enterprise 3.4 (ODME) (consulte Recursos para fazer o download da versão de testes). É uma plataforma eficiente para desenvolver e implementar soluções de programação e planejamento baseadas na otimização, que oferecem colaboração e análise hipotética. O artigo descreve como o aplicativo usa o IBM ILOG CPLEX (CPLEX), mostrado no lado direito da Figura 1, um dos mecanismos de otimização no ODME para criar planos e programações mais inteligentes e eficientes em relação aos recursos. (Veja uma versão maior da Figura 1).) A plataforma suporta diversos domínios de aplicativo, fornecendo interfaces para linguagens de programação C++, Java e .Net. Este artigo descreve o uso da API Java do ILOG para integração.

O aplicativo é acessado pela Internet por meio de solicitações de HTTP. Os servlets fornecem as instalações para que o aplicativo trate e responda às solicitações de HTTP. Os servlets suportam um método independente de plataforma, baseado em componentes, para o desenvolvimento de aplicativos baseados na web. Para este artigo, usamos o WebSphere Application Server Community Edition (WASCE) como contêiner para os Java Servlets.

Uma vez que o aplicativo foi projetado para que o mecanismo de otimização processe grandes quantidades de dados (centenas de milhares de variáveis), é necessário um banco de dados para armazenar os dados e navegar eficientemente neles. Escolhemos o IBM DB2 como o sistema de gerenciamento de banco de dados.

Os clientes do navegador da web interagem com o aplicativo usando uma interface da web. Para este artigo, usamos o IBM Lotus Connections como o ambiente de tempo de execução para aplicativos da web. Na arquitetura do aplicativo, ele é responsável pela interação com o servlet, e para a entrega da interface da web para os clientes. O Lotus Connections suporta o iWidget, uma especificação IBM que suporta uma definição padrão de um widget e interoperabilidade ao longo de plataformas e produtos IBM (consulte Recursos).


Exemplo de sessão do cliente

O objetivo do aplicativo é fornecer recomendações sobre a designação de estudantes para posições (seats) em projetos de pesquisa. Se o número de posições e estudantes é grande, então a geração manual das recomendações de designação se torna demorada. O aplicativo resolve esse problema, automatizando uma análise que otimiza as recomendações.

As recomendações são geradas pelo projeto (consulte a Figura 2 para ver exemplos de projetos). Cada projeto contém uma posição associada (ou mais) de tipos diferentes (por exemplo, um geneticista ou engenheiro de software); é possível haver diversas posições do mesmo tipo.

O aplicativo usa pontuações de compatibilidade que descrevem a correlação entre os estudantes candidatos e as descrições da posição; valores de pontuação mais altos correspondem a uma correlação melhor. Existem várias opções para gerar a pontuação, tais como:

  • Com base em regras— usando uma regra que prescreve que, se um candidato tem quatro anos de experiência em Java e a descrição da posição pede cinco, é adicionado 0,8 ponto à pontuação.
  • Com base em um gráfico— usando pontuações referentes às forças das conexões nos gráficos social e semântico do candidato.
  • Com base na análise de texto—que mede a frequência da coocorrência de termos no currículo do candidato e na descrição do trabalho.

Os detalhes do cálculo da pontuação de compatibilidade estão fora do escopo deste artigo. Entretanto, outros artigos desta série descrevem uma abordagem de analítica de texto que pode ser usada para calcular a pontuação de compatibilidade. O aplicativo localiza a designação que preenche a maior quantidade possível de seats com os candidatos disponíveis, tentando obter a maior pontuação de compatibilidade possível para cada designação. Os resultados são mostrados como recomendações de designação para os usuários.

Um especialista em formação de equipes é o usuário do aplicativo que designa os estudantes às posições. Para que o especialista em formação de equipes possa começar a usar o aplicativo, o administrador deve assegurar que o banco de dados do aplicativo esteja preenchido com informações sobre projetos, posições, estudantes e compatibilidade entre estudantes e posições.

O especialista em formação de equipes inicia o aplicativo abrindo o navegador da web na URL do aplicativo (a URL usada por este artigo é http://<wasce_host>/smash_ilog/), onde um iWidget renderiza uma lista de projetos (veja a Figura 2). O especialista deve escolher um projeto para continuar.

Figura 2. Tela de seleção de projeto

Em seguida, o especialista tem a opção de clicar no botão Select seats para ver e modificar os dados dos seats (veja a Figura 3).

Figura 3. Seleção de seats

Depois de realizar todas as modificações, o especialista solicita a otimização apertando o botão Optimization result .A guiasolution , como se pode ver na Figura 4, mostra os seats do projeto e os candidatos recomendados para os mesmos, do ponto de vista da otimização.

Figura 4. Solução

A guia calculation data mostra as variáveis internas do CPLEX usadas no processo de otimização (veja a figura 5).

Figura 5. Dados de cálculo

O log do mecanismo do CPLEX e as estatísticas de tempo são mostrados na guia engine log (A Figura 6).

Figura 6. Log do mecanismo

Funcionamento do aplicativo

Estrutura do banco de dados IBM DB2 e integração

Os dados de entrada usados pelo processo de otimização estão localizados no banco de dados DB2. A estrutura das tabelas de banco de dados é mostrada a seguir.

Figura 7. Dados para a otimização

O servlet de otimização usa uma conexão JDBC para interagir com a instância do DB2. Supondo que o contêiner do servlet (no nosso caso, WASCE) foi pré-configurado com jdbc/YOUR_DB_NAME como a origem de dados do banco de dados DB2, o servlet cria a conexão à instância do DB2 e recupera dados do banco de dados:

Criar uma conexão e recuperar dados usando uma consulta
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();

A conexão, con, é usada para enviar solicitações de SQL. A tabela resultante é representada pela instância da classe ResultSet rolável , rs.

O Loop gera um array de instâncias de Seat , cujo conteúdo corresponde às linhas recuperadas a partir da tabela SEATS do banco de dados DB2. As classes a seguir descrevem as outras entidades armazenadas no banco de dados e usadas pela otimização: Project, Seat, Practitioner, Compatibility, e OptimizationModel.

São instanciadas e agrupadas em coleções usando as classes *Peer correspondentes (como ProjectPeer, SeatPeer, etc.) que fazem solicitações de SQL ao banco de dados para operações do ciclo de vida da entidade: criação, recuperação, atualização e exclusão. Por exemplo, as solicitações de SQL a seguir são usadas para recuperar os dados, nos quais é o Identificador do projeto, passado ao método de recuperação.

Para solicitar informações sobre o projeto, a consulta é:

"SELECT * FROM PROJECTS"

Para solicitar informações de compatibilidade, a consulta é:

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

Para solicitar informações sobre profissionais, a consulta é:

“SELECT * FROM PRACTITIONERS”.

Cada uma das classes *Peer retorna resultados da recuperação como um ArrayList vazia. As entidades do ArrayList são usadas para a otimização, ao desenvolver uma origem de dados customizada de ILOG, conforme descrito na próxima seção.

API Java para o IBM ILOG

O servlet usa a API Java do ODME para solicitar que o mecanismo de CPLEX faça a otimização. Do ponto de vista da API Java, o processo de otimização é formado por cinco estágios:

  1. Inicializar o ambiente
  2. Configurar um modelo
  3. Configurar os dados de origem
  4. Fazer cálculos
  5. Limpar o ambiente

Este é um exemplo do uso da API para o IBM ILOG na linguagem Java.

Código de amostra usando a API Java para o IBM ILOG
A listagem completa deve aparecer aqui

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();

Examinaremos essa listagem por estágios. No primeiro estágio, o servlet cria uma instância do mecanismo de otimização CPLEX e algumas variáveis secundárias, incluindo manipulação de erros e configurações de modelo.

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);

A última cadeia de caracteres da listagem configura a quantidade de memória a ser usada pelo mecanismo de otimização. Isso é feito para suportar a otimização para dados de entrada grandes. Isso conclui a inicialização.

O modelo de otimização é configurado no código a seguir:

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

A primeira linha recupera o texto da definição do modelo a partir do banco de dados no qual está armazenado com o nome tonkawa. As duas linhas a seguir criam o objeto que representa a origem de entrada do modelo de otimização. A linha seguinte cria a definição de modelo, a representação interna da origem do modelo. Finalmente, a última linha do código cria uma instância do modelo de otimização.

No terceiro estágio (configurar os dados de origem), o aplicativo cria as variáveis de entrada da otimização no formato interno do ILOG e as conecta ao modelo. O aplicativo usa uma origem de dados customizada para um modelo. Implica a alocação das variáveis de otimização em um formato interno do CPLEX, e sua atribuição antes do início do processo de otimização.

Para usar uma origem de dados customizada, é necessário definir uma classe derivada de IloCustomOplDataSource e um método customRead(), que cria as variáveis a serem usadas no processo de otimização. As variáveis são definidas usando a instância de IloOplDataHander, que é retornado pela chamada do método getDataHandler .

IloOplDataHandler handler = getDataHandler();

Pode-se definir uma nova variável usando o método startElement() do manipulador:

handler.startElement("ilog_var");

Em seguida, o valor é designado por addIntItem(), para um número inteiro, ou addNumItem() , para valores reais.

handler.addIntItem(10);

Depois da designação, o método endElement() conclui a definição.

handler.endElement();

Observação: se a variável está em um array, ela pode ser tratada da seguinte forma:

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

Os arrays também podem ser aninhados.

Depois que todas as variáveis são definidas, a origem de dados é conectada ao modelo do OPL, chamando o método addDataSource() da classe IloOplModel:

opl_.addDataSource(dataSource);

Depois que a origem de dados é conectada, o problema de otimização no formato interno do ILOG é gerado e extraído pelo método generate() , que lê dados, executa o pré-processamento e cria a representação do problema.

opl_.generate();

Agora, é possível resolver o modelo

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

Se a solução foi encontrada, o método solve() retorna true , e o pós-processamento ocorre. Geralmente, o pós-processamento é usado para agregar, converter e formatar dados (inclusive os dados de resultado) para exibir ou enviar a outro aplicativo, como uma planilha.

Para limpar o ambiente, é necessário chamar o método end() para as instâncias do modelo, o mecanismo de CPLEX e o factory:

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

O diagrama da Figura 8 mostra as classes que interagem com o mecanismo de otimização do ILOG.

Figura 8. Classes do wrapper de otimização do ILOG

A classe IlogOptimizer trabalha com a API do ILOG e envia os cálculos de otimização. Ela instancia uma classe OptimizationDataSource , que representa uma origem de dados para a otimização.

A classe IlogDataRendererXML recupera e quebra as variáveis internas do ILOG na forma de XML.

Agora que foi possível ver a interação do servlet com o mecanismo de otimização do ILOG, examinaremos o lado do cliente.

Biblioteca Dojo

A biblioteca Dojo é uma biblioteca JavaScript de alto nível, usada para desenvolver o lado do cliente do aplicativo. Ela cria e renderiza a interface com o usuário. O Dojo fornece duas formas de descrever os itens da interface com o usuário: declarativa e programática, como se mostra a seguir.

Listagem 3: Estilo declarativo
<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>
Listagem 4: Estilo programático
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"
                                                });

O aplicativo também usa a biblioteca para enviar solicitações, e para analisar as respostas XML provenientes do servlet do aplicativo.

A interface do cliente com o usuário é desenvolvida a partir de duas partes: estática e dinâmica. A primeira é descrita em XML, em estilo declarativo; a segunda gerada programaticamente em tempo real. A interface com o usuário fica contida em um widget de contêiner de pilha que contém três painéis para a seleção de projetos, seleção de seats e revisão do resultado da otimização(veja da Figura 2 até a Figura 4). O contêiner de pilha que contém os painéis é estático, mas o conteúdo dos painéis é criado dinamicamente.

As classes a seguir criam o conteúdo e implementam a interação com o servlet:

ProjectSelectionItem
SeatSelectionItem
OptimizationResultItem

São subclasses da classe IlogInterfaceItem , que fornece funcionalidade para enviar solicitações ao servlet e manipular as respostas do mesmo. As instâncias dessas três classes são agregadas pela classe IlogInterface , que é instanciada na função do Dojo OnLoad .

IlogInterface também envia a solicitação inicial, que informa ao servlet quantos itens devem ser exibidos ao longo dos eixos horizontal e vertical. Esta solicitação é chamada a partir do método IlogInterfacedoRequest. O envio da solicitação inicial e criação dos painéis que manipulam classes são realizados pelo construtor de IlogInterface.

Troca de dados entre o cliente e o servlet

As mensagens do cliente e as respostas do servlet são descritas na Tabela 1. Subsolicitações como upd_seats (ou seja, atualizar seats) são conectadas às solicitações de alto nível.

Tabela 1. Interação entre cliente e servlet

ID de mensagemID de submensagemResposta do servletObservações
init maxNumX
maxNumY
Vazia Esta mensagem serve como configuração do número de itens a serem exibidos na vertical e na horizontal
sel_project positionY
Lista dos projetos existentes no banco de dados O atributo postionY é usado para a paginação, e especifica a posição virtual dentro da tabela PROJECTS do banco de dados
sel_seats projectId,
positionY
Lista de seats referentes ao projeto selecionadoO projeto a ser processado é especificado por meio da interface com o usuário; o atributo positionY é usado para a paginação
sel_seats upd_seats ids[], counts[], availabilities[] empty Esta mensagem é enviada para atualizar o banco de dados quando alguns dados de seats são alterados por um usuário
opt_result calc_req projectId
Solução, variáveis de mecanismo, estatísticas Esta mensagem envia o processo de cálculo
opt_result sol_req positionY Solução Usado para paginação
opt_result var_req name, positionX, positionY (opcional) Valores de uma variável de mecanismo Esta mensagem é usada para navegar pelas variáveis de mecanismo

O servlet envia dados para um cliente no formato XML, uma vez que é fácil criar e analisar XML no Dojo.

Exemplo de uma mensagem XML retornada para o cliente
<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>

O agrupamento dos dados unidimensionais é feito pela tag <d1> , na qual os valores são separados por espaços. Os arrays multidimensionais são tratados da seguinte forma: cada dimensão é quebrada com a tag dN, onde N é um número da dimensão. Por exemplo, um array bidimensional é quebrado da forma mostrada a seguir. Nesse exemplo, a mensagem XML é uma resposta a uma solicitação upd_var , que solicita valores da variável 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>

Arquitetura do servlet

Basicamente, a arquitetura do servlet contém três partes: manipulação da solicitação do cliente, interação com o DB2 e interação com o ILOG ODM. As duas últimas foram descritos acima. A arquitetura da manipulação das solicitações do cliente é descrita a seguir.

Figura 9. Arquitetura da manipulação de solicitações do cliente

A classe IlogServiceDB implementa a funcionalidade de servlet (por exemplo, a interface HttpServlet), e é responsável pela manipulação das solicitações de HTTP GET a partir do cliente da interface com o usuário.

A classe ClientRequestsHandler manipula solicitações provenientes de clientes enquanto a sessão do cliente está ativa. Ela despacha as solicitações para os manipuladores, que são agregadas na instância da classe por um contêiner TreeMap.

ClientRequestSession é uma classe base para os manipuladores de solicitações do cliente. Estabelece e mantém uma conexão ativa ao banco de dados enquanto uma solicitação é tratada.

A classe InitRequest recebe o número máximo de itens a serem exibidos para os dados dimensionais, e armazena esses parâmetros nas variáveis estáticas da classe ClientRequestSession de método único.

A classe RequestProjects recupera dados da tabela PROJECTS e os envia para o cliente.

A classe RequestSeats faz o mesmo que RequestProjects para a tabela SEATS.

OptimizationResultsRequest manipula solicitações para executar a otimização ou obter alguns resultados da otimização. Cada tipo de solicitação é processado pelo método correspondente.

StatisticsLog imprime mensagens na saída especificada e acrescenta registros de data e hora, se necessário.

Os diagramas de sequência da Figura 10 e da Figura 11 mostram como as solicitações de HTTP GET do cliente são processadas. Na Figura 10, o método getAttribute é usada para recuperar uma instância de sessão da classe ClientRequestHandler. (Veja uma versão maior da Figura 10.)

Figura 10. Sequência de processamento de HTTP GET

O diagrama de sequência da Figura 11 mostra como a solicitação de cálculo é manipulada. O diagrama também ilustra a interação com o ODME para executar a otimização. (Veja uma versão maior da Figura 11.)

Figura 11. Sequência de processamento da solicitação de cálculo

Conclusão

O aplicativo foi testado com conjuntos diferentes de dados de teste, e as características do tempo medido são mostradas na Tabela 2.

Os cálculos sempre levaram mais tempo do que a extração e transferência de dados, pois, no caso do ambiente de implementação usado para as medições, o ODME e a instância do DB2 estavam localizados em máquinas virtuais diferentes, mas hospedados em um único servidor físico.

Tabela 2. Estatísticas de tempo referentes ao processo de otimização

Tamanho (seats x profissionais)Transferência de dados para a memória da JVMCálculo
4x4 seatscompatibilidadesprofissionaisTotal
execução da consulta 00:00,000 00:00,000 00:00,015 00:00,015 00:00,063
transferência de dados 00:00,000 00:00,000 00:00,000
100x100 seatscompatibilidadesprofissionaisTotal
execução da consulta 00:00,016 00:00,015 00:00,015 00:00,234 00:00,594
transferência de dados 00:00,000 00:00,188 00:00,000
1000x1000 seatscompatibilidadesprofissionaisTotal
execução da consulta 00:00,015 00:00,062 00:00,078 00:10,812 01:35,344
transferência de dados 00:00,063 00:10,579 00:00,015

Cada componente do aplicativo, juntamente com os recursos para o seu propósito principal, fornece possibilidades de integração a um ambiente único. Devido a isso, os desenvolvedores têm a capacidade de desenvolver uma infraestrutura distribuída complexa, de forma simples e objetiva. Pode-se usar o IDE Eclipse como um framework de desenvolvimento unificado para cada um dos componentes. Combinado com o contêiner da web WASCE, ele fornece recursos eficientes para depurar código Java.

O artigo apresentou um aplicativo da web que recupera dados a partir de um banco de dados remoto, e usa o ILOG CPLEX para executar a otimização.


Downloads

DescriçãoNomeTamanho
Client sample source codetonkawa_iwidget_jscript.zip9.71KB
Server sample source codetonknawa_src_java.zip10KB

Recursos

Aprender

Obter produtos e tecnologias

  • ILOG ODM Enterprise 3.4: faça o download de uma versão de testes do ILOG ODM Enterprise 3.4.
  • Versão de teste do software IBM: Avalie os produtos de software da IBM da maneira que for melhor para você. De downloads de versão de testes a produtos hospedados em nuvem, o developerWorks tem software especialmente para desenvolvedores.

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Segmentos de mercado, Lotus
ArticleID=630201
ArticleTitle=Colaboração Mais Inteligente para o Segmento de Mercado de Educação Usando o Lotus Connections, Parte 2: Otimize a designação de estudantes a projetos de pesquisa
publish-date=05142014