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 nı́veis de acordo com sua proximidade com a linguagem humana. Linguagens de baixo nı́vel são mais próximas da linguagem da máquina enquanto as de alto nı́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 nı́vel (VHLL – very high level language), interpretada, de código fonte aberto e disponı́vel para vários sistemas operacionais. O interpretador do Python já vem instalado no Linux. Para windows ele está disponı́vel para download em http://www.python.org O SageMath é implementado principalmente em Python . 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 A = 3.0 A = "tr^ es" type(A) É identificada como inteira (tipo int) É identificada como inteira (tipo float) É identificada como string 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 sı́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 8*3 8/3 8./3 8**3 8**(1/3) 8%3 3*("na"+"da") adição multiplicação divisão de inteiros divisão de reais potenciação radiciação resto de divisão 3 x a concatenação de ’na’ com ’da’ Operações booleanas: a==b a!=b ou a<>b verifica se são iquais 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 Aula 11a15: SageMath e Python Python . Listas: pseudo-matriz (Lana Mara R. dos Santos, [email protected]) 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 comandos ou end para finalizar uma estrutura. Não existe um delimitador especı́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 o comando 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)) Resultado: for i in range(len(matriz)): 1 0 0 for j in range(len(matriz)): 0 1 0 print matriz[i][j], 0 0 1 . . . . print . . . . . . ."" ....................................................... 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’ print print print print print print \n \t "a=%f" %a "b=%d" %b "c=%s" %s ’%f é %s’ %(a,c) ’%.2f’ %a ’%6.2f’ %a atribui, respectivamente, valores para as variáveis a,b e c. imprime: a={valor da float(f) a} imprime: b={valor do inteiro(d) b} imprime: c={valor da string(s) c} imprime: 3.1416 é um número imprime o float com 2 casas decimais imprime usando 6 espaços no total (insere espaço em branco se preciso). pula uma linha acrescenta espaço de tabulação MAT 475 – Tópicos em Matemática Aplicada Aula 11a15: SageMath e Python Python (Lana Mara R. dos Santos, [email protected]) 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, for i in var: if i < 0: print elif i == print else: print 5, 6, 0, -3, 4, 8, 3] "Valor negativo: %d" % i 0: "zero na posiç~ ao", var.index(0) "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 inı́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 MAT 475 – Tópicos em Matemática Aplicada Aula 11a15: SageMath e Python Como usar o SageMath http://sagecell.sagemath.org (Lana Mara R. dos Santos, [email protected]) MAT 475 – Tópicos em Matemática Aplicada Aula 11a15: SageMath e Python Como usar o SageMath http://sagecell.sagemath.org (Lana Mara R. dos Santos, [email protected]) 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 ≤ 5 5x1 + 5x3 ≤ 8 x1 , 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: Crie um MixedIntegerLinearProgram (por padrão, o problema é de maximização) max x1 + 4x2 + 3x3 s.a. x1 + 2x2 ≤ 5 5x1 + 5x3 ≤ 8 x1 , 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: crie um vetor de variáveis x: (não é preciso definir o tamanho do vetor) max x1 + 4x2 + 3x3 s.a. x1 + 2x2 ≤ 5 5x1 + 5x3 ≤ 8 x1 , 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: adicione a função objetivo do PPL: max x1 + 4x2 + 3x3 s.a. x1 + 2x2 ≤ 5 5x1 + 5x3 ≤ 8 x1 , 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: adicione as restrições do PPL: max x1 + 4x2 + 3x3 s.a. x1 + 2x2 ≤ 5 5x1 + 5x3 ≤ 8 x1 , 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: resolva o PPL: max x1 + 4x2 + 3x3 s.a. x1 + 2x2 ≤ 5 5x1 + 5x3 ≤ 8 x1 , 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 ≤ 5 5x1 + 5x3 ≤ 8 x1 , 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: Exibir solução: max x1 + 4x2 + 3x3 s.a. x1 + 2x2 ≤ 5 5x1 + 5x3 ≤ 8 x1 , x2 , x3 ≥ 0 z = 14.8 x1 = 0.0 x2 = 2.5 x3 = 1.6 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 ≤ 5 5x1 + 5x3 ≤ 8 x1 , 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 ≤ 5 5x1 + 5x3 ≤ 8 x1 , 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: O que muda é a declaração das variáveis x. max x1 + 4x2 + 3x3 s.a. x1 + 2x2 ≤ 5 5x1 + 5x3 ≤ 8 x1 , x2 , x3 ∈ Z+ z = 11 x1 = 0 x2 = 2 x3 = 1 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 ≤ 5 5x1 + 5x3 ≤ 8 x1 , 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: O que muda é a declaração das variáveis x. max x1 + 4x2 + 3x3 s.a. x1 + 2x2 ≤ 5 5x1 + 5x3 ≤ 8 x1 , x2 , x3 ∈ N z=7 x1 = 0 x2 = 1 x3 = 1 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 ≤ 5 5x1 + 5x3 ≤ 8 x1 , 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 ≥ 5 5x1 + x2 + 3x3 ≥ 8 x1 + 3x2 ≥ 3 x1 , 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 especı́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) p.get_min(v[1]) p.set_min(v[1],None) p.set_max(v[1],6) p.set_binary(v[3]) (p.polyhedron()).show() dir(p) retorna o valor mı́nimo das variáveis do vetor v retorna o valor mı́nimo da variável v[1] permite v[1] assumir qq valor real negativo fixa o valor 6 como limitante superior para v[1] fixe v[3] como binária para exibir o poliedro(até 3D naturalmente) 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) .................................................................. P5 Inserir a restrição: i=0 vi ≤ 4 .................................................................. soma = p.sum(v[i] for i in xrange(5)) . . .p.add_constraint(soma, . . . . . . . . . . . . . . . . . . . . . . . . . . .max=4) .................................... P3 Inserir restrição: 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ç~ . . . . . . . . o. es ......... 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: Defina um vetor a com os coeficientes da função objetivo. Seja n o número de coordenadas de a. min x1 + 2x2 + 3x3 + 4x4 s.a. x1 + x2 + x3 + x4 ≥ 10 x3 + x4 = 4 xi ∈ {1, 2, 3, 4}, i = 1, . . . , 4. Defina p um PPI e x um vetor de variáveis inteiras. P Faça soma= n i=1 ai xi e insira a restrição soma ≥ 10. P 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 ≥ 10 x3 + 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 SageMath Exemplo: 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. Pn Defina a função objetivo i=1 ai wi , em que n = |a|. Defina as restrições: Pn b1i wi = c1 Pi=1 n i=1 b2i wi ≤ 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) distribuı́das em um dos possı́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 Maria José 0, 1, 3 0, 2, 3 1, 2 0, 1, 2 1, 2 0, 1 Turma 1 2 3 4 5 Disciplina Horário 0 0 0 1 1 2 1 0 2 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 especı́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 SageMath import 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] Saı́da: p.set_objective(soma) v_1 = 0.0 for i in range(1,4): soma=0 v_2 = 6.0 for j in range(1,4): v_3 = 2.0 soma+=A[i-1][j-1]*v[j] zbest= 36.0 p.add_constraint(soma, max=coefb[i-1]) p.solver_parameter("timelimit", 60) gap = 2.78 timeini = datetime.datetime.now() bestbound = 37.0 p.solve() timefim = datetime.datetime.now() time = 0:00:00.000138 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