Conteúdo


Introdução ao IBM ILOG CPLEX Enterprise Server

Escalabilidade, failover e interação com o cliente para as suas soluções de otimização

Comments

Introduction

O IBM ILOG CPLEX Optimization Studio, disponível para download na versão de avaliação no developerWorks, é uma consolidação do ambiente de desenvolvimento integrado OPL e do mecanismo da solução CPLEX e CP Optimizer em um único produto. O IBM ILOG CPLEX Enterprise Server, um componente novo, permite a implementação de modelos e soluções dentro de uma arquitetura de cliente/servidor.

O CPLEX Enterprise Server é um ambiente do servidor escalável que oferece um serviço de otimização baseado nos projetos OPL. Ele fornece uma plataforma de escala corporativa para desenvolvimento e implementação de analítica baseada em otimização altamente efetiva planejando e programando soluções por meio de diversos segmentos de mercado.

Com o CPLEX Enterprise Server, agora é possível:

  • Implementar a sua solução de otimização CPLEX como um aplicativo cliente em Java.
  • Enviar um aplicativo OPL (que é composto atualmente de um projeto OPL).
  • Questionar para resolver uma configuração de execução específica.
  • Obter o status do trabalho resolvido.
  • Recuperar a solução.

O CPLEX Enterprise Server suporta: Windows® Server 2008 de 32/64 bits, AIX® 5.3 e AIX 6.1 de 64 bits. Ele pode ser implementado em servidores de aplicativos JavaEE, como o WebSphere® Application Server V7.0 e WebSphere Application Server Community Edition V2.1.1.5.

O CPLEX Enterprise Server é baseado na arquitetura do IBM ILOG ODM Enterprise Optimization Server. Ele fornece:

  • Escalabilidade, por causa dos vários nós de processador, um nó de processador é um servidor encarregado de executar trabalhos de otimização.
  • Failover, reiniciando automaticamente os trabalhos em caso de erros inesperados.
  • Interação do cliente com o processo de otimização em andamento.

É possível implementar o projeto OPL ao CPLEX Enterprise Server, armazená-lo em um banco de dados e extraí-lo no servidor para ser usado pelas tarefas de otimização. Para obter um melhor isolamento de código, a execução está em um subprocesso para o encadeamento ideal e gerenciamento de memória. Isso também evita que erros inesperados afetem o servidor de aplicativos. Cada nó de processador é capaz de executar diversos processos de otimização em paralelo (diversos subprocessos).

O CPLEX Enterprise Server possui um console da web para: visualizar e remover a implementação de aplicativos, monitorar e parar tarefas em andamento (ODM Enterprise Dashboard) e consultar status e conclusão de tarefa.

O CPLEX Enterprise Server fornece uma API de cliente Java que é incluída como um serviço da web. A comunicação entre o cliente e o servidor é feita por meio de protocolos HTTP. Qualquer pessoa com privilégio de acesso para a URL do servidor pode implementar/desimplementar/listar aplicativos e enviar/cancelar/excluir tarefas.

Se comparado a um mecanismo de solução local, o CPLEX Enterprise Server possui algumas limitações. Ao escrever o modelo OPL, considere o seguinte.

  • Apenas dados sequenciais (.dat que contenham todos os valores) ou instruções de banco de dados são suportados.

    O Excel e a conexão SPSS não são suportados nesta versão.

  • Não há criptografia automática.

    É possível usar a compilação OPL de modelos OPL se desejar algum nível de confidencialidade em seu aplicativo implementado.

  • Todos os modelos e submodelos incluídos devem estar na pasta de projeto OPL. As subpastas também são suportadas.

Nesse artigo, saiba como o CPLEX Enterprise Server permite que você opere aplicativos em modo cliente/servidor com o CPLEX no servidor e interaja com o cliente que inicia a otimização.

Visão geral da arquitetura

a Figura 1 mostra a arquitetura de alto nível do CPLEX Enterprise Server.

Figura 1. Arquitetura do CPLEX Enterprise Server
Arquitetura do CPLEX Enterprise Server
Arquitetura do CPLEX Enterprise Server

Instale o CPLEX Enterprise Server

O novo instalador CPLEX é composto por Java EE Enterprise Archives (EARs) em:
<Install Dir>/server/ears/cplexserver-processor-ear-{x86_win32,
x86_win64ou
power64_aix.5.3_9.0}.ear.

Se instalar o ODM Enterprise 3.6 com uma instância integrada do WebSphere Application Server, você terá um CPLEX Enterprise Server pronto para ser usado em uma instância integrada do WebSphere Application Server. O perfil padrão é AppSrvOptim. Ou, é possível usar um servidor de aplicativos diferente para instalar o CPLEX Enterprise Server, como o WebSphere Application Server Community Edition, que tem recebido suporte desde o ODM Enterprise 3.6.

Implementação no WebSphere Application Server Community Edition

Para instalar os componentes do CPLEX Enterprise Server no WebSphere Application Server Community Edition, execute o script a seguir em uma ferramenta de linha de comando:
<Install Dir>/server/configure-scripts/wasce-resources/installServer.bat

A opção padrão de componentes "All" configurará o banco de dados necessário e os recursos Java Message Service e, em seguida, implementará todos os EARs ao WebSphere Application Server Community Edition.

Se deseja instalar o CPLEX Enterprise Server no WebSphere Application Server Community Edition de modo separado, é possível implementar o EAR manualmente (usando o console de Administração ou a ferramenta de linha de comando). Se for implementar manualmente, certifique-se de que os componentes básicos do servidor ODME (Aplicação e Gerenciamento de Tarefa) estejam prontos.

Desenvolver o projeto OPL

Os profissionais de Operation Research (OR) desenvolvem o projeto de otimização ao: programar o modelo em OPL, manipular o acesso a dados dentro do OPL, criar configuração de execução no projeto OPL e testá-lo de modo local.

Para simplificar, usaremos o exemplo a seguir.

  1. No CPLEX Optimization Studio, inicie o IDE.
  2. Selecione o conjunto de dados Arquivo NovoExample... → IBM ILOG OPL Examplesnurses, como mostra a Figura 2.
  3. Clique em Concluir.
Figura 2. Importar nurses OPL de exemplo
Importar nurses OPL de exemplo
Importar nurses OPL de exemplo

Um projeto OPL chamado nurses é criado, o que inclui o modelo OR e arquivo de dados.

Para criar o projeto Java que irá interagir com o servidor, é necessário incluir as seguintes bibliotecas Java à dependência do caminho da classe do projeto, como na A figura 3.

  • <Install Dir>/CPLEX_Server/client/lib/axis2-client.jar
  • <Install Dir>/CPLEX_Server/client/lib/cplexserver-client.jar
  • <Install Dir>/CPLEX_Server/client/lib/icu4j.jar
  • <Install Dir>/CPLEX_Server/client/lib/lpgruntime.jar
  • <Install Dir>/CPLEX_Server/client/lib/odmeserver-client.jar
Figura 3. Incluir bibliotecas Java
Incluir bibliotecas Java
Incluir bibliotecas Java

Classes de API do cliente

Use as classes do pacote com.ibm.ilog.optim.server.client, conforme mostrado em A figura 4, para:

  • Conectar-se ao CPLEX Enterprise Server.
  • Implementar o aplicativo.
  • Enviar uma tarefa de otimização para uma configuração de execução existente.
  • Obter resultados de tarefa e soluções de modelo de otimização, quando disponível.
Figura 4. Pacote com.ibm.ilog.optim.server.client
Pacote com.ibm.ilog.optim.server.client
Pacote com.ibm.ilog.optim.server.client

É possível acessar os dados OPL, como array, tupla, conjunto, dvar e dexpr, com classes no pacote com.ibm.ilog.optim.server.client.opl.element mostrado na Figura 5,.

Figura 5. Pacote com.ibm.ilog.optim.server.client.element
Pacote com.ibm.ilog.optim.server.client.element
Pacote com.ibm.ilog.optim.server.client.element

No momento em que essa publicação foi escrita, a API do cliente possui algumas limitações. Por exemplo, não há método find() para o elemento Set, não é possível acessar os elementos de um Mapa por meio do indexador e não há controle sobre os conflitos/relaxamento (mas, é possível usar as configurações OPL para alterná-los para ligado/desligado em seu arquivo .mod).

Exemplo usando a API do cliente

Após concluir o projeto e o modelo OPL, é possível desenvolver o aplicativo cliente usando a API do Cliente JAVA CPLEX Enterprise Server.

Listagem 1 mostra como implementar o projeto OPL ao Servidor CPLEX e, em seguida, remover a implementação dele.

Implementar código de projeto OPL
 /** Creates a new OPL application named "nurses" .*/
                OplApplicationPackager packager = CplexServerFactory.createApplicationPackager
                ("nursesCPLEX",new File("C:/Documents and Settings/Administrator
                /workspace/nurses")); /** Creates a connection with the CPLEX Enterprise Server.*/
                CplexServer server = CplexServerFactory.createCplexServer
                ("http://localhost:8080/odme"); /** * We will deploy our OPL application but if an
                OPL application with the same name is * already deployed, we will use it. */
                Application appId = null; try { appId = server.deploy(packager); } catch
                (ApplicationAlreadyDeployedException e) { /** * If an application with the same name
                is already deployed, we will use it. */ appId =
                server.getDeployedApplication("nursesCPLEX"); } /** Undeploy the OPL application.
                **/ server.undeploy(appId);

Listagem 2 mostra como submeter uma tarefa de otimização para o CPLEX Enterprise Server e monitorar o status dela.

Listagem 2. Submeter código da tarefa de otimização
 /** We ask for the execution of the
                default OPL run configuration. */ Job oplJob = appId.submit("Basic Configuration");
                /** We will wait for the solve to be done. * A better way would be to use a thread,
                but we are only demonstrating the * concepts here. **/ int nbRetry = 0; // With the
                Job object, can get more detail and execute action such as abort. while
                (Job.Status.PROCESSED != oplJob.getStatus() && nbRetry < 5) { try {
                Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch
                block e.printStackTrace(); } nbRetry += 1; }

O modelo OPL possui variáveis de decisão (dvar), como na a Listagem 3. É necessário obter o valor dessas dvars após a conclusão da otimização.

Listagem 3. As variáveis de decisão OPL
 dvar int NurseAssignments[Nurses][Shifts] in
                0..1; dvar float+ NurseWorkTime[Nurses]; dvar float+ NurseAvgHours; dvar float+
                NurseMoreThanAvgHours[Nurses]; dvar float+ NurseLessThanAvgHours[Nurses]; dvar
                float+ Fairness; dvar int CostByDepartments[Departments]; dvar int
                AllocationByDepartments[Departments];

4 mostra como recuperar o resultado da otimização.

Listagem 4. Recuperar os dados de solução da otimização
 /** Get the result and
                solution after solve job completed */ Result res = oplJob.getResult(); Solution
                solution = res.getSolution(); //Solution status: we only deal with relaxed,
                feasible, and best solution. System.out.println("Solution type is
                :"+solution.getType()); /** Objective */ try { System.out.println("The objective is
                " + solution.getObjValue()); } catch (ObjectiveValueNotAvailableException e) {
                System.out.println("Objective Value not available!"); } /** dvar int and dvar float
                will also be integer and double elements. */ double dvar1 =
                solution.getElement("NurseAvgHours").asNum(); double dvar2 =
                solution.getElement("Fairness").asNum(); /** Set of strings: you iterate and get
                strings */ Set deps = solution.getElement("Departments").asSet();
                System.out.println("Departments is composed of "); /** Iterate on this set the Java
                way */ Iterator<Element> nurseItr = deps.iterator(); while
                (nurseItr.hasNext()) { String elt = nurseItr.next().asString(); System.out.print(elt
                + " "); } /** Query Preprocessing objects: you can query the OPL sets, OPL arrays.
                */ Map nurseAssignments = solution.getElement("NurseAssignments").asMap();
                System.out.println("dvar NurseAssignments is composed of : "); /** Iterate on this
                set the Java way */ Iterator<Element> itr = nurseAssignments.iterator(); while
                (itr.hasNext()) { Map nas2 = itr.next().asMap(); Iterator<Element> itr2 =
                nas2.iterator(); while(itr2.hasNext()){ int elt = itr2.next().asInt();
                System.out.print(elt + " "); } System.out.println(); }

Após executar essa classe, você deve obter o resultado mostrado na A Listagem 5 em seu console.

Listagem 5. Saída de console
 Solution type is : RELAXED_SOLUTION Objective Value not
                available! dvar NurseAvgHours is : 35.438 dvar Fairness is : 35.438 Departments is
                composed of : Emergency Consultation dvar NurseAssignments is composed of : 1 1 1 1
                0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
                0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 1 … 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0
                0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0

Para obter informações detalhadas sobre a API do cliente, consulte a documentação Java em <Install Dir>/CPLEX_Server/client/doc/en-US/html/index.html. Também há dois exemplos no com.ibm.ilog.optim.server.client.OplCplexServer e com.ibm.ilog.optim.server.client.OplCPServer.

ODM Enterprise Dashboard

O CPLEX Enterprise Server possui um console da web para visualizar ou desimplementar seus aplicativos implementados e para visualizar ou parar tarefas de solução. É possível acessar o console em um navegador da web em uma URL semelhante para o http://localhost:8080/odme/console. Para especificar o aplicativo de tipo ODM Enterprise, verifique se a coluna Type contém OPL (indicando que ela é um aplicativo CPLEX Server). A Figura 6 mostra um exemplo. É possível, então, obter os detalhes da tarefa de otimização, como status, tempo iniciado, duração e assim por diante.

Figura 6. Console da web
Console da web
Console da web

Conclusão

Com o CPLEX Enterprise Server, é possível operar seus aplicativos em modo cliente/servidor com o CPLEX sendo executado no servidor e interagir com o cliente que inicia a otimização. O IBM ILOG CPLEX Enterprise Server apresenta uma arquitetura de referência de aplicativos flexível e simplificada para soluções de otimização de segmentos de mercado.

Consulte Temas relacionados para saber mais sobre o CPLEX Enterprise Server. Para obter mais detalhes sobre esse ambiente de execução escalável baseado em servidor para a implementação de aplicativos OPL que irão solucionar o modelo, armazene todos os objetos do modelo e permita que você os consulte em um cliente local devido a uma API do cliente Java.


Recursos para download


Temas relacionados


Comentários

Acesse ou registre-se para adicionar e acompanhar os comentários.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Segmentos de mercado, WebSphere
ArticleID=833540
ArticleTitle=Introdução ao IBM ILOG CPLEX Enterprise Server
publish-date=08312012