1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| b := -- indice minimal valide
e := -- un de plus que l'indice maximal valide
-- on maintient partout l'invariant b <= Sol < e
bV := T(b)
min := b -- indice qui a eu l'evaluation la plus petite
minV := bV
-- faisont en sorte que e soit le premier indice avec une valeur plus grande
-- que celle evaluee en b
while bb+1 /= e loop
m := (bb+e)/2
mV := T(m)
if mV > bV then
e := m
else
if mV < minV then
minV := mV
min := m
end if
bb := m
bbV := mV
end if
end loop
-- des qu'on a b+1 == e, on a trouve
while b + 1 /= e loop
if minV == bV then
-- on a potentiellement un plateau, parcourons le avec des pas
-- de plus en plus petit jusqu'a trouve un point bas
s := 2
while b + s < e loop
s := 2*s
end loop
while min == b and s /= 1 loop
m := b + s/2
while min == b and m < e loop
mV := T(m)
if mV < minV then
-- on a trouve un point bas, mettons tout a jour en reduisant
-- l'intervalle de recherche au maximum
min := m
minV := T(m)
b := m - s/2
bV := T(b)
if b+s < e then
e = b+s
end if
end if
m := m + s
end loop
s := s/2
end loop
if min == b then
-- on n'a pas trouve de point bas, c'est qu'on a bien un plateau,
-- solution arbitraire: le premier point de l'intervalle trouve
-- (qui n'est pas necessairement le premier point du plateau)
e := b+1
end if
else
pivot := min
pivotV := minV
-- faisons en sorte que b soit le plus grand indice inferieur a pivot
-- avec une evaluation superieur a pivotV
ee := min
while b+1 /= ee loop
m := (b+ee)/2
mV := T(m)
if mV > pivotV then
b := m
bV := mV
else
if mV < minV then
min := m
minV := mV
end if
ee := m
end if
end loop
-- et on peut augmenter b de 1 sans casser l'invariant (et ca assure
-- que l'algo se termine)
b := b+1
bV := T(b)
-- faisont en sorte que e soit le plus petit indice superieur a pivot
-- avec une evaluation superieur a pivotV
bb := pivot
while bb+1 /= e loop
m := (bb+e)/2
mV := T(m)
if mV > pivotV then
e := m
else
if mV < minV then
minV := mV
min := m
end if
bb := m
bbV := mV
end if
end loop
end if
end loop |
Partager