e python linguagem de programa˘c~ao 475/2016-i/textos... · softwares comerciais como maple,...

49
MAT 475 – T´opicos em Matem´ atica Aplicada (Lana Mara R. dos Santos, [email protected]) Aula 11a15: SageMath e Python Linguagem de Programa¸c˜ ao Computadores e outros dispositivos eletrˆ onicos program´ aveis executaminstru¸c˜ oes ativando (ou desativando) determinadas partes em seus componentes. As instru¸ oes s˜ ao comunidadas ao dispositivo por uma sequˆ encia de zeros e uns (c´ odigo bin´ ario). Uma linguagem de programa¸c˜ ao ´ e uma ponte entre a linguagem humana e a de m´ aquina, mesclando conceitos de ambas. As linguagens de programa¸c˜ ao s˜ ao classificadas em v´ arios n´ ıveis de acordo com sua proximidade com a linguagem humana. Linguagens de baixo n´ ıvel s˜ ao mais pr´ oximas da linguagem da aquina enquanto as de alto n´ ıvel se aproximam da linguagem natural humana.

Upload: others

Post on 14-Feb-2021

4 views

Category:

Documents


0 download

TRANSCRIPT

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Linguagem de Programação

    Computadores e outros dispositivos eletrônicos programáveis

    executam instruções ativando (ou desativando) determinadas partes

    em seus componentes. As instruções são comunidadas ao dispositivo

    por uma sequência de zeros e uns (código binário).

    Uma linguagem de programação é uma ponte entre a linguagem

    humana e a de máquina, mesclando conceitos de ambas.

    As linguagens de programação são classificadas em vários ńıveis de

    acordo com sua proximidade com a linguagem humana.

    Linguagens de baixo ńıvel são mais próximas da linguagem da

    máquina enquanto as de alto ńıvel se aproximam da linguagem

    natural humana.

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python

    Uma linguagem de programação pode ser compilada (traduzida para

    uma linguagem de máquina) ou interpretada.

    Uma linguagem interpretada não precisa ser compilada. Ela é lida

    por um programa que faz a tradução para a linguagem de máquina.

    Python é uma linguagem de alt́ıssimo ńıvel (VHLL – very high level

    language), interpretada, de código fonte aberto e dispońıvel para

    vários sistemas operacionais.

    O interpretador do Python já vem instalado no Linux. Para

    windows ele está dispońıvel para download em

    http://www.python.org

    O SageMath é implementado principalmente em Python .

    http://www.python.org

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python

    Python é uma linguagem dinamicamente tipada. Isto quer dizer que

    não é preciso declarar as variáveis ou ou tipo delas. A forma como a

    variável é usada no código identifica como ela será armazenada.

    A = 3 É identificada como inteira (tipo int)

    A = 3.0 É identificada como inteira (tipo float)

    A = "três" É identificada como string

    type(A) Para saber o tipo definido para a variável

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python. comentário

    Tudo que estiver após o śımbolo # em uma linha de comando do

    Python é assumido como comentário.

    Para comentar um bloco de comandos, coloque-o entre três aspas

    simples.

    #Comentários em python

    a=2 # a recebe 2

    b=5

    ’’’inı́cio bloco de comentários

    a=3

    a=33

    b=24

    c=15

    fim do bloco de comentários’’’

    a+b

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python

    Operações aritméticas:

    8+3 adição

    8*3 multiplicação

    8/3 divisão de inteiros

    8./3 divisão de reais

    8**3 potenciação

    8**(1/3) radiciação

    8%3 resto de divisão

    3*("na"+"da") 3 x a concatenação de ’na’ com ’da’

    Operações booleanas:

    a==b verifica se são iquais

    a!=b ou ab verifica se são diferentes

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python. Listas

    Uma lista é uma sequência de variáveis delimitada por colchetes. Pode

    conter tipos diferentes e pode ser alterada (pois é mutável).

    list=[4,"nada", 3.0] define a lista list com 3 elementos.

    list[0] exibe o primeiro elemento da lista.

    list[-2] exibe o penúltimo elemento da lista.

    len(list) informa o tamanho da lista.

    list+[3,5] concatena list com a lista [3,5].

    list[1]=7 insere o valor 7 na posição 1 da lista.

    del list[1] remove o elemento da posição 2 de list.

    list.index(4) indica a posição que o valor ”4”está na lista.

    Se tiver mais de uma posição com mesmo valor,

    indica a primeira ocorrência.

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python. Listas: pseudo-matriz

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python. Tupla

    Uma tupla é uma sequência de variáveis delimitada por parênteses.

    Assim como em uma lista, pode conter tipos diferentes. No entanto,

    uma tupla não pode ser alterada depois de criada (pois é imutável).

    Os comandos de acesso e manipulação de tuplas são analógas aos

    usados para listas.

    tup=(4,"nada", 3.0) define a tupla tup com 3 elementos.

    tup[1] acessa o segundo elemento da tupla tup.

    matriz=((1,2),(3,4)) cria uma pseudo-matriz 2x2

    matriz[0][1] exibe o elemento da posição 1x2 de matriz

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python. set

    Conjuntos são definidos com a sintaxe set([elementos]).

    X = set([1,19,’a’])

    Y = set([1,1,1, 2/3])

    Z=X.intersection(Y)

    print ’X =’,X

    print ’Y =’,Y

    print Z

    print X == set([’a’, 1, 1, 19])

    print ’a’ in X

    print ’a’ in Y

    Resultado:

    X = set([’a’, 1, 19])

    Y = set([1, 2/3])

    set([1])

    True

    True

    False

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python. Set

    SageMath tem sua própria função conjunto (Set) que além de incorporar

    as propriedades da Teoria de conjuntos, tem algumas funções adicionais.

    X =set([1,19,’a’])

    Y = Set([1,1,1, 2/3])

    print ’X =’,X

    print ’Y =’,Y

    print latex(X)

    print latex(Y)

    Resultado:

    X = set([’a’, 1, 19])

    Y = {1, 2/3}

    \text{\texttt{set([’a’,{ }1,{ }19])}}

    \left\{1, \frac{2}{3}\right\}

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python. Range

    A função range(a, b) gera uma lista de uma sequência de números

    inteiros no intervalo [a,b)

    range(2,7) lista com os inteiros de 2 a 6.

    range(7) lista com os inteiros de 0 a 6.

    range(1,17,4) lista com os inteiros de 1 a 16, com razão 4.

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python. For

    Na maioria das linguagens de programação, o comando for realiza

    uma iteração percorrendo uma sequência de números inteiros de

    uma progressão aritmética.

    Em Python a iteração é feita percorrendo os itens de uma sequência

    que pode ser de diversos tipos (lista, string etc.). Por exemplo:. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    for i in range(1,4):

    print i,

    print ""

    for i in range(3)+range(5,7):

    print i,

    print "\n"

    lista=[’fada’,’casa’,’nada’]

    for i in lista: print i

    Resultado:

    1 2 3

    0 1 2 5 6

    fada

    casa

    nada

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python

    Não é necessário utilizar { } para delimitar um bloco de comandosou end para finalizar uma estrutura.

    Não existe um delimitador espećıfico para blocos de código. A

    delimitação é feita pela indentação ( tecla tab ou 4 espaços).. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    for i in range(1,3):

    print i

    print "f_",i

    print "g_",i

    Resultado:

    1

    f_ 1

    2

    f_ 2

    g_ 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Observe que a linha de comando {print "g_",i} está alinhado com ocomando for (e, portanto, o valor de i neste caso não é iterado

    percorrendo a sequência de inteiros em range(1,3)). Como o último

    valor para i é 2, foi impresso g_2.

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python. Exemplo:

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    matriz = ((1,0,0),(0,1,0),(0,0,1))

    for i in range(len(matriz)):

    for j in range(len(matriz)):

    print matriz[i][j],

    print ""

    Resultado:

    1 0 0

    0 1 0

    0 0 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python

    Exemplos de formatação de strings:

    a,b,c=3.1415,5,’número’ atribui, respectivamente, valores para

    as variáveis a,b e c.

    print "a=%f" %a imprime: a={valor da float(f) a}print "b=%d" %b imprime: b={valor do inteiro(d) b}print "c=%s" %s imprime: c={valor da string(s) c}print ’%f é %s’ %(a,c) imprime: 3.1416 é um número

    print ’%.2f’ %a imprime o float com 2 casas decimais

    print ’%6.2f’ %a imprime usando 6 espaços no total

    (insere espaço em branco se preciso).

    \n pula uma linha

    \t acrescenta espaço de tabulação

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python. if–elif–else

    A estrutura geral de uma condicional if tem a seguinte sintaxe:

    if condiç~ao:

    # comandos

    ...

    elif condiç~ao:

    # comandos

    ...

    else:

    # comandos

    ...

    #Exemplo

    var = [-2, 4, 5, 6, 0, -3, 4, 8, 3]

    for i in var:

    if i < 0:

    print "Valor negativo: %d" % i

    elif i == 0:

    print "zero na posiç~ao", var.index(0)

    else:

    print "Valor positivo: %d" % i

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python. Módulo:

    Existem módulos que podem ser inseridos no código.

    Para importar um módulo basta colocar no ińıcio do código:

    import nome_do_módulo

    Exemplos:

    import datetime # para marcar tempo

    import random # para gerar números aleatórios

    Para conhecer as funções de um módulo basta digitar:

    help(nome_do_modulo).

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Python. Exemplo

    Procedimento para gerar uma pseudo-matriz (lista de listas) aleatória:

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    import random

    def cria_matriz(lin,col):

    A=[]

    for i in range(lin):

    linha=[]

    for j in range(col):

    linha = linha + [random.randint(1,10)]

    A= A + [linha]

    return A

    cria_matriz(2,3). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    SageMath

    O SageMath é um software livre e de código aberto de matemática

    que engloba softwares de várias áreas, tais como, álgebra, geometria,

    teoria dos números, análise numérica, criptografia, computação

    simbólica e numérica.

    Criado em 2005 com o objetivo de ser uma alternativa gratuita a

    softwares comerciais como Maple, Mathematica e matlab.

    O SageMath utiliza a linguagem de programação Python . No

    entanto, não é preciso saber Python para usar a maioria dos

    recursos do programa.

    O conhecimento necessário de Python para resolver um PPL ou

    PPLI no SageMath é proporcional à complexidade do problema.

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Como usar o SageMath

    Endereço: http://www.sagemath.org

    Para usar o SageMath é preciso um navegador de internet como

    ambiente de trabalho.

    Para usar no windows é preciso instalar uma máquina virtual.

    Online:

    https://cloud.sagemath.com

    http://sagecell.sagemath.org

    http://www.sagemath.orghttps://cloud.sagemath.comhttp://sagecell.sagemath.org

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Como usar o SageMath

    http://sagecell.sagemath.org

    http://sagecell.sagemath.org

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Como usar o SageMath

    http://sagecell.sagemath.org

    http://sagecell.sagemath.org

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear no SageMath

    Suponha que se queira resolver o seguinte PPL:

    max x1 + 4x2 + 3x3

    s.a. x1 + 2x2 ≤ 55x1 + 5x3 ≤ 8x1, x2, x3 ≥ 0

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear no SageMath

    Suponha que se queira resolver o seguinte PPL:

    max x1 + 4x2 + 3x3

    s.a. x1 + 2x2 ≤ 55x1 + 5x3 ≤ 8x1, x2, x3 ≥ 0

    Crie um MixedIntegerLinearProgram

    (por padrão, o problema é de maximização)

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear no SageMath

    Suponha que se queira resolver o seguinte PPL:

    max x1 + 4x2 + 3x3

    s.a. x1 + 2x2 ≤ 55x1 + 5x3 ≤ 8x1, x2, x3 ≥ 0

    crie um vetor de variáveis x:

    (não é preciso definir o tamanho do vetor)

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear no SageMath

    Suponha que se queira resolver o seguinte PPL:

    max x1 + 4x2 + 3x3

    s.a. x1 + 2x2 ≤ 55x1 + 5x3 ≤ 8x1, x2, x3 ≥ 0

    adicione a função objetivo do PPL:

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear no SageMath

    Suponha que se queira resolver o seguinte PPL:

    max x1 + 4x2 + 3x3

    s.a. x1 + 2x2 ≤ 55x1 + 5x3 ≤ 8x1, x2, x3 ≥ 0

    adicione as restrições do PPL:

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear no SageMath

    Suponha que se queira resolver o seguinte PPL:

    max x1 + 4x2 + 3x3

    s.a. x1 + 2x2 ≤ 55x1 + 5x3 ≤ 8x1, x2, x3 ≥ 0

    resolva o PPL:

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear no SageMath

    Suponha que se queira resolver o seguinte PPL:

    max x1 + 4x2 + 3x3

    s.a. x1 + 2x2 ≤ 55x1 + 5x3 ≤ 8x1, x2, x3 ≥ 0

    z = 14.8

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear no SageMath

    Suponha que se queira resolver o seguinte PPL:

    max x1 + 4x2 + 3x3

    s.a. x1 + 2x2 ≤ 55x1 + 5x3 ≤ 8x1, x2, x3 ≥ 0

    z = 14.8

    x1 = 0.0

    x2 = 2.5

    x3 = 1.6

    Exibir solução:

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear no SageMath

    Suponha que se queira resolver o seguinte PPL:

    max x1 + 4x2 + 3x3

    s.a. x1 + 2x2 ≤ 55x1 + 5x3 ≤ 8x1, x2, x3 ≥ 0

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear inteira (mista) no SageMath

    Suponha que se queira resolver o seguinte PI:

    max x1 + 4x2 + 3x3

    s.a. x1 + 2x2 ≤ 55x1 + 5x3 ≤ 8x1, x2, x3 ∈ Z+

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear inteira (mista) no SageMath

    Suponha que se queira resolver o seguinte PI:

    max x1 + 4x2 + 3x3

    s.a. x1 + 2x2 ≤ 55x1 + 5x3 ≤ 8x1, x2, x3 ∈ Z+

    z = 11

    x1 = 0

    x2 = 2

    x3 = 1

    O que muda é a declaração das variáveis x.

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear inteira (mista) no SageMath

    Suponha que se queira resolver o seguinte PB:

    max x1 + 4x2 + 3x3

    s.a. x1 + 2x2 ≤ 55x1 + 5x3 ≤ 8x1, x2, x3 ∈ N

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear inteira (mista) no SageMath

    Suponha que se queira resolver o seguinte PB:

    max x1 + 4x2 + 3x3

    s.a. x1 + 2x2 ≤ 55x1 + 5x3 ≤ 8x1, x2, x3 ∈ N

    z = 7

    x1 = 0

    x2 = 1

    x3 = 1

    O que muda é a declaração das variáveis x.

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear (inteira mista) no SageMath

    Escrevendo o problema na forma matricial

    max x1 + 4x2 + 3x3

    s.a. x1 + 2x2 ≤ 55x1 + 5x3 ≤ 8x1, x2, x3 ≥ 0

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear (inteira mista) no SageMath

    Escrevendo um PPL de minimização na forma matricial

    min 2x1 + 4x2 + 3x3

    s.a.

    x1 + 2x2 ≥ 55x1 + x2 + 3x3 ≥ 8x1 + 3x2 ≥ 3x1, x2, x3 ≥ 0

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear inteira (mista) no SageMath. Alguns comandos úteis

    O conjunto solução pode ser salvo em um vetor:

    x_sol=p.get_values(x)

    Especificar o número de casas decimais:

    round(p.solve(),2)

    round(p.get_values(x),2)

    Selecionar o solver para resolver o MIP:

    MixedIntegerLinearProgram(solver=’nomesolver’)

    Exemplos de solver: GLPK, Coin, CPLEX, Gurobi

    (Alguns comandos são espećıficos do solver)

    MixedIntegerLinearProgram(solver=’GLPK’)

    Para resolver um MIP de minimização:

    MixedIntegerLinearProgram(maximization=False)

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear inteira (mista) no SageMath. Alguns comandos úteis

    Seja o MIP:

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    p = MixedIntegerLinearProgram()

    v = p.new_variable(nonnegative=True). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    p.get_min(v) retorna o valor ḿınimo das variáveis do vetor v

    p.get_min(v[1]) retorna o valor ḿınimo da variável v[1]

    p.set_min(v[1],None) permite v[1] assumir qq valor real negativo

    p.set_max(v[1],6) fixa o valor 6 como limitante superior para v[1]

    p.set_binary(v[3]) fixe v[3] como binária

    (p.polyhedron()).show() para exibir o poliedro(até 3D naturalmente)

    dir(p) Construtor de uma determinada função.

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear inteira (mista) no SageMath

    Dado o MIP:. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .p = MixedIntegerLinearProgram()

    v = p.new_variable(nonnegative=True). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Inserir a restrição:∑5

    i=0 vi ≤ 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .soma = p.sum(v[i] for i in xrange(5))

    p.add_constraint(soma, max=4). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Inserir restrição:∑3

    i=1 vi = 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .soma = p.sum(v[i] for i in xrange(1,4))

    p.add_constraint(soma, min=3,max=3). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Informações sobre as restrições:. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .p.constraints() # lista de restriç~oes

    p.constraints(0) # primeira restriç~ao

    p.number_of_constraints() # número de restriç~oes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear inteira (mista) no SageMath. Exemplo:

    min x1 + 2x2 + 3x3 + 4x4

    s.a.

    x1 + x2 + x3 + x4 ≥ 10x3 + x4 = 4

    xi ∈ {1, 2, 3, 4},i = 1, . . . , 4.

    Defina um vetor a com os coeficientes da

    função objetivo. Seja n o número de

    coordenadas de a.

    Defina p um PPI e x um vetor de variáveis

    inteiras.

    Faça soma=∑n

    i=1 aixi e insira a restrição

    soma≥ 10.

    Faça soma=∑n−1

    i=2 xi e insira a restrição

    soma= 4.

    Para todo i, fixe o limitante superior

    (upper bound) da variável xi em 3.

    Seja x̂i, i = 1, ..., n, o conjunto solução do

    PPI. Imprima [x̂i, i = 1, ..., n].

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear inteira (mista) no SageMath. Exemplo:

    min x1 + 2x2 + 3x3 + 4x4

    s.a.

    x1 + x2 + x3 + x4 ≥ 10x3 + x4 = 4

    xi ∈ {1, 2, 3, 4},i = 1, . . . , 4.

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear inteira (mista) no SageMathExemplo:

    Defina os seguintes elementos:

    a = [1, 2,−3, 4], b = ((1, 2, 3, 0), (4, 3, 0, 6)), c = (10, 4).

    Defina um PI de minimização e um vetor de variáveis inteiras w.

    Defina a função objetivo∑n

    i=1 aiwi, em que n = |a|.Defina as restrições:∑n

    i=1 b1iwi = c1∑ni=1 b2iwi ≤ c2

    Resolva o PPI

    Imprima o valor ótimo e os valores das variáveis não nulas.

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear inteira (mista) no SageMath

    Escrevendo um PLI de forma mais genérica:

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear inteira (mista) no SageMath

    Problema (tutoria): Considere 5 turmas de 3 disciplinas (MAT0, MAT1 e

    MAT2) distribúıdas em um dos posśıveis 5 horários (0-4). Um conjunto de 3

    tutores (João, Maria, José) com os seguintes horários livres e disciplinas que

    podem ministrar. As tabelas exibem os dados dos tutores (horários livres e

    disciplinas que podem ministrar) e das turmas (horário e disciplina).

    Tutor Disponibilidade MAT

    João 0, 1, 3 0, 1, 2

    Maria 0, 2, 3 1, 2

    José 1, 2 0, 1

    Turma 1 2 3 4 5

    Disciplina 0 0 1 1 2

    Horário 0 1 2 0 3

    Escreva um trecho de código para gerar uma lista tutorTurma em que

    cada elemento i é o conjunto de tutores que podem ministrar a turma i.

    Imprima em cada linha cada elemento de tutorTurma.

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear inteira (mista) no SageMath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Tutor=(’Jo~ao’,’Maria’,’José’)

    discipTutor=(set([0,1,2]), set([1,2]),set([0,1])) #disciplina_tutor

    disponiTutor=((0,1,3),(0,2,3),(1,2)) #horarios disponı́veis

    dadosTurma=((0,0),(0,1),(1,2),(1,0),(2,3)) #turma=disciplina,horário

    ntutor,nturma=len(Tutor), len(dadosTurma)

    ndisc,nhora=3,4

    tutorTurma=[]

    for j in range(nturma):

    linha=set([])

    for i in range(ntutor):

    if dadosTurma[j][0] in discipTutor[i] and dadosTurma[j][1] in disponiTutor[i]:

    linha = linha.union([i])

    tutorTurma= tutorTurma + [linha]

    print "Tutores que podem ministrar as turmas:\n"

    for i in range(nturma):

    print "Turma_",i,":",

    for j in tutorTurma[i]:

    print Tutor[j],

    print ""

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear inteira (mista) no SageMath. Bibliotecas de um espećıfico solver

    Seja o MIP:

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    p = MixedIntegerLinearProgram(solver = "GLPK")

    v = p.new_variable(nonnegative=True). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    p.solver_parameter("timelimit", 60) # tempo máximo: 60s

    p.get_relative_objective_gap() # gap

  • MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, [email protected])Aula 11a15: SageMath e Python

    Programação linear inteira (mista) no SageMathimport datetime

    p = MixedIntegerLinearProgram(solver=’GLPK’)

    v = p.new_variable(integer=True, nonnegative=True)

    coeff,coefb=(1,5,3),(6,8,19)

    A=([1,2,-3],[3,-1,1],[2,2,3])

    soma=0

    for i in range(1,4): soma+=coeff[i-1]*v[i]

    p.set_objective(soma)

    for i in range(1,4):

    soma=0

    for j in range(1,4):

    soma+=A[i-1][j-1]*v[j]

    p.add_constraint(soma, max=coefb[i-1])

    p.solver_parameter("timelimit", 60)

    timeini = datetime.datetime.now()

    p.solve()

    timefim = datetime.datetime.now()

    v = p.get_values(v)

    for i in range(1,4): print "v_"+str(i),"=", round(v[i],2)

    print "zbest=", p.get_objective_value()

    print "gap = ", round(100* p.get_relative_objective_gap(),2)

    print "bestbound = ", p.best_known_objective_bound()

    print "time = ",timefim-timeini

    Sáıda:

    v_1 = 0.0

    v_2 = 6.0

    v_3 = 2.0

    zbest= 36.0

    gap = 2.78

    bestbound = 37.0

    time = 0:00:00.000138