Post on 14-Feb-2021
MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)Aula 11a15: SageMath e Python
Python. Listas: pseudo-matriz
MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)Aula 11a15: SageMath e Python
Python
MAT 475 – Tópicos em Matemática Aplicada (Lana Mara R. dos Santos, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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, lanamara@ufv.br)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