70
1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, quer por facilidade de modelação, quer para explorar algoritmos especializados que permitam uma propagação eficiente. Exemplo: Garantir que n variáveis tomam valores diferentes. all_dif ([A1, A2, ..., An] • Alternativas Definir a restrição a partir de restrições binárias . Definir (utilizar) uma restrição global primitiva

1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

Embed Size (px)

Citation preview

Page 1: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

1

Restrições Globais• Em muitos casos, interessa definir restrições n-

árias primitivas, – quer por facilidade de modelação, – quer para explorar algoritmos especializados

que permitam uma propagação eficiente.

• Exemplo: Garantir que n variáveis tomam valores diferentes.

all_dif ([A1, A2, ..., An]

• Alternativas– Definir a restrição a partir de restrições binárias

.– Definir (utilizar) uma restrição global primitiva

Page 2: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

2

Restrições GlobaisA definição da restrição a partir de restrições binárias de diferença () não coloca dificuldades de modelação, podendo ser feita com um predicado recursivo.

all_diff([]).

all_diff([H|T]):-

one_diff(H,T),

all_diff(T).

one_diff(_,[]).

one_diff(X,[H|T]):-

X #\= H,

one_diff(X,T).

Page 3: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

3

Restrições Globais•No entanto, a propagação das restrições binárias, não

permite grandes reduções de domínio.

•Exemplo: X1: 1,2,3 X6: 1,2,3,4,5,6,7,8,9

X2: 1,2,3,4,5,6 X7: 1,2,3,4,5,6,7,8,9

X3: 1,2,3,4,5,6,7,8,9 X8: 1,2,3

X4: 1,2,3,4,5,6 X9: 1,2,3,4,5,6

X5: 1,2,3

•É facil de ver que a propagação das restrições binárias, quer para manter a consistência de nó, quer para manter a consistência de arco, não produzem nenhuma redução dos domínios das variáveis.

•E, no entanto, é fácil inferir essa redução !

Page 4: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

4

Restrições Globais

X1: 1,2,3 X2: 1,2,3,4,5,6 X3: 1,2,3,4,5,6,7,8,9

X4: 1,2,3,4,5,6 X5: 1,2,3 X6: 1,2,3,4,5,6,7,8,9

X7: 1,2,3,4,5,6,7,8,9 X8: 1,2,3 X9: 1,2,3,4,5,6

•As variáveis X1, X5 e X8 só podem tomar os valores 1, 2 e 3. Como a estas três variáveis correspondem três valores, estes têm de ser retirados das outras variáveis

•Agora são as variáveis X2, X4 e X9 que só podem tomar os valores 4, 5 e 6, que devem ser retirados das outras variáveis.

X1: 1,2,3 X2: 1,2,3,4,5,6 X3: 1,2,3,4,5,6,7,8,9

X4: 1,2,3,4,5,6 X5: 1,2,3 X6: 1,2,3,4,5,6,7,8,9

X7: 1,2,3,4,5,6,7,8,9 X8: 1,2,3 X9: 1,2,3,4,5,6

Page 5: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

5

Restrições Globais

• Neste caso, os cortes no domínio das variáveis poderiam ser obtidos por manutenção de consistência 4.

• Por exemplo, analisando as variáveis X1, X2, X5 e X8, seria fácil verificar que das d4 potenciais atribuições de variáveis, nenhuma atribuição admissível inclui X2 = 1 (nem X2 = 2, nem X2 = 3).

• No entanto essa manutenção é em geral muito “cara” computacionalmente. Para cada combinação de 4 variáveis haveria de testar d4 tuplos, com complexidade O(n4 d4)

• Apesar de polinomial no número de variáveis e no seu domínio, este tipo de consistência “forte” e não produz em geral cortes que contrabalancem o seu custo.

Page 6: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

6

Restrição Global - all_diff

• No entanto, e para este predicado particular, existe um algoritmo que permite fazer esses cortes, com uma técnica muito diferente da simples propagação.

• Esse algoritmo, descrito em [Regi94] é baseada na teoria de grafos, e utiliza a noção de emparelhamento (“matching”).

• Assim a uma restrição all_diff é associado um grafo bipartido, variáveis e valores, cujos arcos ligam as variáveis aos respectivos domínios.

• Em tempo polinomial é possível eliminar desse grafo os arcos que não correspondem a atribuições possíveis das variáveis.

Page 7: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

7

Restrição Global - all_diff

Ideias Base:

• A cada valor possível de uma variável corresponde um arco no grafo bipartido.

• Um emparelhamento (“matching”) corresponde a um subconjunto de arcos, ligando variáveis a valores diferentes.

• Um emparelhamento máximo é um emparelhamento incluindo todas as variáveis.

• Uma solução da restrição all_diff corresponde a um emparelhamento máximo.

Page 8: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

8

Restrição Global - all_diff

Exemplo: A,B:: 1..2, C:: 1..3, D:: 2..5, E:: 3..6, all_diff([A,B,C,D,E]).

A

B

C

D

E

1

2

3

4

5

6

A = 1

B = 2

C = 3

D = 4

E = 5

Emparelhamento Máximo

Page 9: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

9

Restrição Global - all_diff

A filtragem é baseada nos seguintes princípios:

1. Se um arco não pertence a nenhum emparelhamento máximo, então ele não pertence a uma solução.

2. Uma vez determinado um emparelhamento máximo arbitrário é possível determinar se qualquer arco pertence ou não a um emparelhamento máximo.

3. Com efeito, dado um emparelhamento máximo arbitrário, um arco pertence a um emparelhamento máximo sse pertencer:

a) A um ciclo alternado par; ou

b) A um caminho alternado par, começando num vértice livre;

Page 10: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

10

Restrição Global - all_diffExemplo: Para o emparelhamento máximo (EM) indicado

• 6 é um vértice livre;

• 6-E-5-D-4 é um caminho alternado par, alternando arcos do EM (E-5, D-4) com arcos fora do EM (6-E e 5-D);

• A-1-B-2-A é um ciclo alternado;

• E-3 não pertence a um ciclo alternado

• E-3 não pertence a um caminho alternado par começado no vértice livre (6)

• E-3 pode ser filtrado!

A

B

C

D

E

1

2

3

4

5

6

Page 11: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

11

Compactação

•Antes desta análise, o grafo pode ser compactado, aglutinandojuntando nós “equivalentes”, i.e que pertencem a ciclos alternados.

•A justificação é que para qualquer solução envolvendo as variáveis e valores dum ciclo alternado se podem obter outras por permutação das correspondências.

•Desta forma basta fazer a análise de filtragem com base numa dessas soluções, agrupando num só os vértices de valores e noutros os das variáveis.

Restrição Global - all_diff

Page 12: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

12

Restrição Global - all_diff

• A-1-B-2-A é um ciclo alternado;

• Por permutação das variáveis A e B a solução <A,B,C,D,E> = <1,2,3,4,5> torna-se <A,B,C,D,E> = <2,1,3,4,5>

• Então podem agrupar-se os nós A e B e os nós 1 e 2. Pela mesma razão, podem ser agrupados os nós D/E e os nós 4/5. A/B

C

4/5

3

6

D/E

1/2

A

B

C

D

E

1

2

3

4

5

6

Com estas simplificações, é obtido o grafo compactado

Page 13: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

13

Restrição Global - all_diff

A análise do grafo compactado permite concluir que

A/B

C

4/5

3

6

D/E

1/2

A/B

C

4/5

3

6

D/E

1/2

•O arco D/E - 3 pode ser filtrado (notar que, apesar de pertencer ao ciclo D/E - 3 - C - 1/2 - D/E, este ciclo não é alternado)

•Os arcos D/E - 1/2 e C - 1/2 também podem ser filtrados.

O grafo compactado pode asssim ser simplificado para

Page 14: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

14

Restrição Global - all_diff

Expandindo, após a simplificação, o grafo compactado

A/B

C

4/5

3

6

D/E

1/2

O que fixa imediatamente C=3 e, mais geralmente filtra os domínio iniciais, para

A,B:: 1..2, C:: 1,2,3, D:: 2,3,4,5, E:: 3,4,5,6

A

B

C

D

E

1

2

3

4

5

6

Page 15: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

15

Propagação da Restrição all_diffApós a eliminação de arcos por outras restrições, a restrição all_dif permite a propagação de restrições (eliminação de arcos) de uma forma incremental.

Existem 3 situações a considerar:

1. Eliminação de um arco vital (único arco ligando uma variável a um valor) - A restrição torna-se impossívelA

B

C

D

E

1

2

3

4

5

6

A

B

C

D

E

1

2

3

4

5

6

?

Page 16: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

16

Propagação da Restrição all_diff2. Eliminação de um arco não-vital que não-pertence a um emparelhamento máximo

- Eliminar os arcos que deixam de fazer parte dos ciclos e caminhos alternados

A

B

C

D

E

1

2

3

4

5

6

A

B

C

D

E

1

2

3

4

5

6

O arco A-4 deixa de pertencer a um caminho alternado começado no nó 6. D-5 deixa de pertencer a esse caminho alternado, mas ainda pertence a um ciclo alternado.

Page 17: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

17

Propagação da Restrição all_diff3. Eliminação de um arco não-vital que pertence a um emparelhamento máximo

- Determinar um novo emparelhamento máximo e recomeçar de novo

A

B

C

D

E

1

2

3

4

5

6

A

B

C

D

E

1

2

3

4

5

6

O novo emparelhamento máximo inclui os arcos D-5 e E-6. Com este emparelhamento, os arcos E-4 e E-5 deixam de pertencer a caminhos ou ciclos alternados.

Page 18: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

18

Restrição Global - all_diff

Complexidade:

Assumindo n variáveis em que cada uma tem um domínio com d valores, sendo D a cardinalidade da união de todos os domínios,

1.É possível obter um emparelhamento máximo com uma complexidade temporal O(dnn).

2.É possível remover arcos que não pertencem a nenhum emparelhamento máximo com uma complexidade temporal de O( dn+n+D).

3.Somando estes resultados obtemos O(dn+n+D+dnn). Tendo em conta que D < dn, a complexidade total do algoritmo é de apenas O(dnn).

Page 19: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

19

Disponibilidade:

1. A restrição all_diff apareceu inicialmente no sistema CHIP (algoritmo?).

2. A implementação descrita está incorporada no sistema ILOG, disponibilizada pela primitiva IlcAllDiff

3. Este algoritmo, está igualmente disponibilizados no sistema SICStus, através da primitiva all_distinct/1. Versões do algoritmo menos completas (com menores cortes) são igualmente disponibilizadas pela primitiva all_different/2 em que o segundo argumento é um parâmetro que controla as opções disponíveis.

Restrição Global - all_diff

Page 20: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

20

Restrição Global - all_diff

Exemplo ( programa all_different.txt):

adn([A,B,C,D,E,F,G,H,I,J]):-

A in 0..9, B in 0..8, C in 0..7, D in 0..6, E in 0..5,

F in 0..4, G in 0..3, H in 0..2, I in 0..1, J in 0..1,

statistics(runtime,[_,_]),

all_different([A,B,C,D,E,F,G,H,I,J]),

labeling([],[A,B,C,D,E,F,G,H,I,J]),

statistics(runtime,[_,T]),

nl,write('T'-T), nl,

fd_statistics.

Page 21: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

21

Restrição Global - all_diff

Exemplo: ?- ad3(L).

T-0

Resumptions: 2

Entailments: 1

Prunings: 20

Backtracks: 0

Constraints created: 1

L=[9,8,7,6,5,4,3,2,0,1]?

yes

?- ad1(L).

T-150

Resumptions: 38763

Entailments: 33203

Prunings: 31700

Backtracks: 5560

Constraints created: 4

L=[9,8,7,6,5,4,3,2,0,1]?

yes

Page 22: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

22

Restrição Global - Assignment

A restrição all_diff é aplicável a problemas em que se pretende que tarefas diferentes sejam executadas por agentes diferentes (ou utilizem recursos diferentes).

No entanto, as tarefas e os recursos são tratados diferentemente. Uns são variáveis e outros são simplesmente domínios dessas variáveis. Por exemplo, denotando 4 tarefas/recursos pelas variáveis Ti/Rj, haveria que optar por uma das especificações

T1 in 1..3, T2 in 2..4, T3 in 1..4, T4 in 1..3.

R1 in {1,3,4}, R2 in 1..4, R3 in 1..4, R4 in {2,3}

Assim, podem-se especificar outras restrições com as variáveis Ti ou Rj, mas não se podem especificar (facilmente) restrições que envolvam ambas.

Page 23: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

23

Restrição Global - Assignment

Esta “desigualdade” pode ser ultrapassada tratando quer as tarefas quer os recursos de uma forma similar, através da sua representação através de variáveis.

No entanto, há que ter o cuidado de garantir que se pelo lado das tarefas uma tarefa j é executada pelo recurso i, pelo lado dos recursos, o recurso i é atribuído à tarefa j.

Assim, continuando a denotar tarefas por Ti e recursos por Rj temos para quaisquer i, j 1..n

Ri = j Tj = i

Este é o objectivo da restrição assignment/2, disponibilizada no SICStus, que utiliza as mesmas técnicas de propagação da restrição all_diff.

Page 24: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

24

Restrição Global - Assignment

Exemplo: A1:1..2, A2::1..2, A3::1..3, A4::2..5, A5:: 3..5,B1:1..3, B2::1..4, B3::3..5, B4::4..5, B5:: 4..5,assignment([A1,A2,A3,A4,A5], [B1,B2,B3,B4,B5]).

A = 1

B = 2

C = 3

D = 4

E = 5

A1

A2

A3

A4

A5

B1

B2

B3

B4

B5

emparelhamentomáximo

Page 25: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

25

Restrição Global - Assignment

Como a restrição de assignment impõe um emparelhamento máximo no grafo bipartido de “tarefas” e “recursos”, pelo que se poderão usar a mesma técnica de filtragem da restrição all_diff.

A1

A2

A3

A4

A5

B1

B2

B3

B4

B5

A1

A2

A3

A4

A5

B1

B2

B3

B4

B5

Page 26: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

26

Restrição Global - Assignment Desta forma os domínios iniciaisA1:1..2, A2::1..2, A3::1..3, A4::2..5, A5:: 3..5,

B1:1..3, B2::1..4, B3::3..5, B4::4..5, B5:: 4..5,

A1

A2

A3

A4

A5

B1

B2

B3

B4

B5

A1

A2

A3

A4

A5

B1

B2

B3

B4

B5

São filtrados paraA1:1..2, A2::1..2, A3:: 3 , A4::4..5, A5:: 4..5,

B1:1..2, B2::1..2, B3:: 3 , B4::4..5, B5:: 4..5,

Page 27: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

27

Restrição Global - Circuit

• As restrições globais anteriores podem ser vistas como impondo uma “permutação” das variáveis.

• Em vários problemas essa permutação não é uma restrição suficiente, sendo necessário considerar uma “ordenação” das variáveis.

• Uma situação típica é a necessidade de impôr uma sequenciação de tarefas, havendo precedências entre tarefas e não podendo certas tarefas ser “adjacentes”.

• Nestas situações, para além da permutação das variáveis, pretende-se obter um ciclo viável das tarefas, e a não existência de sub-ciclos.

Page 28: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

28

Restrição Global - CircuitEstes problemas podem ser descritos através de grafos, cujos nós representam tarefas e os arcos denotam precedências entre essas tarefas.

A B

C D

Os arcos podem ser etiquetados por “propriedades” das precedências. Por exemplo, tempos de transição.

Este tipo de restrições globais aplica-se a vários problemas do tipo “caixeiro viajante”.

A B

C D

2

3

4 5 6

9

8

7

2

2

2

Page 29: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

29

Restrição Global - Circuit

Filtragem: Para este tipo de problemas, pretende-se eliminar os arcos que não pertençam a nenhum circuito hamiltoniano (caixeiro viajante).

No grafo é fácil de ver que os únicos circuitos possíveis são A->B->D->C->A e A->C->D->B->A. Assim certos arcos (ex. B->C, B->B) não podem pertencer a nenhum circuito e podem ser eliminados.

A B

C D

A B

C D

Page 30: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

30

Restrição Global - CircuitA eliminação dos arcos que não pertencem a nenhum circuito redundante é o objectivo da restrição global circuit/1, disponibilizada no SICStus.

Esta restrição aplica-se a uma lista de variáveis de domínio, em que o domínio de cada variável corresponde ao conjunto de arcos ligando essa variável às outras, denotadas pela ordem em que aparecem na lista.

Por exemplo:

A in 2..3, B in 1..4,

C in 1..4, D in 2..3,

circuit([A,B,C,D]).

A/1 B/2

C/3 D/4

A=2

A=3

Page 31: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

31

Restrição Global - Circuit

A restrição global circuit/1 permite obter a eliminação dos arcos que não pertencem a nenhuma solução. Por exemplo, dado o goloA in 2..3, B in 1,2,3,4, C in 1,2,3,4, D in 2..3,

circuit([A,B,C,D]).

Obtém-se o resultado

A in 2..3, B in 1,2,3,4, C in 1,2,3,4, D in 2..3.

A B

C D

A B

C D

Page 32: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

32

Restrição Global - Element

Em várias situações, uma variável não só tem os seus valores restringidos pelos valores de outra variável, como é definida condicionalmente em função destes valores.

Por exemplo, o valor X do arco que sai do nó A, depende do valor deste nó; se A = 2 então X = 3, se A = 3 então X = 4; caso contrário X = indefinido

A/1 B/2

C/3 D/4

2

3

4 5 6

9

8

7

2

2

2

Desta forma, a disjunção implícita nesta definição condicional levanta, como é sabido, problemas de eficiência na propagação de restrições.

Page 33: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

33

Restrição Global - Element

Com efeito, o valor de X só poderá ser conhecido na altura da enumeração (labelling) da variável A. Até essa altura, pouco se pode inferir do valor de X.

se A = 2 então X = 3, se A = 3 então X = 4; caso contrário X = indefinido

A/1 B/2

C/3 D/4

2

3

4 5 6

9

8

7

2

2

2

Por outro lado, caso outras restrições do problema impusessem que X < 4, uma propagação eficiente desta condição deveria não só impôr X = 3 como também A = 2.

Page 34: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

34

Restrição Global - ElementO tratamento eficiente deste tipo de disjunções é o objectivo da restrição global element/3, disponibilizada nas linguagens SICStus e CHIP.

element(X, [V1,V2,...,Vn], V)

Nesta restrição X é uma variável de domínio 1..n, e os Vis são variáveis de domínio finito ou constantes. A semântica da restrição pode ser descrita através da equivalência

X = i V = Vi

Do ponto de vista da propagação esta restrição mantém coerência de domínio em X e coerência de intervalo em V. Está particularmente optimizada para o caso em que todos os Vis são constantes.

Page 35: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

35

Restrição Global - Element

Exemplo (caixeiro.txt): Determinar um (ou mais) circuito hamiltoniano no grafo abaixo, cujo comprimento não exceda um valor máximo (20).

circ([A,B,C,D], Max, Circ):- A in 2..3, B in 1..4, C in {1}\/{3,4}, D in 2..3, circuit([A,B,C,D]), element(A,[_,2,3,_],Ca), element(B,[2,2,5,6],Cb), element(C,[2,_,2,9],Cc), element(D,[_,8,7,_],Cd), Circ #= Ca+Cb+Cc+Cd, Circ #=< Max, labeling([],[A,B,C,D]).

A/1 B/2

C/3 D/4

2

3

4 5 6

9

8

7

2

2

2

Page 36: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

36

Restrição Global - Cycle

Por vezes pretende-se que os vários nós possam ser ligados por mais de um circuito.

Esta situação corresponde ao clássico problema do Caixeiro Viajante Múltiplo, que modela bem várias situações práticas.

Por exemplo, se se pretenderem abastecer um conjunto de estações de serviço com N auto-tanques.

Para este efeito, a linguagem CHIP extendeu a restrição global circuit/1, para uma outra cycle/2, em que o primeiro argumento é uma variável de domínio ou um inteiro correspondente ao número de ciclos.

Nota: Na realidade a restrição circuit(L) é implementada em CHIP como cycle(1,L).

Page 37: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

37

Exemplo:X1::[1,3,4] X4::[2,5]

X2::[1,3] X5::[6]

X3::[2,5,6] X6::[4,5]

?- N::[1,2,3], X = [X1,X2,X3,X4,X5,X6], cycle(N,X).

N = 1 N = 2 N = 3

X =[3,1,5,2,6,4] X =[3,2,1,5,6,4] X =[3,1,5,2,6,4]

Restrição Global - Cycle

2 4 6

1 3 5

2 4 6

1 3 5

2 4 6

1 3 5

2 4 6

1 3 5

Page 38: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

38

Em muitos problemas, nomeadamente de escalas e horários pretende-se exprimir restrições do tipo

Nestes N “slots” M devem ser do tipo T.

Em geral, já vimos como este tipo de restrições pode ser “eficientemente” tratado com a meta-restrição de cardinalidade. Em alguns sistemas/linguagens, estas restrições de cardinalidade são dadas ou como primitivas ou implementadas a partir da reificação de restrições.

Em particular, no SICStus pode ser usada a primitiva count/4 para “contar” elementos numa lista, o que substitui a meta-restrição de cardinalidade (ver adiante).

No entanto, a cardinalidade pode ser mais eficientemente propagada se considerada de uma forma global.

Cardinalidade - Local e Global

Page 39: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

39

Por exemplo, assumamos numa escala de serviço para uma equipa de várias pessoas (enfermeiras), das quais uma ou duas têm de fazer o turno da manhã (m), uma ou duas o turno da tarde (t), uma o turno da noite (n), podendo as outras ficar de folga (f) ou em reserva (r).

Para modelar este problema, vamos considerar uma lista L, cujas variáveis Li correspondem às 7 pessoas disponíveis e podem tomar valores no conjunto {m, t, n, f, r}.

Quer em SICStus quer em CHIP esta restrição complexa pode ser partida em várias restrições de cardinalidade.

Para evitar as limitações dessas linguagens façamos a codificação m/1, t/2, n/3, f/4, e r/5.

Cardinalidade - Local e Global

Page 40: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

40

SICStus:count(1,L,#>=,1), count(1,L,#=<,2) % um ou dois m/1

count(2,L,#>=,1), count(2,L,#=<,2) % um ou dois t/2

count(3,L,#=, 1) , % um e um só n/3

count(4,L,#>=,0), count(4,L,#=<,2) % zero a dois f/4

count(5,L,#>=,0), count(5,L,#=<,2) % zero a dois r/5

CHIP (ver [BeCo94] para detalhes - sintaxe modificada):among([1,2],L,_,[1]), % um a dois m/1

among([1,2],L,_,[2]), % um a dois t/2

among( 1 ,L,_,[3]), % um e um só n/3

among([0,2],L,_,[4]), % zero a dois f/4

among([0,2],L,_,[5]), % zero a dois r/5

Cardinalidade - Local e Global

Page 41: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

41

No entanto, o tratamento local de cada uma destas restrições, separadamente, não detecta todas as oportunidades de filtragem de valores às variáveis. Por exemplo:

A,B,C,D::{m,t}, E::{m,t,n}, F::{t,n,f,r}, G ::{n,r}

Cardinalidade - Local e Global

m (1,2)

F

D

E

A

B

C

G

t (1,2)

n (1,1)

f (0,2)

r (0,2)

Page 42: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

42

A, B, C e D só podem tomar valores m e t. Como estes só podem ser atribuidos a 4 pessoas, mais ninguém (nomeadamente E) pode tomar valores m e t.

Como E só pode tomar o valor n, que deve ser tomado por uma só pessoa, mais ninguém (F e G) pode tomar o valor e.

Cardinalidade - Local e Global

m (1,2)

F

D

E

A

B

C

G

t (1,2)

n (1,1)

f (0,2)

r (0,2)

m (1,2)

F

D

E

A

B

C

G

t (1,2)

n (1,1)

f (0,2)

r (0,2)

Page 43: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

43

Este tipo de filtagem obtém-se através de um algoritmo que utiliza analogias com fluxos em redes [Regi96].

Em primeiro lugar considera-se uma restrição global, gcc/4 que dada a lista de k variáveis X = [X1, ..., Xk] , que podem tomar valores na lista com m valores v = [v1, ..., vm], sendo cada um dos valores Vi atribuído a entre Li e Mi variáveis.

Assim, m restrições SICStus (ou equivalentes):...

count(vi,X,#>=,Li), count(vi,X,#=<,Mi) ...

podem ser subtituídas pela restrição

gcc([X1,...,Xk], [v1,...,vm], [L1,..., Lm],[M1,..., Mm])

Cardinalidade - Local e Global

Page 44: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

44

À restrição gcc faz-se corresponder um grafo direccionado (uma rede) com capacidades máximas e limites mínimos nos arcos, e com dois nós adicionais, a e b. Por exemplo:

gcc([A,,...,G],[m,t,n,f,r],[1,1,1,0,0], [2,2,1,2,2])

Cardinalidade - Local e Global

m (1,2)

F

D

E

A

B

C

G

t (1,2)

n (1,1)

f (0,2)

r (0,2)

1 ; 21 ; 2

1 ; 1

0 ; 20 ; 2

0 ; 1

0 ; 1

0 ;

ab

Page 45: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

45

Uma solução do problema corresponde a um fluxo entre os dois nós acrescentados, com fluxo unitário nos arcos que ligam os valores às variáveis. Nestas condições, é valido o

Teorema: Uma restrição com k variáveis é consistente sse existir um fluxo máximo de valor k entre os nós a e b.

Cardinalidade - Local e Global

i

0

1

i

Fluxos

m (1,2)

F

D

E

A

B

C

G

t (1,2)

n (1,1)

f (0,2)

r (0,2)

1 ; 21 ; 2

1 ; 1

0 ; 20 ; 2

0 ; 1

0 ; 1

0 ;

2

2

7

b a

Page 46: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

46

Naturalmente no contexto desta restrição pretende-se

1. Obter um fluxo máximo com valor k, isto é mostrar que o problema tem solução

2. Eliminar os arcos entre valores e variáveis que não sejam percorridos em nenhuma solução de fluxo máximo, isto é não pertencem a nenhuma solução.

3. Caso alguns arcos sejam eliminados (por outras restrições, refazer 1 e 2 de forma incremental)

Em [Regi96] é apresentada uma solução para estes problemas, bem como a sua complexidade polinomial.

Cardinalidade - Local e Global

Page 47: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

47

1. Obter um fluxo máximo com valor k

Este problema de optimização pode ser resolvido muito eficientemente por programação linear, sendo garantidas as condições de integralidade dos valores dos fluxos nos vários arcos.

No entanto, e tendo em conta o aspecto incremental referido atrás, pode obter-se um fluxo máximo indo utilizando caminhos de aumento no grafo residual, até não ser possível aumentar mais um dado fluxo.

O grafo residual é igualmente um grafo direccionado, com os mesmos vértices do grafo inicial. Os seus arcos, com limite mínimo 0, tem uma capacidade residual que tem em conta a capacidade não usada pelo fluxo f.

Cardinalidade - Local e Global

Page 48: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

48

1. Grafo Residual de um fluxo f

a. Dado um arco (a,b) com capacidade c(a,b) e fluxo f(a,b) tal que f(a,b) < c(a,b) existe um arco (a,b) no grafo residual com capacidade residual cr(a,b) = c(a,b) - f(a,b).

O facto de o sentido ser idêntico indica que se pode aumentar o fluxo no arco de um valor cr(a,b).

b. Dado um arco (a,b) com limite mínimo l(a,b) e fluxo f(a,b) tal que f(a,b) > c(a,b) existe um arco (b,a) no grafo residual com capacidade residual cr(a,b) = f(a,b) - l(a,b).

O facto de o sentido ser oposto indica que se pode reduzir o fluxo no arco de um valor cr.

Cardinalidade - Local e Global

Page 49: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

49

Exemplo: Dado o fluxo abaixo, com valor 6 (inferior ao máximo), obtem-se o seguinte grafo residual.

Cardinalidade - Local e Global

22

2

6

22

1

02

6

2

2

Page 50: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

50

Havendo um arco (a,b) (no grafo residual) com fluxo não seja igual ao valor de cr, ele pode ser aumentado desde que se obtenha um caminho de aumento do fluxo, entre os nós a e b, no grafo residual.

No exemplo abaixo, este caminho permite obter um fluxo máximo no grafo original.

Cardinalidade - Local e Global

22

1

02

7

2

222

2

1

Page 51: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

51

A garantia de que um algoritmo incremental obtem um fluxo máximo é dada pelo seguinte

Teorema: Um fluxo f entre os nós a e b é máximo sse não existe nenhum caminho de aumento de f entre esses nós.

De uma forma semelhante se pode definir um caminho de redução de fluxo entre os nós a e b, como um caminho no grafo residual entre os nós b e a, como no exemplo

Cardinalidade - Local e Global

221

02

5

2

122

2

1

Page 52: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

52

Complexidade

A procura de um caminho de aumento pode ser obtida através de uma pesquisa em largura com complexidade O(k+d+), em que é o número de arcos entre as variáveis e os valores e d o número de valores totais. Como kd este é o termo assimptoticamente dominante, pelo que a complexidade é limitada por O().

Para se obter um fluxo máximo teremos de obter um máximo de k caminhos de aumento, um para cada arco de saída das k variáveis. A complexidade do método é pois de ordem k O().

Como kd, temos uma complexidade de ordem O(k2d) para obtenção de um fluxo máximo a partir de um fluxo nulo ( e menor a partir de um fluxo não máximo).

Cardinalidade - Local e Global

Page 53: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

53

Para eliminar os arcos que não correspondem a valores possíveis para as variáveis podemos fazer uso do

Teorema: Seja dado um fluxo máximo arbitrário f entre os dois nós, a e b. Entre quaisquer dois nós x e y, o fluxo f(x,y) é igual a qualquer outro f´(x,y) induzido entre esses nós por outro fluxo máximo f’ sse os arcos (x,y) e (y,x) não estiverem incluídos num ciclo com mais de 3 nós no grafo residual (que passem nos nós a e b).

A justificação deste teorema é de que não havendo um ciclo entre os dois nós, não pode haver um caminho de aumento (entre x e y) nem de redução (entre y e x) pelo que o fluxo se deverá manter constante entre os nós x e y, para todos os fluxos máximos (a garantia de serem fluxos máximos é dada pelo facto dos ciclos não passarem por a e b não aumentando nem diminuindo o fluxo entre esses nós).

Cardinalidade - Local e Global

Page 54: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

54

O teorema anterior permite eliminar do grafo todos os arcos com fluxo nulo que não estejam em ciclos.

Dada a equivalência entre fluxo máximo e consistência da restrição gcc, se nenhum fluxo máximo passa por um arco entre um nó valor v e um nó variável x, então em nenhuma atribuição de valores às variáveis consistente com a restrição gcc a variável x pode tomar o valor v.

A filtragem de arcos permitida por este método é exemplificada com o problema inicial.

Cardinalidade - Local e Global

Page 55: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

55

Exemplo: Dado o fluxo máximo, com valor 7, obtem-se o seguinte grafo residual.

Cardinalidade - Local e Global

22

1

02

6

2

22

2

2

7

Page 56: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

56

Neste grafo residual os únicos caminhos com 3 vértices, que não passam por a e b são os indicados. Incluindo (a azul) os arcos com fluxo não nulo, obtemos todos os arcos entre nós valor e nós variáveis que podem pertencer a uma atribuição de valores às variáveis consistente com a restrição gcc/4.

Cardinalidade - Local e Global

22

2

7

2

Page 57: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

57

Com efeito, podemos comparar o grafo obtido após a eliminação dos arcos e aquele que inicialmente tinhamos considerado.

Cardinalidade - Local e Global

2

m (1,2)

F

D

E

A

B

C

G

t (1,2)

n (1,1)

f (0,2)

r (0,2)

Page 58: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

58

Complexidade

A obtenção dos ciclos com mais de 3 nós, corresponde a obter os subgrafos ligados fortemente, o que pode ser feito com um algoritmo de complexidade O(m+n) para um grafo com m nós e n arcos. No caso, m = k+d+1 e n kd+d, donde uma complexidade global O(kd+2d+k+1) O(kd)

Em termos incrementais, por cada valor retirado ao domínio de uma variável, poderá ser necessário recalcular um fluxo máximo complexidade O(k2d) e eliminar os valores inconsistentes complexidade O(kd), com complexidade total

O(k2d+kd) O(k2d).

Cardinalidade - Local e Global

Page 59: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

59

Restrição Global - Flow

Recentemente [BoPA01] foi proposta uma restrição global para modelar e resolver problemas de fluxos de redes que aparecem em várias aplicações, nomeadamente problemas de transportes, comunicações e cadeias de produção.

O objectivo desta restrição global é, tal como as anteriores a de ser integrada num contexto de outras restrições e permitir uma filtragem eficiente de valores que não seria possível obter através da formulação dessa restrição por um conjunto de restrições mais simples.

A sua utilização é descrita para problemas de fluxos máximos, planeamento de produção e escalonamento de pessoal.

Page 60: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

60

Restrição Global - Sequênciação

Em alguns casos pretende-se não só garantir que num conjunto de variáveis cada valor não apareça mais/menos do que um certo número de vezes.

Pretende-se adicionalmente considerar esse conjunto de variáveis como uma sequência, e garantir que para certas sub-sequências o número de vezes que certos valores aparecem seja limitado.

Esta situação é bem exemplificada no problema da sequenciação de carros, em que não apenas se pretende garantir uma restrições de cardinalidade mas igualmente restrições de sequenciação.

Page 61: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

61

Restrição Global - Sequência

Pretendem-se construir 10 carros em sequência numa linha de montagem com diferentes opções (1 a 5), indicadas na tabela. Dadas as condições de montagem da opção i, por cada sequência de ni carros, só podem ser montadas mi opções, como indicado na tabela (p. ex., por cada sequência de 5 carros, só dois podem ter a opção 4 instalada).

opção capacidade 1 2 3 4 5 6 7 8 9 101 1 / 2 X2 2 / 33 1 / 3 X4 2 / 5 X X5 1 / 5

Configuração 1 2 3 4 5 6

carros

X

X

X

X

X

X

XX

Page 62: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

62

Restrição Global - Sequência

Pretende-se pois implementar de forma eficiente uma restrição gsc/7 (global sequencing constraint)

gsc(X, V, Seq, Lo, Up, Min, Max)

A sua semântica é a seguinte:

Dada a sequência de variáveis X, Min e Max representam o número mínimo/máximo de vezes que elas podem tomar valores no conjunto V. Adicionalmente, em cada sequência de Seq variáveis, Lo e Up representam o número mínimo/máximo de vezes que elas podem tomar valores no referido conjunto V.

De notar que em CHIP a restrição gsc/7 tem sintaxe

among([Seq, Lo, Up, Min, Max ], X, _, V).

Page 63: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

63

Restrição Global - Sequência

golo(X):-

X = [X1, .. ,X10], L :: 1..6,

gcc(X, L, [1,1,2,2,2,2], [1,1,2,2,2,2]),

gsc(X, [1,5,6], 2, 1, 1, 5, 5),

gsc(X, [3,4,6], 3, 2, 2, 6, 6),

gsc(X, [1,5] , 3, 1, 1, 3, 3),

gsc(X, [1,2,4], 5, 2, 2, 4, 4),

gsc(X, [3] , 5, 1, 1, 2, 2).

opção capacidade 1 2 3 4 5 6 7 8 9 101 1 / 2 X2 2 / 33 1 / 3 X4 2 / 5 X X5 1 / 5

Configuração 1 2 3 4 5 6

carros

X

X

X

X

X

X

XX

Page 64: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

64

Restrição Global - Sequência

Dada as semelhanças entre as restrições, foi proposta em [RePu97] uma implementação eficiente da restrição de sequênciação gsc/7 a partir da restrição de cardinalidade gcc/4.

A explicação desta implementação pode ser dada através de um exemplo.

Dada a sequência X = [X1 .. X15], com X :: 1..4, pretende-se garantir que os valores [1,2] apareçam entre 8 e 12 vezes e que cada sequência de 7 variáveis contenha entre 4 e 5 vezes esses valores.

gsc(X, [1,2], 7, 4, 5, 8, 12)

Page 65: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

65

gsc(X, [1,2], 7, 4, 5, 8, 12)

Começamos por considerar um novo conjunto de variáveis, Ai, distribuidos em sub-sequências S1, S2 e S3 de 7 elementos (excepto a última). Os valores de um Ak que pertence à sequência Sk é definido da seguinte maneira

Vi [1,2] Ai = v , Vi [1,2] Ai = ak

Como é fácil de ver, não podem existir menos de 2 nem mais de 3 valores a1 e a2 em toda a sequência A, para se garantirem entre 4 e 5 valores [1,2] em S1 e S2 .

Restrição Global - Sequência

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Xi 1 2 1 3 1 2 3 4 2 3 1 1 2 2 4

Ai v v v a1 v v a1 a2 v a2 v v v v a3

Page 66: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

66

gsc(X, [1,2], 7, 4, 5, 8, 12)

gsc(X, V , Seq, Lo, Up, Max, Min)

Na sequência S3 tem de existir pelo menos 0 a3 (pode ser completada à esquerda com suficientes vs) e no máximo 1 a3 para se garantir um número adequado de valores [1,2].

Em geral para sequências de S Seq valores é necessário garantir um número de ak , # ak, entre

maximum(0, minimum(S,Seq)- Up) # ak Seq - Lo

Restrição Global - Sequência

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Xi 1 2 1 3 1 2 3 4 2 3 1 1 2 2 4

Ai v v v a1 v v a1 a2 v a2 v v v v a3

Page 67: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

67

gsc(X, [1,2], 7 , 4, 5, 8, 12)

gsc(X, V , Seq , Lo, Up, Max, Min)

É ainda necessário garantir a existência de entre 8 e 12 vs (isto é, entre Min e Max) na sequência dos Ai.

Todas estas condições são garantidas, com as restrições que mapeiam os Xis nos Ais, e ainda com a restrição de cardinalidade

gsc(A, [v,a1,a2,a3], [8,2,2,0], [12, 3, 3, 1])

Restrição Global - Sequência

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Xi 1 2 1 3 1 2 3 4 2 3 1 1 2 2 4

Ai v v v a1 v v a1 a2 v a2 v v v v a3

Page 68: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

68

Nem todas as sequências de 7 (Seq) elementos foram ainda consideradas. Para esse efeito, teremos de considerar 7 (Seq) restrições gcc, como indicado no seguinte esquema

Restrição Global - Sequência

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Xi 1 2 1 3 1 2 3 4 2 3 1 1 2 2 4

Ai a1 a1 a2 a2 a3

Bi b2 b2 b2 b3 b3

Ci c2 c2 c2 c3 c4

Di d2 d2 d2 d2 d3

Ei e1 e2 e2 e2 e3

Fi f1 f2 f2 f2 f3

Gi g1 f2 f2 f2 f3

Page 69: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

69

A restrição gsc é pois mapeada em 7 restrições gcc

gsc(A, [v,a1,a2,a3], [8,2,2,0], [12,3,3,1])

gsc(B, [v,b1,b2,b3], [8,0,2,2], [12,1,3,3])

gsc(C, [v,c1,c2,c3], [8,0,2,1], [12,2,3,3])

gsc(D, [v,d1,d2,d3], [8,0,2,2], [12,3,3,3])

gsc(E, [v,e1,e2,e3], [8,0,2,0], [12,3,3,3])

gsc(F, [v,f1,f2,f3], [8,0,2,0], [12,3,3,3])

gsc(F, [v,f1,f2,f3], [8,1,2,0], [12,3,3,2])

Restrição Global - Sequência

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Xi 1 2 1 3 1 2 3 4 2 3 1 1 2 2 4

Ai a1 a1 a2 a2 a3

Bi b2 b2 b2 b3 b3

Ci c2 c2 c2 c3 c4

Di d2 d2 d2 d2 d3

Ei e1 e2 e2 e2 e3

Fi f1 f2 f2 f2 f3

Gi g1 f2 f2 f2 f3

Page 70: 1 Restrições Globais Em muitos casos, interessa definir restrições n-árias primitivas, –quer por facilidade de modelação, –quer para explorar algoritmos

70

Restrição Global - Stretch

Recentemente [Pesa01] foi proposta uma restrição global stretch que pretende considerar globalmente situações em que se pretende “esticar” as sequências de valores iguais para variáveis consecutivas.

A sua utilização é descrita para problemas de horários de escalas de pessoal. Por exemplo, garantir que uma enfermeira tenha uma sequência máxima de turnos diurnos, e não uma alternância de turnos diurnos e nocturnos.

Naturalmente, esta restrição global deve ser integrada num contexto de outras restrições e permitir uma filtragem eficiente de valores que não seria possível obter através da formulação dessa restrição por um conjunto de restrições mais simples.