Otimização em Sistemas de Energia Elétrica

Universidade Federal do Espírito Santo

Departamento de Engenharia Elétrica

Prof. Augusto César Rueda Medina / CT-XI, Sala 27 / augusto.rueda@ufes.br
Logo Logo

Unidade 4

4.4. GAMS

General Algebraic Modeling System

Introdução

  • GAMS é uma linguagem de modelagem de alto nível, que permite escrever um problema matemático em linguagem simples, além de interagir com vários programas especializados para sua resolução.

  • A vantagem deste programa é que, independentemente da natureza do problema, seja linear, não linear, inteiro, contínuo, misto, entre outros, é utilizada a mesma sintaxe de modelamento ou implementação, diminuindo a necessidade de dominar vários programas para diferentes propósitos.

  • GAMS tem diferentes versões (estudante, profissional, estação de trabalho, etc.) que diferem basicamente nas possibilidades de resolver problemas de tamanhos diferentes. Por exemplo, na versão básica do aluno, há uma série de limitações em termos do tamanho do problema, que admite um máximo de 1000 variáveis diferentes de zero em problemas lineares e não-lineares, e de 20 variáveis inteiras.

Introdução

  • GAMS funciona como uma interface: o modelo e a entrada são colocados de forma que podem ser lidos por um pacote de otimização ou solver.

  • O solver procura a solução ótima do problema lendo a informação fornecida por GAMS e aplicando um algoritmo apropriado.

Alguns Solvers

  • CPLEX: O solver IBM ILOG CPLEX resolve problemas de programação inteiros, problemas de PL de grande porte usando variantes do método SIMPLEX ou o Método do Pontos Interiores, problemas de Progração Quadrática Convexa e Não-convexa e problemas Convexos com Restrições Quadráticas.

  • MINOS: MINOS é um solver para resolver problemas de otimização em larga escala (lineares e não-lineares). É especialmente eficaz para programas lineares e para problemas com função objetivo não-linear e restrições lineares.

Alguns Solvers

  • SNOPT: O SNOPT é usado para a solução de problemas de otimização de grande porte restritos não-linearmente. O SNOPT implementa um Algoritmo de Programação Sequencial que usa uma função Lagrangeana aumentada.

  • KNITRO: KNITRO é usado para resolver problemas de otimização não-convexos, restritos não-linearmente. Também pode ser usado para resolver problemas mais simples, como problemas sem restrições, problemas restritos limitados, problemas de PL e problemas de Programação Quadrática.

Estrutura de Implementação

  • Para resolver um problema com o GAMS, é necessário gerar um arquivo, de extensão GMS, que deve conter todos os dados, instruções básicas e o modelo a ser resolvido. Depois que o arquivo é gerado, GAMS é executado e o resultado é gerado automaticamente em um arquivo de estensão LST.

  • Com o GAMS também pode ser usado um arquivo externo que contenha todas as instruções e dados necessários para resolver o problema através da leitura de arquivos tipo texto ou de Excel, por exemplo.

Estrutura de Implementação

  • No GAMS, um problema matemático é definido de forma algébrica, usando notação vetorial, que permite escrever facilmente operações repetitivas sem a necessidade de ciclos; para isso, é necessário definir primeiro a natureza dos vetores, que tipo de elementos eles contêm e como devem ser tratados.

  • Componentes básicos de um modelo de GAMS:

    Entradas Saídas
    Conjuntos:
    sets
    Impressão da cópia do código gerado
    Dados:
    
                                        parameters
                                        tables
                                        scalars
    Mapas de referência

Estrutura de Implementação

  • Componentes básicos de um modelo de GAMS:

    Entradas Saídas
    Atribuição de limites ou valores iniciais (opcional) Lista de equações
    Equações Relatórios de estados
    Modelo Resultados

Estrutura de Implementação

  • Um modelo GAMS é um conjunto de sentenças na linguagem GAMS. A única regra que governa a ordem das sentenças é que uma entrada do modelo não pode ser referenciada antes de ser declarada como existente.

  • As sentenças do GAMS podem ser escritas tipograficamente em quase qualquer estilo, de acordo com o usuário. Várias linhas por instrução, linhas em branco inseridas e múltiplas sentenças por linha são permitidas.

  • Cada sentença deve terminar com um ponto e vírgula. GAMS não faz distinção entre maiúsculas e minúsculas.

  • Qualquer linha que comece com um asterisco não é atendida pelo GAMS, ou seja, é interpretada como uma linha de comentário.

  • Qualquer linha que comece com um asterisco não é atendida pelo GAMS, ou seja, é interpretada como uma linha de comentário.

Estrutura de Implementação

  • A criação de componentes do GAMS envolve duas etapas: uma declaração e uma atribuição ou definição. A declaração é para definir a existência de algo e dar-lhe um nome. A atribuição ou definição é dar a algo declarado valores ou forma específica. No caso de equações, a declaração e definição devem ser feitas em sentenças separadas. Para todas as outras entradas, é possível fazer as declarações e atribuições na mesma sentença ou separadamente.

  • Os nomes das entradas do modelo devem começar com uma letra e podem ser seguidos por mais letras ou dígitos.

Componentes de um Modelo - Conjuntos $\rightarrow$ sets

  • Os sets são o bloco básico de construção do GAMS e correspondem exatamente aos índices nas representações algébricas do modelo. Exemplo:

    
    sets
        i   nos         / no1,no2 /
        j   ramos       / ramo1,ramo2,ramo3 / ;
                                
                            

    o que define os seguintes conjuntos:

    • $i = {no1,no2}$

    • $j = {ramo1,ramo2,ramo3}$

  • Note-se que, tipograficamente, no formato GAMS as chaves "{ }" são trocadas por barras "/ /" para delimitar o conjunto.

Componentes de um Modelo - Parâmetros $\rightarrow$ parameters

  • Esse formato é ilustrado, no exemplo a seguir, pelas instruções de atribuição de parâmetros:

    
    parameters
            g(i)        Geraca máxima nos nos
            / no1               0.8
              no2               0.0
              no3               0.0 /
            d(i)        Demanda nos nos
            / no1               0.0
              no2               0.6
              no3               0.2 /;
                                
                            

Componentes de um Modelo - Parâmetros $\rightarrow$ parameters

  • Também é aceitável separar a sentença anterior em dois:

    
    parameters
            g(i)        Geraca máxima nos nos
            / no1               0.8
              no2               0.0
              no3               0.0 /;
    parameters
            d(i)        Demanda nos nos
            / no1               0.0
              no2               0.6
              no3               0.2 /;
                                
                            

Componentes de um Modelo - Tabelas $\rightarrow$ tables

  • É muito útil usar o formato de tabela para entrada de dados em um modelo relativamente grande. Exemplo:

    
    table S(k,m)    Matriz de Incidencia
                    linha12     linha13     linha23
        no1           -1          -1           0
        no2            1           0          -1
        no3                        1           1;
                                
                            

    O efeito dessa declaração é definir o parâmetro $\small S$ e especificar seu domínio como o conjunto de pares ordenados entre $\small k$ e $\small m$. Os valores de $\small S$ também são dados nesta sentença no formato apropriado. Se houver entradas em branco na tabela, elas serão interpretadas como zero.

Componentes de um Modelo - Variáveis $\rightarrow$ variables

  • As variáveis de decisão de um modelo GAMS devem ser declaradas com uma instrução variables. Cada variável recebe um nome, um domínio e um texto (opcional).

  • Uma diferença importante entre a declaração de variáveis e parâmetros é que os valores não podem ser inicializados em uma declaração de variáveis.

Componentes de um Modelo - Variáveis $\rightarrow$ variables

  • Uma instrução típica de variáveis é:

    
    variables
            Nolinhas(j)         Numero de linhas a adicionar por ramo
            Gerador(i)          Geracao em cada no
            Fluxos(j)           Fluxo pelo ramo j
            v                   Custo de investimento ;
                                
                            

    A declaração de Nolinhas, Gerador e Fluxos implica que as referências dos mesmos são restritas aos domínios dos conjuntos $\small j$, $\small i$ e $\small j$, respectivamente, enquanto $\small v$ não possui uma verificação de domínio, uma vez que é uma variável escalar.

Componentes de um Modelo - Equações $\rightarrow$ equations

  • As equações podem ser declaradas e definidas em sentenças separadas. Inicialmente, escreve-se a palavra-chave equatuib seguida do nome, domínio e texto de um ou mais grupos e equações ou inequações. Exemplo:

    
    equations
        custo           Funcao Objetivo
        Lei1(i)         Cumpre la 1ra Lei de Kirchhoff para cada barra
        fmax1(j)        Restricao de fluxo maximo polas linhas
        maxgen(i)       Maxima geracao nas barras;
                            
                            

    Note-se que a palavra equation tem um significado amplo no GAMS. Ele engloba as expressões de igualdade e desigualdade. Com um nome simples pode se referir a um ou mais dessas expressões. Por exemplo: custo não tem domínio, então é uma equação simples, mas o restante se refere a um conjunto de equações definidas no domínio $\small i$ ou $\small j$.

Componentes de um Modelo - Soma e Produto $\rightarrow$ sum e prod

  • A notação de soma pode ser usada para expressões simples ou complexas. O formato é baseado na ideia de que a soma é sempre considerada como um operador com dois argumentos. Exemplos:

    
    sum(j, x(i,j));
                            
                            

    equivalente a $\small \sum\limits_j {{x_{ij}}}$.

    
    sum((i,j), c(i,j)*x(i,j));
                            
                            

    equivalente a $\small \sum\limits_i {\sum\limits_j {{c_{ij}}{x_{ij}}} } $.

Componentes de um Modelo - Soma e Produto $\rightarrow$ sum e prod

  • O produto em GAMS usa exatamente o mesmo formato da soma, substituindo sum por prod. Exemplo:

    
    prod(j, x(i, j));
                            
                            

    equivalente a $\small \prod\limits_i {{x_{ij}}} $.

Definição de Equações

  • Em termos de sua variedade, a definição de equações é a sentença mais complexa no GAMS. Os componentes na definição de equações são, na sua ordem:

    • O nome da equação que está sendo definida.

    • O domínio.

    • O símbolo '. '

    • Expressão do lado esquerdo.

    • Operador relacional.

    • Expressão no lado direito.

Definição de Equações

  • Operadores relacionais:

    Tipo de equação Descrição
    =e=
    Igualdade
    =g=
    Maior ou igual que
    =l=
    Menor ou igual que

    Exemplo:

    
                                demanda(j) .. sum(i, x(i,j)) =g= b(j);
                                

Modelo e Sentenças de Solução

  • A palavra model tem um significado muito preciso em GAMS. É simplesmente uma coleção de equações. O formato da sua declaração é a palavra model seguida do nome do modelo e uma lista de nomes de equações entre barras "/ /". Se todas as equações previamente definidas tiverem que ser incluídas, pode-se inserir /all/ no lugar da lista explícita de expressões que formam o modelo. Exemplo:

    
                                model   transporte   /all/;
                                

    Ou então usar uma lista explícita. Exemplo:

    
                                model   transporte   /custo, geracao, demanda/
                                

Modelo e Sentenças de Solução

  • Uma vez que um modelo tenha sido declarado e as expressões atribuídas a ele, pode ser chamado o solver. Isso é feito com uma sentença de solução.

  • É importante lembrar que GAMS não resolve o problema, mas o transmite para um dos solvers especificados. Exemplo:

    
                                solve transporte using lp minimizing z;
                                

GAMS - Solução de um Problema Restrito - Exemplo 4.3.1

Resolver o seguinte problema usando GAMS:

$ \textrm{Min} \ f \left({ X }\right) = 3x_1 + 2x_2 + x_3\\ \textrm{Sujeito} \ \textrm{a:} \\ \ \ \ \ x_1 + x_2 + x_3 \leq 10 \\ \ \ \ \ x_1 - x_2 + 2x_3 \leq 3 \\ \ \ \ \ 2x_1 + x_2 + x_3 \leq 5 $


Down arrow

$ \textrm{Min} \ f \left({ X }\right) = 3x_1 + 2x_2 + x_3\\ \textrm{Sujeito} \ \textrm{a:} \\ \ \ \ \ x_1 + x_2 + x_3 \leq 10 \\ \ \ \ \ x_1 - x_2 + 2x_3 \leq 3 \\ \ \ \ \ 2x_1 + x_2 + x_3 \leq 5 $

Arquivo LP.gms:


sets i index 1 /1*3/
    j index 2 /1*3/;

parameter b(j) Valores das restricoes
    / 1 10
      2 3
      3 5 /;

                            
                        

$ \textrm{Min} \ f \left({ X }\right) = 3x_1 + 2x_2 + x_3\\ \textrm{Sujeito} \ \textrm{a:} \\ \ \ \ \ x_1 + x_2 + x_3 \leq 10 \\ \ \ \ \ x_1 - x_2 + 2x_3 \leq 3 \\ \ \ \ \ 2x_1 + x_2 + x_3 \leq 5 $

Arquivo LP.gms (continuação):


table A(j,i) Tabela dos coeficientes de A
      1  2  3
    1 1  1  1
    2 1 -1  2
    3 2  3  1;
    
parameter c(i) Coeficientes de custo
    / 1 3
      2 2
      3 0.5 /;
                            
                        

$ \textrm{Min} \ f \left({ X }\right) = 3x_1 + 2x_2 + x_3\\ \textrm{Sujeito} \ \textrm{a:} \\ \ \ \ \ x_1 + x_2 + x_3 \leq 10 \\ \ \ \ \ x_1 - x_2 + 2x_3 \leq 3 \\ \ \ \ \ 2x_1 + x_2 + x_3 \leq 5 $

Arquivo LP.gms (continuação):


variables
    z 
    x(i) ;

equations
    obj Funcao objetivo
    res(j) Restricoes;
                            
                        

$ \textrm{Min} \ f \left({ X }\right) = 3x_1 + 2x_2 + x_3\\ \textrm{Sujeito} \ \textrm{a:} \\ \ \ \ \ x_1 + x_2 + x_3 \leq 10 \\ \ \ \ \ x_1 - x_2 + 2x_3 \leq 3 \\ \ \ \ \ 2x_1 + x_2 + x_3 \leq 5 $

Arquivo LP.gms (continuação):


obj .. z =E= sum(i, c(i)*x(i));

res(j).. sum(i, A(j,i)*x(i)) =L= b(j);

model ProgLin /all/;

x.lo('1')=0; x.lo('2')=0;  x.lo('3')=0;

solve ProgLin using LP maximizing z;
                            
                        

Resultados fornecidos pelo GAMS (resumo):


 EXIT - Optimal Solution found, objective:        7.500000

 Major, Minor Iterations     1       1
 Funobj, Funcon calls        0       0
 Superbasics                 0
 Aggregations                0
 Interpreter Usage        0.00     0.0%


                       LOWER     LEVEL     UPPER    MARGINAL

---- EQU obj             .         .         .        1.000

  obj  Funcao objetivo

---- EQU res  Restricoes

     LOWER     LEVEL     UPPER    MARGINAL

1     -INF      2.500    10.000      .
2     -INF      2.500     3.000      .
3     -INF      5.000     5.000     1.500

                       LOWER     LEVEL     UPPER    MARGINAL

---- VAR z              -INF      7.500     +INF       .

---- VAR x

     LOWER     LEVEL     UPPER    MARGINAL

1      .        2.500     +INF       .
2      .         .        +INF     -2.500
3      .         .        +INF     -1.000
                            
                        


Up arrow

Otimização em Sistemas de Energia Elétrica

Universidade Federal do Espírito Santo

Departamento de Engenharia Elétrica

Prof. Augusto César Rueda Medina / CT-XI, Sala 27 / augusto.rueda@ufes.br
Logo Logo