Você está na página 1de 2

Apresentação de resultados computacionais Apresentação de resultados computacionais

Programação por restrições Programação por restrições


Exemplos Exemplos

Nesta aula. . . Apresentação de resultados computacionais

10 simple rules
1 For Every Result, Keep Track of How It Was Produced
2 Avoid Manual Data Manipulation Steps
1 Apresentação de resultados computacionais 3 Archive the Exact Versions of All External Programs Used
4 Version Control All Custom Scripts
5 Record All Intermediate Results, When Possible in Standardized
2 Programação por restrições Formats
6 For Analyses That Include Randomness, Note Underlying Random
Seeds
3 Exemplos 7 Always Store Raw Data behind Plots
Problema das N raínhas 8 Generate Hierarchical Analysis Output, Allowing Layers of Increasing
Sudoku
Detail to Be Inspected
9 Connect Textual Statements to Underlying Results
10 Provide Public Access to Scripts, Runs, and Results
source: http://journals.plos.org/ploscompbiol/article?id=10.1371/
journal.pcbi.1003285

João Pedro PEDROSO Métodos de Apoio à Decisão João Pedro PEDROSO Métodos de Apoio à Decisão

Apresentação de resultados computacionais Apresentação de resultados computacionais


Programação por restrições Programação por restrições
Exemplos Exemplos

Resolução de problemas combinatórios Programação por restrições

Otimização inteira: ênfase em encontrar o melhor objetivo


Componentes fundamentais:
Programação por restrições: ênfase em encontrar uma solução
admissível variáveis
domínios
Exemplos:
restrições
coloração de grafos
sudoku

João Pedro PEDROSO Métodos de Apoio à Decisão João Pedro PEDROSO Métodos de Apoio à Decisão

Apresentação de resultados computacionais Apresentação de resultados computacionais


Programação por restrições Programação por restrições
Exemplos Exemplos

Programação por restrições Resolutores

Restrições:
há muitos sistemas para resolução de problemas com programação por
Equações ou desigualdades (como as que vimos em otimização inteira) restrições
Restrições globais: alguns são específicos para um tipo de problemas (por exemplo,
permitem especificar com um termo uma propriedade que determinadas satisfazibilidade)
variáveis devem possuir
muitas vezes, difíceis de exprimir com equações ou desigualdades os mais completos, implementam a maioria das restrições globais
têm associados solvers específicos “comuns”
exemplo: AllDiff(x) → as variáveis x deverão todas ter valores
diferentes infelizmente, não há uma interface comum a todos eles

João Pedro PEDROSO Métodos de Apoio à Decisão João Pedro PEDROSO Métodos de Apoio à Decisão

Apresentação de resultados computacionais Apresentação de resultados computacionais


Problema das N raínhas
Programação por restrições Programação por restrições
Sudoku
Exemplos Exemplos

NumberJack Queens: GnuMathProg


param n, integer, > 0, default 8; /* size of the chess board */

var x{1..n, 1..n}, binary;


Numberjack é um software de modelação para programação por restrições: /* x[i,j] = 1 means that a queen is placed in square [i,j] */
escrito na linguagem Python
s.t. a{i in 1..n}: sum{j in 1..n} x[i,j] <= 1;
suporta uma série de resolutores, implementados em baixo nível /* at most one queen can be placed in each row */
(C/C++):
SCIP (MIP) s.t. b{j in 1..n}: sum{i in 1..n} x[i,j] <= 1;
MiniSat e Walksat (SAT) /* at most one queen can be placed in each column */
Mistral (CP) s.t. c{k in 2-n..n-2}: sum{i in 1..n, j in 1..n: i-j == k} x[i,j] <= 1;
Gurobi (MIP) /* at most one queen can be placed in each "\"-diagonal */
...
s.t. d{k in 3..n+n-1}: sum{i in 1..n, j in 1..n: i+j == k} x[i,j] <= 1;
Vantagens /* at most one queen can be placed in each "/"-diagonal */
linguagem de programação por restrições de alto nível
maximize obj: sum{i in 1..n, j in 1..n} x[i,j];
permite utilizar toda a funcionalidade e bibliotecas do Python /* objective is to place as many queens as possible */

evita a necessidade de compilar o modelo em C/C++, exigida pelos solve; /* solve the problem */
solvers de base for {i in 1..n} /* and print its optimal solution */
{ for {j in 1..n} printf " %s", if x[i,j] then "Q" else ".";
printf("\n");
}
end;

João Pedro PEDROSO Métodos de Apoio à Decisão João Pedro PEDROSO Métodos de Apoio à Decisão
Apresentação de resultados computacionais Apresentação de resultados computacionais
Problema das N raínhas Problema das N raínhas
Programação por restrições Programação por restrições
Sudoku Sudoku
Exemplos Exemplos

Queens: código em Python + NumberJack Sukodu: GnuMathProg


from Numberjack import *

def model_queens(N): param givens{1..9, 1..9}, integer, >= 0, <= 9, default 0;


queens = [Variable(N) for i in range(N)] /* the "givens" */
model = Model(
AllDiff( queens ), var x{i in 1..9, j in 1..9, k in 1..9}, binary;
AllDiff( [queens[i] + i for i in range(N)] ), /* x[i,j,k] = 1 means cell [i,j] is assigned number k */
AllDiff( [queens[i] - i for i in range(N)] )
) s.t. fa{i in 1..9, j in 1..9, k in 1..9: givens[i,j] != 0}:
return (queens,model) x[i,j,k] = (if givens[i,j] = k then 1 else 0);
/* assign pre-defined numbers using the "givens" */
def solve_queens(param):
(queens,model) = model_queens(param[’N’]) s.t. fb{i in 1..9, j in 1..9}: sum{k in 1..9} x[i,j,k] = 1;
solver = model.load(param[’solver’]) /* each cell must be assigned exactly one number */
solver.solve()
print_chessboard(queens) s.t. fc{i in 1..9, k in 1..9}: sum{j in 1..9} x[i,j,k] = 1;
print ’Nodes:’, solver.getNodes(), ’ Time:’, solver.getTime() /* cells in the same row must be assigned distinct numbers */

def print_chessboard(queens): s.t. fd{j in 1..9, k in 1..9}: sum{i in 1..9} x[i,j,k] = 1;


separator = ’+---’*len(queens)+’+’ /* cells in the same column must be assigned distinct numbers */
for queen in queens:
print separator s.t. fe{I in 1..9 by 3, J in 1..9 by 3, k in 1..9}:
print ’| ’*queen.get_value()+’| Q |’+’ |’*(len(queens)-1-queen.get_value()) sum{i in I..I+2, j in J..J+2} x[i,j,k] = 1;
print separator /* cells in the same region must be assigned distinct numbers */

solve_queens(input({’solver’:’Mistral’, ’N’:10}))

João Pedro PEDROSO Métodos de Apoio à Decisão João Pedro PEDROSO Métodos de Apoio à Decisão

Apresentação de resultados computacionais Apresentação de resultados computacionais


Problema das N raínhas Problema das N raínhas
Programação por restrições Programação por restrições
Sudoku Sudoku
Exemplos Exemplos

Sukodu: GnuMathProg (cont.) Sudoku: código em Python + NumberJack


/* there is no need for an objective function here */
solve;
grid = Matrix(N*N,N*N,1,N*N,’cell_’)
for {i in 1..9}
{ for {0..0: i = 1 or i = 4 or i = 7}
sudoku = Model( [AllDiff(row) for row in grid.row],
printf " +-------+-------+-------+\n";
[AllDiff(col) for col in grid.col],
for {j in 1..9}
[AllDiff(grid[x:x+N, y:y+N].flat)
{ for {0..0: j = 1 or j = 4 or j = 7} printf(" |");
for x in range(0,N*N,N)
printf " %d", sum{k in 1..9} x[i,j,k] * k;
for y in range(0,N*N,N)]
for {0..0: j = 9} printf(" |\n");
)
}
for {0..0: i = 9}
printf " +-------+-------+-------+\n";
Dados (grelha parcialmente preenchida, ficheiro clues):
} [(x == int(v)) for (x,v) in zip(grid.flat,
data; "".join(open(clues)).split() ) if v != ’*’]
/* These data correspond to the example above. */
param givens : 1 2 3 4 5 6 7 8 9 := * 1 * * * * * 9 *
1 5 3 . . 7 . . . . * 3 * * * * * * *
2 6 . . 1 9 5 . . . * * * * 7 * * * *
3 . 9 8 . . . . 6 . * * * * * * * 2 *
4 8 . . . 6 . . . 3 5 * * * * * * * *
5 4 . . 8 . 3 . . 1 * * * 3 * 4 * * *
6 7 . . . 2 . . . 6 * * * * * * * * 1
7 . 6 . . . . 2 8 . * * 1 * * * * * *
8 . . . 4 1 9 . . 5 * * * * * 2 * * *
9 . . . . 8 . . 7 9 ;

end;
João Pedro PEDROSO Métodos de Apoio à Decisão João Pedro PEDROSO Métodos de Apoio à Decisão

Apresentação de resultados computacionais


Problema das N raínhas
Programação por restrições
Sudoku
Exemplos

Próxima aula

Programação por restrições (continuação).

João Pedro PEDROSO Métodos de Apoio à Decisão

Você também pode gostar