set F := 1..3; set L := 1..4; set Zero := 2..4; param vet_zero{i in Zero}; param li{i in F}; param LK{i in L}; # Para encontrar o mínimo de um conjunto. Eu não consegui fazer de maneira menos "braçal", mas continuo pesquisando! param sig:= min(li[1], li[2], li[3], LK[1], LK[2], LK[3], LK[4]); set K:= 1..3; param t{k in K}; #====== conjunto de índices indexados dependendo dos dados de entrada ================= param n := 7; set V:= 1..n; param s := 4; set R := {1..s}; param r1 {i in V}; set C{r in R} := {i in V : r1[i] = r}; #mostrando o conteúdo dos conjuntos C[1]...C[3] na tela ao lado para simples conferência display(C[1]); display(C[2]); display(C[3]); #minimize fo : sum{j in K} t[j]; var sig1; # ==== Conjunto de sets indexados mais simples. A atribuição dos respectivos elementos é feita em data; set AREA{F}; display(vet_zero[1]); display AREA[1]; display AREA[2]; display AREA[3]; # Para mostrar o conteúdo de cada set. Observe que o conjunto AREA depende do seu índice 1, 2 e 3. set A within F cross F; var x{(i, j) in A}, >= 0; st{f in F}: sum{(i,j) in A : i in AREA[f]} x[i, j] <= 1; #Para cada área, temos o somatório dos arcos que saem daquela área, e este somatório deve ser menor ou igual a 1 . solve; printf "\n sigma = %d \n\n", sig; set S:= 1..3; set F1:= 1..4; set N:= 1..2; # cada conjunto indexado A[1],..A[3] terá como elementos pares ordenados contidos no produto cartesiano de F x N = {(1, 1), (1, 2), (2, 1), (2, 2), (3, 1), (3, 2), (4, 1), (4, 2)} set A1{S} within F1 cross N; #para visualizar os conjuntos indexados display A1[1]; display A1[2]; display A1[3]; data; set A1[1] := 3 2, 1 2; set A1[2] := 1 1, 4 2; set A1[3] := 2 1, 3 1; set AREA[1] := 3 4; set AREA[2] := 1 6; set AREA[3] := 2 19; #Dados de entrada de cada área param vet_zero := #0 -10 #1 -2 2 -3 3 -4; param r1:= # vetor utilizado para 1 1 2 1 3 2 4 2 5 3 6 3 7 3; param li := 1 7 2 9 3 5; param LK := 1 17 2 9 3 5 4 11; set A := 1 2 1 3 2 1 2 3 3 1 3 2; # Entrada dos pares ordenados que compõem o conjunto A end;