Computadores e outros dispositivos eletrˆonicos program´aveis executam instru¸c˜oes ativando (ou desativando) determinadas partes em seus componentes. As instru¸c˜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 m´aquina enquanto as de alto n´ıvel se aproximam da linguagem natural humana.
Uma linguagem de programa¸c˜ao pode sercompilada(traduzida para uma linguagem de m´aquina) ouinterpretada.
Uma linguagem interpretada n˜ao precisa ser compilada. Ela ´e lida por um programa que faz a tradu¸c˜ao para a linguagem de m´aquina.
Python´e uma linguagem de alt´ıssimo n´ıvel (VHLL – very high level language), interpretada, de c´odigo fonte aberto e dispon´ıvel para v´arios sistemas operacionais.
O interpretador doPython j´a vem instalado noLinux. Para windowsele est´a dispon´ıvel paradownloadem
http://www.python.org
OSageMath´e implementado principalmente emPython.
Python´e uma linguagemdinamicamente tipada. Isto quer dizer que n˜ao ´e preciso declarar as vari´aveis ou ou tipo delas. A forma como a vari´avel ´e usada no c´odigo identifica como ela ser´a armazenada.
A = 3 ´E identificada como inteira (tipoint) A = 3.0 ´E identificada como inteira (tipofloat) A = "tr^es" ´E identificada comostring
type(A) Para saber o tipo definido para a vari´avel
. coment´ ario
Tudo que estiver ap´os o s´ımbolo # em uma linha de comando do Python´e assumido como coment´ario.
Para comentar um bloco de comandos, coloque-o entre trˆes aspas simples.
#Coment´arios em python a=2 # a recebe 2 b=5
’’’in´ıcio bloco de coment´arios a=3
a=33 b=24 c=15
fim do bloco de coment´arios’’’
a+b
Opera¸c˜oes aritm´eticas:
8+3 adi¸c˜ao
8*3 multiplica¸c˜ao
8/3 divis˜ao de inteiros
8./3 divis˜ao de reais
8**3 potencia¸c˜ao
8**(1/3) radicia¸c˜ao
8%3 resto de divis˜ao
3*("na"+"da") 3x a concatena¸c˜ao de ’na’ com ’da’
Opera¸c˜oes booleanas:
a==b verifica se s˜ao iquais
a!=b oua<>b verifica se s˜ao diferentes
. Listas
Umalista´e uma sequˆencia de vari´aveis delimitada por colchetes. Pode conter tipos diferentes e pode ser alterada (pois ´emut´avel).
list=[4,"nada", 3.0] define a lista listcom 3 elementos.
list[0] exibe o primeiro elemento da lista.
list[-2] exibe o pen´ultimo elemento da lista.
len(list) informa o tamanho da lista.
list+[3,5] concatenalistcom a lista[3,5].
list[1]=7 insere o valor 7 na posi¸c˜ao 1 da lista.
del list[1] remove o elemento da posi¸c˜ao 2 delist.
list.index(4) indica a posi¸c˜ao que o valor ”4”est´a na lista.
Se tiver mais de uma posi¸c˜ao com mesmo valor, indica a primeira ocorrˆencia.
. Listas: pseudo-matriz
. Tupla
Uma tupla´e uma sequˆencia de vari´aveis delimitada por parˆenteses.
Assim como em uma lista, pode conter tipos diferentes. No entanto, uma tupla n˜ao pode ser alterada depois de criada (pois ´eimut´avel).
Os comandos de acesso e manipula¸c˜ao de tuplas s˜ao anal´ogas aos usados para listas.
tup=(4,"nada", 3.0) define a tuplatupcom 3 elementos.
tup[1] acessa o segundo elemento da tuplatup.
matriz=((1,2),(3,4)) cria uma pseudo-matriz 2x2
matriz[0][1] exibe o elemento da posi¸c˜ao 1x2 de matriz
. set
Conjuntos s˜ao definidos com a sintaxeset([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
. Set
SageMathtem sua pr´opria fun¸c˜ao conjunto (Set) que al´em de incorporar as propriedades da Teoria de conjuntos, tem algumas fun¸c˜oes 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\}
. Range
A fun¸c˜aorange(a, b)gera uma lista de uma sequˆencia de n´umeros 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˜ao 4.
. For
Na maioria das linguagens de programa¸c˜ao, o comandoforrealiza uma itera¸c˜ao percorrendo uma sequˆencia de n´umeros inteiros de uma progress˜ao aritm´etica.
EmPythona itera¸c˜ao ´e feita percorrendo os itens de uma sequˆencia 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
N˜ao ´e necess´ario utilizar{ }para delimitar um bloco de comandos ou endpara finalizar uma estrutura.
N˜ao existe um delimitador espec´ıfico para blocos de c´odigo. A delimita¸c˜ao ´e feita pela indenta¸c˜ao( teclatabou 4 espa¸cos).
. . . . 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´a alinhado com o comandofor(e, portanto, o valor deineste caso n˜ao ´e iterado percorrendo a sequˆencia de inteiros emrange(1,3)). Como o ´ultimo valor parai´e 2, foi impressog_2.
. 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
. . . .
Exemplos de formata¸c˜ao destrings:
a,b,c=3.1415,5,’n´umero’ atribui, respectivamente, valores para as vari´aveisa,bec.
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 ´e %s’ %(a,c) imprime: 3.1416 ´e um n´umero print ’%.2f’ %a imprime o float com 2 casas decimais print ’%6.2f’ %a imprime usando 6 espa¸cos no total
(insere espa¸co em branco se preciso).
\n pula uma linha
\t acrescenta espa¸co de tabula¸c˜ao
. if–elif–else
A estrutura geral de uma condicionaliftem a seguinte sintaxe:
if condi¸c~ao:
# comandos ...
elif condi¸c~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¸c~ao", var.index(0) else:
print "Valor positivo: %d" % i
. M´ odulo:
Existemm´odulosque podem ser inseridos no c´odigo.
Para importar um m´odulo basta colocar no in´ıcio do c´odigo:
import nome_do_m´odulo Exemplos:
import datetime# para marcar tempo import random# para gerar n´umeros aleat´orios Para conhecer as fun¸c˜oes de um m´odulo basta digitar:
help(nome_do_modulo).
. Exemplo
Procedimento para gerar uma pseudo-matriz (lista de listas) aleat´oria:
. . . . 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)
. . . .
OSageMath´e umsoftwarelivre e de c´odigo aberto de matem´atica que engloba softwares de v´arias ´areas, tais como, ´algebra, geometria, teoria dos n´umeros, an´alise num´erica, criptografia, computa¸c˜ao simb´olica e num´erica.
Criado em 2005 com o objetivo de ser uma alternativa gratuita a softwarescomerciais comoMaple, Mathematicaematlab.
OSageMathutiliza a linguagem de programa¸c˜aoPython. No entanto, n˜ao ´e preciso saberPythonpara usar a maioria dos recursos do programa.
O conhecimento necess´ario dePythonpara resolver umPPLou PPLI noSageMath´e proporcional `a complexidade do problema.
Endere¸co: http://www.sagemath.org
Para usar oSageMath´e preciso um navegador de internet como ambiente de trabalho.
Para usar nowindows´e preciso instalar uma m´aquina virtual.
Online:
https://cloud.sagemath.com http://sagecell.sagemath.org
http://sagecell.sagemath.org
http://sagecell.sagemath.org
Suponha que se queira resolver o seguintePPL:
max x1+ 4x2+ 3x3 s.a. x1+ 2x2≤5
5x1+ 5x3≤8 x1, x2, x3≥0
Suponha que se queira resolver o seguintePPL:
max x1+ 4x2+ 3x3
s.a. x1+ 2x2≤5 5x1+ 5x3≤8
x1, x2, x3≥0
Crie umMixedIntegerLinearProgram (por padr˜ao, o problema ´e de maximiza¸c˜ao)
Suponha que se queira resolver o seguintePPL:
max x1+ 4x2+ 3x3
s.a. x1+ 2x2≤5 5x1+ 5x3≤8
x1, x2, x3≥0
crie um vetor de vari´aveisx:
(n˜ao ´e preciso definir o tamanho do vetor)
Suponha que se queira resolver o seguintePPL:
max x1+ 4x2+ 3x3
s.a. x1+ 2x2≤5 5x1+ 5x3≤8
x1, x2, x3≥0
adicione a fun¸c˜ao objetivo do PPL:
Suponha que se queira resolver o seguintePPL:
max x1+ 4x2+ 3x3
s.a. x1+ 2x2≤5 5x1+ 5x3≤8
x1, x2, x3≥0
adicione as restri¸c˜oes do PPL:
Suponha que se queira resolver o seguintePPL:
max x1+ 4x2+ 3x3 s.a. x1+ 2x2≤5
5x1+ 5x3≤8 x1, x2, x3≥0
resolva o PPL:
Suponha que se queira resolver o seguintePPL:
max x1+ 4x2+ 3x3
s.a. x1+ 2x2≤5 5x1+ 5x3≤8
x1, x2, x3≥0
z= 14.8
Suponha que se queira resolver o seguintePPL:
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
Exibir solu¸c˜ao:
Suponha que se queira resolver o seguintePPL:
max x1+ 4x2+ 3x3
s.a. x1+ 2x2≤5 5x1+ 5x3≤8
x1, x2, x3≥0
Suponha que se queira resolver o seguintePI:
max x1+ 4x2+ 3x3 s.a. x1+ 2x2≤5
5x1+ 5x3≤8 x1, x2, x3∈Z+
Suponha que se queira resolver o seguintePI:
max x1+ 4x2+ 3x3
s.a. x1+ 2x2≤5 5x1+ 5x3≤8 x1, x2, x3∈Z+
z= 11 x1= 0 x2= 2 x3= 1
O que muda ´e a declara¸c˜ao das vari´aveisx.
Suponha que se queira resolver o seguintePB:
max x1+ 4x2+ 3x3 s.a. x1+ 2x2≤5
5x1+ 5x3≤8 x1, x2, x3∈N
Suponha que se queira resolver o seguintePB:
max x1+ 4x2+ 3x3
s.a. x1+ 2x2≤5 5x1+ 5x3≤8 x1, x2, x3∈N
z= 7 x1= 0 x2= 1 x3= 1
O que muda ´e a declara¸c˜ao das vari´aveisx.
Escrevendo o problema na forma matricial
max x1+ 4x2+ 3x3 s.a. x1+ 2x2≤5
5x1+ 5x3≤8 x1, x2, x3≥0
Escrevendo um PPL de minimiza¸c˜ao na forma matricial
min 2x1+ 4x2+ 3x3
s.a.
x1+ 2x2≥5 5x1+x2+ 3x3≥8 x1+ 3x2≥3 x1, x2, x3≥0
. Alguns comandos ´ uteis
O conjunto solu¸c˜ao pode ser salvo em um vetor:
x_sol=p.get_values(x) Especificar o n´umero de casas decimais:
round(p.solve(),2) round(p.get_values(x),2) Selecionar osolver para resolver o MIP:
MixedIntegerLinearProgram(solver=’nomesolver’) Exemplos desolver: GLPK, Coin, CPLEX, Gurobi (Alguns comandos s˜ao espec´ıficos do solver) MixedIntegerLinearProgram(solver=’GLPK’) Para resolver um MIP de minimiza¸c˜ao:
MixedIntegerLinearProgram(maximization=False)
. Alguns comandos ´ uteis
Seja o MIP:
. . . . p = MixedIntegerLinearProgram()
v = p.new_variable(nonnegative=True)
. . . . p.get_min(v) retorna o valor m´ınimo das vari´aveis do vetorv p.get_min(v[1]) retorna o valor m´ınimo da vari´avelv[1]
p.set_min(v[1],None) permitev[1]assumir qq valor real negativo p.set_max(v[1],6) fixa o valor 6 como limitante superior parav[1]
p.set_binary(v[3]) fixev[3]como bin´aria
(p.polyhedron()).show() para exibir o poliedro(at´e 3D naturalmente) dir(p) Construtor de uma determinada fun¸c˜ao.
Dado o MIP:
. . . . p = MixedIntegerLinearProgram()
v = p.new_variable(nonnegative=True)
. . . . Inserir a restri¸c˜ao: P5
i=0vi≤4
. . . . soma = p.sum(v[i] for i in xrange(5))
p.add_constraint(soma, max=4)
. . . . Inserir restri¸c˜ao: P3
i=1vi= 3
. . . . soma = p.sum(v[i] for i in xrange(1,4))
p.add_constraint(soma, min=3,max=3)
. . . . Informa¸. . . .c˜oes sobre as restri¸c˜oes:
p.constraints() # lista de restri¸c~oes p.constraints(0) # primeira restri¸c~ao
p.number_of_constraints() # n´umero de restri¸c~oes . . . .
. Exemplo:
min x1+ 2x2+ 3x3+ 4x4
s.a.
x1+x2+x3+x4≥10 x3+x4= 4
xi∈ {1,2,3,4}, i= 1, . . . ,4.
Defina um vetoracom os coeficientes da fun¸c˜ao objetivo. Sejano n´umero de coordenadas dea.
Definapum PPI exum vetor de vari´aveis inteiras.
Fa¸casoma=Pn
i=1aixi e insira a restri¸c˜ao soma≥10.
Fa¸casoma=Pn−1
i=2 xi e insira a restri¸c˜ao soma= 4.
Para todoi, fixe o limitante superior (upper bound) da vari´avelxiem 3.
Sejaxˆi, i= 1, ..., n, o conjunto solu¸c˜ao do PPI. Imprima[ˆxi, i= 1, ..., n].
. Exemplo:
min x1+ 2x2+ 3x3+ 4x4
s.a.
x1+x2+x3+x4≥10 x3+x4= 4
xi∈ {1,2,3,4}, i= 1, . . . ,4.
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¸c˜ao e um vetor de vari´aveis inteirasw.
Defina a fun¸c˜ao objetivoPn
i=1aiwi, em quen=|a|.
Defina as restri¸c˜oes:
Pn
i=1b1iwi=c1
Pn
i=1b2iwi≤c2
Resolva oPPI
Imprima o valor ´otimo e os valores das vari´aveis n˜ao nulas.
Escrevendo um PLI de forma mais gen´erica:
Problema (tutoria): Considere 5 turmas de 3 disciplinas (MAT0, MAT1 e MAT2) distribu´ıdas em um dos poss´ıveis 5 hor´arios (0-4). Um conjunto de 3 tutores (Jo˜ao, Maria, Jos´e) com os seguintes hor´arios livres e disciplinas que podem ministrar. As tabelas exibem os dados dos tutores (hor´arios livres e disciplinas que podem ministrar) e das turmas (hor´ario e disciplina).
Tutor Disponibilidade MAT Jo˜ao 0, 1, 3 0, 1, 2
Maria 0, 2, 3 1, 2
Jos´e 1, 2 0, 1
Turma 1 2 3 4 5
Disciplina 0 0 1 1 2
Hor´ario 0 1 2 0 3
Escreva um trecho de c´odigo para gerar uma listatutorTurmaem que cada elementoi´e o conjunto de tutores que podem ministrar a turmai.
Imprima em cada linha cada elemento detutorTurma.
. . . .
Tutor=(’Jo~ao’,’Maria’,’Jos´e’)
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´ario 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 ""
. . . .
. 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´aximo: 60s p.get_relative_objective_gap() # gap
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]
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
Sa´ı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