Přeskočit na obsah
coden

Lokální hledání a simulované žíhání: obchodní cestující přes krajská města

Optimalizační úloha, problém obchodního cestujícího, horolezec s okolím 2-opt, lokální minima a restarty, simulované žíhání, teplota a rozvrh chlazení — na trase přes třináct krajských měst se známým optimem.

13 minut Matěj Žalmánek 2026-10-15

Série Základy AI Díl 26 z 83
  1. Mapa umělé inteligence: co je co a jak to do sebe zapadá
  2. Stručná historie umělé inteligence: od Turinga po jazykové modely
  3. Data, model, trénink, inference: základní pojmy na jednom příkladu
  4. Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
  5. Množiny a relace: stavebnice, ze které se skládají definice v AI
  6. Funkce a zobrazení: proč je každý model v AI funkce
  7. Logika a důkazy: pravidla, podle kterých se v AI uvažuje
  8. Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
  9. Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
  10. Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
  11. Gradientní sestup: jak se model učí
  12. Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
  13. Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
  14. Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
  15. Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
  16. Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
  17. Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
  18. Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
  19. Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
  20. Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
  21. Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
  22. Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
  23. Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
  24. Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
  25. Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
  26. Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
  27. Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
  28. Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
  29. Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
  30. Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
  31. Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
  32. Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
  33. Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
  34. Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
  35. Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
  36. Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
  37. Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
  38. Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
  39. Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
  40. Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
  41. Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
  42. Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
  43. Přeučení a regularizace: proč model, který zná data nazpaměť, selže
  44. Vyhodnocení modelu: křížová validace, F1 a křivka ROC
  45. Shlukování a snížení dimenze: k-means, PCA a t-SNE
  46. Klasifikace a regrese: dvě úlohy učení s učitelem
  47. Lineární regrese: nejmenší čtverce geometricky i maticově
  48. Polynomiální a nelineární regrese: jak přímku ohnout
  49. Logistická regrese: sigmoida, šance a křížová entropie
  50. Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
  51. Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
  52. Ztrátové funkce: co přesně model minimalizuje
  53. Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
  54. Ansámbly: náhodný les a gradient boosting
  55. SVM a jádrový trik: nejširší hranice a jak ji ohnout
  56. Signál a vzorkování: proč platí Nyquistův teorém
  57. Fourierova transformace: rozklad signálu na frekvence
  58. Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
  59. Zvuk a řeč: spektrogram, melová škála a MFCC
  60. Obraz jako signál: pixely, barvy, konvoluce a hrany
  61. Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
  62. Neuronová síť od nuly: zpětné šíření chyby krok za krokem
  63. Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
  64. Konvoluční sítě: jak síť poznává obrázky
  65. Rekurentní sítě: paměť pro posloupnosti a mizející gradient
  66. LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
  67. Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
  68. Embeddingy a word2vec: jak se slovo stane vektorem
  69. Mechanismus pozornosti: jak se model naučí, kam se dívat
  70. Transformery a velké jazykové modely: architektura krok za krokem
  71. Tokenizace: jak se text rozseká na kousky pro model
  72. Předtrénování a škálování: proč větší model a víc dat funguje
  73. Doladění a RLHF: jak se z doplňovače textu stane asistent
  74. Prompty, kontext a RAG: jak modelu dát správné informace
  75. Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
  76. Generativní adversariální sítě (GAN): padělatel proti detektivovi
  77. Difúzní modely: jak se z čistého šumu stane obrázek
  78. Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
  79. Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
  80. Policy gradient a PPO: učení přímo strategie
  81. Jak funguje AI agent: jazykový model ve smyčce s nástroji
  82. Programování s AI agenty: zadání, testy a kontrola
  83. Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat

Celá osnova série 83 z 83 témat hotovo

Co si odnesete
  • Proč horolezec uvízne v lokálním minimu a kdy pomohou náhodné restarty.
  • Jak simulované žíhání přijímá horší kroky a proč na teplotě a rozvrhu chlazení tolik záleží.
  • Kde stejná myšlenka žije dnes — od návrhu čipů po teplotu jazykových modelů.

Co se hodí znát předem: Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi

Kovář, který chce pevnou čepel, nenechá rozžhavený kov prudce vychladnout — ochlazuje ho pomalu. Atomy tak mají čas najít pravidelné uspořádání s nejnižší energií. Kdyby kov zchladil naráz, atomy by zamrzly tam, kde zrovna byly, a čepel by byla křehká. V roce 1983 si fyzici všimli, že přesně tohle trápí i algoritmy, které hledají nejlepší řešení: když jdou jen „z kopce“, zamrznou v prvním dolíku. Tak vzniklo simulované žíhání — a s ním jedna z nejužitečnějších myšlenek optimalizace.

Tímhle dílem začíná modul o algoritmech inspirovaných přírodou. Navazuje na díl Prohledávání stavového prostoru, kde se horolezec a žíhání objevili poprvé.

1. Optimalizační úloha

Definice — optimalizační úloha a okolí

Nechť S je neprázdná množina, jejíž prvky nazýváme přípustná řešení, a f : S → ℝ je funkce, kterou nazýváme účelová funkce. Optimalizační (minimalizační) úloha (S, f) je úloha najít prvek s* ∈ S, pro který platí

∀ s ∈ S : f(s*) ≤ f(s),   tj.   s* ∈ argmins ∈ S f(s) = {s ∈ S : ∀ s′ ∈ S : f(s) ≤ f(s′)}.

Takový prvek s* nazýváme globální minimum. Je-li S konečná, globální minimum existuje (může jich být i víc). U maximalizační úlohy se nerovnosti obrátí; maximalizovat f je totéž jako minimalizovat −f.

Označme 2S množinu všech podmnožin S. Okolí je zobrazení N : S → 2S, které každému řešení s ∈ S přiřadí množinu N(s) ⊆ S jeho sousedů; v praxi jsou to řešení, která ze s vzniknou jednou malou změnou předepsaného typu. Řešení s ∈ S je lokální minimum vzhledem k okolí N, právě když

∀ s′ ∈ N(s) : f(s) ≤ f(s′).

Globální minimum je tedy řešení, které nemá lepší řešení nikde v S, kdežto lokální minimum jen takové, které nemá lepší řešení mezi svými sousedy. Každé globální minimum je i lokální, naopak to neplatí.

Laicky řečeno

Na rozdíl od bludiště nás nezajímá cesta k řešení, ale řešení samo: nejkratší trasa, nejlepší rozvrh, nejlevnější rozmístění. Účelová funkce řekne, jak dobré řešení je. Okolí říká, co jsou „drobné úpravy“ — a lokální minimum je řešení, které žádnou drobnou úpravou zlepšit nejde, i když opodál může být mnohem lepší.

2. Problém obchodního cestujícího

Obchodní cestující má objet všech třináct krajských měst Česka, v každém být jednou a vrátit se, odkud vyjel. Kterou trasou ujede nejméně? Vzdálenosti počítáme vzdušnou čarou.

Definice — problém obchodního cestujícího (TSP)

Nechť n ≥ 3 je počet měst, města jsou očíslována 1, …, n, a nechť d : {1, …, n} × {1, …, n} → ℝ je funkce vzdáleností, kde d(i, j) ≥ 0 je vzdálenost města i od města j. V tomto díle je d navíc symetrická: d(i, j) = d(j, i) pro všechna i, j.

Přípustné řešení (okruh) je permutace π = (π1, …, πn) množiny {1, …, n} — pořadí, ve kterém města projedeme, a z posledního se vrátíme do prvního. Účelová funkce je délka okruhu

f(π) = ∑k=1n d(πk, πk+1),   kde πn+1 = π1.

Problém obchodního cestujícího je optimalizační úloha najít permutaci π s nejmenší délkou f(π).

Permutace, které se liší jen tím, ve kterém městě začínají (cyklickým posunutím), nebo směrem průjezdu, mají stejnou délku a popisují tentýž okruh. Různých okruhů je proto n!/2n = (n − 1)!/2 (rozbor níže). Rozhodovací verze úlohy („existuje okruh délky nejvýš L?“) je NP-úplná.

Laicky řečeno

Pro 13 měst je možných tras 239 500 800. Pro dvacet už přes 60 biliard. Zkoušet je všechny nejde a nikdo nezná algoritmus, který by obecně našel nejkratší trasu výrazně rychleji než exponenciálně.

počet okruhů = n!/n · 2 = (n − 1)!/2

n!
všechna pořadí, ve kterých lze n měst vypsat — tolik je permutací; každý okruh je ale mezi nimi započítaný víckrát
n
okruh nemá začátek: Praha → Brno → … → Praha je tatáž cesta jako Brno → … → Praha → Brno. Každý okruh lze začít v kterémkoli z n měst, proto n-krát méně
2
vzdálenost tam je stejná jako zpět, takže okruh projetý obráceně je tatáž cesta stejné délky
Pro 13 měst: 13!/13 · 2 = 12!/2 = 479 001 600/2 = 239 500 800.
Příklad — vzdálenost vzdušnou čarou z Prahy do Brna

Města máme dána zeměpisnou šířkou φ a délkou λ ve stupních. Na území Česka stačí rovinná přibližná projekce: stupeň šířky má 110,57 km, stupeň délky 111,32 · cos φ0 km, kde φ0 = 49,8° je střed republiky (poledníky se k pólu sbíhají). Pak

d(i, j) = √(71,85 · Δλ)2 + (110,57 · Δφ)2.

Praha (50,08° s. š., 14,42° v. d.), Brno (49,20°, 16,61°)

Δλ = 2,19° → 71,85 · 2,19 = 157,35 km na východ

Δφ = −0,88° → 110,57 · 0,88 = 97,30 km na jih

d = √157,352 + 97,302 = √24 759 + 9 467 = √34 226 ≈ 185,0 km

Chyba proti přesnému výpočtu na kouli je u takových vzdáleností kolem 1 %; pro porovnávání tras to nevadí.

Třináct měst je ještě dost málo na to, abychom optimum spočítali přesně — Heldovým–Karpovým dynamickým programováním přes podmnožiny měst, které trvá 2n · n2 kroků místo (n − 1)!. Nejkratší okruh měří 1 060,4 km. Díky tomu u každého dalšího algoritmu přesně uvidíme, jak blízko se k optimu dostal:

Algoritmus — Heldovo–Karpovo dynamické programování (1962)

Vstup: počet měst n ≥ 3, města očíslovaná 0, …, n − 1, a vzdálenosti d : {0, …, n − 1}2 → ℝ, d ≥ 0. Výstup: délka nejkratšího okruhu (problém obchodního cestujícího výše); okruh sám se zjistí zpětným sledováním, ve kterém k se minimum nabylo.

Okruh nemá začátek, proto bez újmy na obecnosti začíná v městě 0. Pro každou množinu měst M ⊆ {0, …, n − 1} s 0 ∈ M a každé město j ∈ M označme D(M, j) délku nejkratší cesty, která vyjede z města 0, projede každé město z M právě jednou, žádné jiné, a skončí v j. Pro M ≠ {0} klademe D(M, 0) = ∞ (cesta se do 0 nesmí vrátit předčasně).

  1. Polož D({0}, 0) = 0.
  2. Pro m = 2, …, n postupně: pro každou M ∋ 0 s |M| = m a každé j ∈ M ∖ {0} spočítej D(M, j) = mink ∈ M ∖ {j} [ D(M ∖ {j}, k) + d(k, j) ]. Všechny hodnoty vpravo mají množinu o prvek menší, takže už jsou spočítané.
  3. Po dokončení m = n skonči a vrať minj ∈ {1, …, n − 1} [ D({0, …, n − 1}, j) + d(j, 0) ].

Algoritmus tedy vždy skončí po konečném počtu kroků: hodnot D je nejvýš 2n · n a každá je minimum z nejvýš n čísel.

n = 13:   213 · 132 = 8 192 · 169 = 1 384 448 kroků

projít všechna pořadí z pevného startu: 12! = 479 001 600 — asi 346krát víc

Laicky řečeno

Na tom, jak jste projeli Plzeň, Karlovy Vary a Ústí, nezáleží pro zbytek cesty nic kromě dvou věcí: která města už máte za sebou a kde právě stojíte. Stačí si tedy pro každou takovou dvojici pamatovat nejkratší cestu, ne všechna pořadí. Pro 13 měst je to rychlé, ale 2n pořád roste exponenciálně — pro 60 měst by tabulka měla přes 1019 řádků.

0100200300 050100150 západ → východ (km) jih → sever (km) 1 060,4 km Praha Brno Ostrava Plzeň Liberec Olomouc Ústí nad Labem Hradec Králové České Budějovice Pardubice Zlín Jihlava Karlovy Vary
Nejkratší okruh přes krajská města (vzdušnou čarou)

3. Horolezec a okolí 2-opt

Definice — tah 2-opt

Nechť n ≥ 4, d je symetrická vzdálenost z definice TSP a c = (c0, c1, …, cn−1) je okruh přes n měst (po cn−1 následuje znovu c0). Nechť i, j jsou indexy, 1 ≤ i < j ≤ n − 1. Tah 2-opt (i, j) přiřadí okruhu c okruh

c′ = (c0, …, ci−1, cj, cj−1, …, ci, cj+1, …, cn−1),

tj. obrátí pořadí úseku ci, …, cj. Označme a = ci−1, b = ci, e = cj a f = c(j+1) mod n (zde f značí město, ne účelovou funkci). Tah z okruhu odebere hrany (a, b) a (e, f) a přidá hrany (a, e) a (b, f); ostatní hrany zůstanou, jen úsek mezi b a e se projede obráceně. Délka okruhu se proto změní o

Δ = délka(c′) − délka(c) = d(a, e) + d(b, f) − d(a, b) − d(e, f).

Okolí 2-opt N(c) je množina všech okruhů, které z c vzniknou jedním tahem (i, j); dvojic (i, j) je (n − 1)(n − 2)/2.

Laicky řečeno

Kde se trasa kříží sama se sebou, je skoro jistě zbytečně dlouhá. Tah 2-opt kříž rozplete: přestřihne trasu na dvou místech a jeden kus otočí. Změnu délky spočítáte ze čtyř vzdáleností, celou trasu přepočítávat nemusíte.

Δ = d(a, e) + d(b, f) − (d(a, b) + d(e, f))

Δ
o kolik se okruh prodlouží; záporné Δ znamená zkrácení. Podle znaménka se horolezec i žíhání rozhodují, proto ho potřebujeme levně
d(a, e) + d(b, f)
dvě nové hrany, kterými přestřižené konce znovu spojíme — přičítají se, protože o ně trasa přibude
d(a, b) + d(e, f)
dvě hrany, které jsme přestřihli — odečítají se, protože z trasy zmizí. Úsek mezi b a e jen projedeme obráceně a vzdálenosti jsou symetrické, takže se jeho délka nezmění a ve vzorci chybí
Proto stačí čtyři vzdálenosti místo třinácti: všechno ostatní na trase zůstane.
Algoritmus — horolezec (nejstrmější sestup)

Vstup: optimalizační úloha (S, f) s konečnou množinou S, okolí N : S → 2S s neprázdnými množinami N(s) a počáteční (náhodné) řešení s0 ∈ S. Výstup: lokální minimum s ∈ S vzhledem k N.

  1. Polož s ← s0.
  2. Najdi nejlepšího souseda s′ ∈ argmint ∈ N(s) f(t) (při shodě libovolného z nich).
  3. Je-li f(s′) < f(s), polož s ← s′ a pokračuj krokem 2.
  4. Jinak (f(s′) ≥ f(s)) skonči a vrať s.

Podmínka zastavení je v kroku 4: žádný soused není ostře lepší, tedy f(s) ≤ f(t) pro všechna t ∈ N(s) a s je lokální minimum. Protože f(s) v každém přechodu ostře klesne, žádné řešení se nezopakuje, a na konečné S proto algoritmus vždy skončí.

Laicky řečeno

Vyzkoušíte všechna rozpletení, vyberete to, které trasu zkrátí nejvíc, a opakujete. Když už žádné nepomůže, skončíte. Pro třináct měst je to 66 tahů na krok.

def delta(c, i, j):                    # tah 2-opt: obrať c[i..j]
    a, b = c[i - 1], c[i]
    e, f = c[j], c[(j + 1) % len(c)]
    return d(a, e) + d(b, f) - d(a, b) - d(e, f)

def horolezec(c):
    n = len(c)
    while True:
        tahy = [(i, j) for i in range(1, n - 1) for j in range(i + 1, n)]
        i, j = min(tahy, key=lambda t: delta(c, *t))   # nejstrmější sestup
        if delta(c, i, j) >= 0:                        # nic trasu nezkrátí
            return c                                    # lokální minimum
        c = c[:i] + c[i:j + 1][::-1] + c[j + 1:]

První město necháváme na místě (i ≥ 1) — okruh nemá začátek, takže by to nic nového nepřineslo. Pro n = 13 dávají dvojice 1 ≤ i < j ≤ 12 právě 12 · 11/2 = 66 tahů.

Z náhodného okruhu dlouhého 2 402 km dojde horolezec za 8 kroků na 1 065,8 km — a tam se zastaví. Do optima chybí jen 5 km, ale žádný jednotlivý tah 2-opt už trasu nezkrátí. Horolezec je v lokálním minimu a neví o tom:

0100200300 050100150 západ → východ (km) jih → sever (km) 1 065,8 km Praha Brno Ostrava Plzeň Liberec Olomouc Ústí nad Labem Hradec Králové České Budějovice Pardubice Zlín Jihlava Karlovy Vary
Kde uvízl horolezec; přerušovaně oranžově optimum

4. Kde horolezec uvízne

Ze sta náhodných startů skončil horolezec v optimu 61krát. Ve zbylých 39 případech uvízl jinde, v nejhorším na 1 162,6 km — o sto kilometrů dál. Pasti jsou tři:

  • Lokální minimum — dolík, ze kterého vede každý krok nahoru.
  • Plošina — všichni sousedé jsou stejně dobří, takže horolezec neví, kam jít.
  • Hřbet — dobrý směr existuje, ale nevede po žádném jednotlivém tahu; jde se k němu jen přes horší řešení.
Příklad — proč horolezec z 1 065,8 km nevyjde

Horolezec z prvního startu skončil na okruhu Zlín → Ostrava → Olomouc → Pardubice → Hradec Králové → Liberec → Ústí nad Labem → Karlovy Vary → Plzeň → Praha → České Budějovice → Jihlava → Brno → Zlín. Spočítáme Δ všech 66 tahů 2-opt: jeden z nich (obrácení všeho kromě prvního města) dá tentýž okruh opačným směrem a Δ = 0, všechny ostatní trasu prodlouží. Nejlevnější z nich obrátí dvojici Pardubice – Hradec Králové:

a = Olomouc, b = Pardubice, e = Hradec Králové, f = Liberec

Δ = d(a, e) + d(b, f) − (d(a, b) + d(e, f))

  = 122,9 + 95,9 − (116,8 + 83,0) = +19,0 km

(Barvy podle rozboru tahu 2-opt výše.)

Každý jednotlivý tah tedy trasu prodlouží nejméně o 19,0 km — přitom optimum je o pouhých 5,4 km kratší. Cesta k němu vede přes horší okruhy, a ty horolezec nikdy nepřijme.

Nejjednodušší lék jsou náhodné restarty: pustit horolezce znovu z jiného místa a nechat si nejlepší výsledek. Uspěje-li jeden start s pravděpodobností 0,61, pak z pěti startů aspoň jeden uspěje s pravděpodobností P5 = 1 − 0,395 ≈ 99 % (barvy podle vzorce níže). U malé úlohy to stačí. U velké jsou dolíků miliony a restartů by bylo potřeba příliš mnoho.

Pr = 1 − (1 − p)r

Pr
pravděpodobnost, že aspoň jeden z r startů najde optimum — počítáme ji přes doplněk, protože „aspoň jeden“ má mnoho podob, kdežto „ani jeden“ jen jednu
1 − p
pravděpodobnost, že jeden start selže (u nás 0,39 ze sta pokusů)
r
počet startů v exponentu: starty jsou nezávislé (každý má jiné náhodné semínko), takže pravděpodobnosti selhání se násobí
Kolik startů pro Pr ≥ 99,9 %? Z 0,39r ≤ 0,001 plyne r ≥ ln 0,001/ln 0,39 = 7,34, tedy 8 startů.

5. Simulované žíhání

Algoritmus — simulované žíhání

Vstup: optimalizační úloha (S, f), okolí N : S → 2S s neprázdnými konečnými množinami N(s), počáteční (náhodné) řešení s0 ∈ S, počáteční teplota T0 > 0, koeficient chlazení α ∈ (0, 1) a počet iterací K ∈ ℕ. Výstup: nejlepší řešení snej ∈ S, které algoritmus během běhu navštívil.

  1. Polož s ← s0, snej ← s0, T ← T0.
  2. Pro k = 1, …, K opakuj:
    1. vyber náhodně (rovnoměrně) souseda s′ ∈ N(s) a spočítej Δ = f(s′) − f(s);
    2. je-li Δ ≤ 0, polož s ← s′; jinak vylosuj u rovnoměrně z [0, 1) a je-li u < exp(−Δ/T), polož s ← s′ (Metropolisovo kritérium: horší soused se přijme s pravděpodobností exp(−Δ/T));
    3. je-li f(s) < f(snej), polož snej ← s;
    4. sniž teplotu podle rozvrhu chlazení, zde geometrického: T ← α · T.
  3. Po K iteracích skonči a vrať snej.

Algoritmus se tedy zastaví vždy po předem daném počtu K iterací; jiné rozvrhy chlazení než geometrický viz oddíl o teplotě.

Laicky řečeno

Horolezec, který si občas dovolí krok špatným směrem. Na začátku, dokud je „horko“, takových kroků udělá hodně — přeskakuje z dolíku do dolíku a rozhlíží se po celé krajině. Jak chladne, je čím dál opatrnější, a na konci už jen sestupuje do toho nejhlubšího údolí, které po cestě našel. Malé zhoršení přijme snáz než velké.

P(přijmout) = min(1, exp(−Δ/T))

P(přijmout)
s jakou pravděpodobností přejdeme do navrženého souseda; v programu losujeme u rovnoměrně z [0, 1) a tah přijmeme, když u < P
min(1, …)
pro zlepšení (Δ ≤ 0) je exponenciála ≥ 1 a pravděpodobnost nesmí přesáhnout 1 — lepší krok se tedy přijme vždy, stejně jako u horolezce
Δ
o kolik je soused horší, v km. Stojí v exponentu se záporným znaménkem, takže každý další kilometr zhoršení šanci vynásobí stejným číslem menším než 1 — velká zhoršení jsou exponenciálně vzácnější než malá
T
teplota, ve stejných jednotkách jako Δ (km). Dělí Δ, a tím určuje měřítko: zhoršení o T km projde s pravděpodobností exp(−1) = 1/e ≈ 0,37 při jakékoli teplotě. Vysoké T dělá velká zhoršení „malými“, T → 0 zakáže všechna
Rozhoduje jen poměr Δ/T: jak velké je zhoršení ve srovnání s aktuální teplotou.

Pravidlo pro přijetí horšího kroku pochází z fyziky: v roce 1953 ho Nicholas Metropolis a jeho kolegové použili k simulaci atomů v tepelné rovnováze, kde pravděpodobnost stavu s energií E je úměrná exp(−E/kT). Pro optimalizaci ho v roce 1983 nezávisle přizpůsobili Kirkpatrick, Gelatt a Vecchi z IBM — a dva roky nato, rovněž nezávisle, slovenský fyzik Vladimír Černý, právě na problému obchodního cestujícího.

import math, random

def zihani(c, T0=200, Tk=0.5, K=10_000):
    alfa = (Tk / T0) ** (1 / K)          # geometrické chlazení
    T, delka = T0, delka_okruhu(c)
    nej, nej_delka = c, delka
    for k in range(K):
        i, j = sorted(random.randint(1, len(c) - 1) for _ in range(2))
        if i != j:                          # i = j: žádný tah
            D = delta(c, i, j)
            if D <= 0 or random.random() < math.exp(-D / T):
                c = c[:i] + c[i:j + 1][::-1] + c[j + 1:]
                delka += D
                if delka < nej_delka:
                    nej, nej_delka = c, delka
        T *= alfa
    return nej

Jak to vypadá doopravdy: prvních šest iterací našeho běhu a šest iterací z jeho poloviny. p je pravděpodobnost přijetí min(1, exp(−Δ/T)), u vylosované číslo; zhoršující tah projde, když u < p. Sloupce T, Δ a p mají barvy podle vzorce výše.

kTΔ (km)puPřijatDélka (km)
1200,0−310,01,000—ano1 941,4
2199,9+26,50,8760,293ano1 967,9
3199,8−49,21,000—ano1 918,7
4199,6−111,21,000—ano1 807,5
5199,5+146,60,4800,144ano1 954,1
6199,4−127,81,000—ano1 826,3
500110,0+147,34,0 · 10−70,065ne1 060,4
500210,0+86,21,8 · 10−40,838ne1 060,4
500310,0— (i = j)——ne1 060,4
500410,0+73,06,6 · 10−40,660ne1 060,4
500510,0+82,42,6 · 10−40,747ne1 060,4
500610,0+212,15,8 · 10−100,262ne1 060,4

Na začátku, při T ≈ 200, projde i tah, který trasu prodlouží o 146,6 km — šance je 0,48 a padlo u = 0,14. V polovině běhu je T = 10 a trasa už leží v optimu; tahy, které by ji prodloužily o 70 a víc kilometrů, mají šanci pod jedno promile a všechny jsou zamítnuty. Někdy se obě náhodná čísla trefí do téhož místa (i = j) a iterace nenavrhne nic — v celém běhu se to stalo 824krát.

Věta — Boltzmannovo rozdělení (dnešní formulace)

Nechť S je konečná množina řešení, f : S → ℝ účelová funkce, N okolí a T > 0 pevná teplota. Nechť souseda navrhujeme s pravděpodobnostmi q(s, s′) ≥ 0 (q(s, s′) > 0 jen pro s′ ∈ N(s), ∑s′ q(s, s′) = 1), které jsou symetrické:

∀ s, s′ ∈ S : q(s, s′) = q(s′, s)

(u 2-opt to platí, protože každou dvojici (i, j) losujeme se stejnou pravděpodobností a týž tah (i, j) vede i zpět). Navržený soused se přijme s pravděpodobností min(1, exp(−f(s′) − f(s)/T)). Pak je tento Metropolisův proces Markovův řetězec na S a rozdělení

πT(s) = exp(−f(s)/T)/Z(T),   Z(T) = ∑t ∈ S exp(−f(t)/T),

πT(s)
jak často se po dlouhém bloudění při teplotě T ocitneme v řešení s
exp(−f(s)/T)
váha řešení: čím kratší trasa f(s), tím větší. Je to přesně ta váha, kterou Metropolisovo kritérium vyvažuje — poměr vah dvou sousedů je exp(−Δ/T)
Z(T)
součet vah přes všechna řešení; dělíme jím, aby pravděpodobnosti dávaly dohromady 1

je jeho stacionární rozdělení: když je řetězec v rozdělení πT, zůstane v něm i po dalším kroku. Lze-li se navíc přes sousedy dostat z každého řešení do každého, je stacionární rozdělení jediné.

Důkaz (podmínka detailní rovnováhy). Nechť s ≠ s′ a f(s′) = f(s) + Δ s Δ ≥ 0 (jinak s a s′ prohodíme). Tok pravděpodobnosti ze s do s′ je π(s) · q(s, s′) · exp(−Δ/T) a tok zpět π(s′) · q(s′, s) · 1. Pro π = πT a symetrické q jsou oba výrazy rovny q(s, s′) · exp(−f(s′)/T)/Z(T). Toky mezi každou dvojicí řešení se vyrovnají, takže sečtením přes všechna s dostaneme, že pravděpodobnost každého s′ se krokem nezmění. ∎

optimum (1 060,4 km) proti pasti horolezce (1 065,8 km), poměr četností:

πT(optimum)/πT(past) = exp(5,38/T)

T = 100: 1,06   T = 10: 1,71   T = 1: 217   T = 0,5: 47 089

Laicky řečeno

Při vysoké teplotě je žíhání skoro stejně často v optimu jako v pasti o pět kilometrů delší — nerozliší je. Jak teplota klesá, přesouvá se váha na kratší trasy: při T = 1 je optimum dvěstěkrát častější, při 0,5 skoro padesátitisíckrát. Chlazení tedy postupně „zostřuje“ rozdělení, až zbude jen nejhlubší údolí. Háček je v tom, že rovnováhu dosáhne jen řetězec, který má na bloudění dost času — odtud pomalé chlazení.

6. Teplota a rozvrh chlazení

Jak velkou šanci má krok, který trasu prodlouží o Δ = 20 km? Záleží na teplotě (barvy podle vzorce pro P(přijmout) v předchozím oddílu):

Teplota T200501020,5
exp(−20/T)0,9050,6700,1350,000 05≈ 4 · 10−18

Při 200 projde skoro každý zhoršující krok, při 0,5 žádný — žíhání se v tu chvíli chová jako horolezec. Rozvrh chlazení určuje, jak dlouho algoritmus „bloudí“ a jak dlouho „sestupuje“. Nejlevnější únik z pasti horolezce (Δ = +19,0 km, viz výše) by při T = 50 prošel s pravděpodobností 0,68, při T = 10 s 0,15 a při T = 2 prakticky nikdy.

Tk = T0 · αk,   α = (TK/T0)1/K

Tk
teplota v k-té iteraci — určuje, jak velká zhoršení se v tu chvíli ještě přijímají
T0
počáteční teplota; volí se tak, aby na začátku prošla většina zhoršení — u nás 200 km, víc než typický tah 2-opt na náhodné trase
α
koeficient chlazení těsně pod 1; počítáme ho z cílové teploty TK a počtu iterací K, aby běh skončil přesně tam, kde chceme
k
číslo iterace v exponentu: každá iterace teplotu vynásobí stejným číslem, takže za stejný počet iterací klesne teplota vždy stejným poměrem — od 200 k 100 stejně dlouho jako od 1 k 0,5

α = (0,5/200)1/10 000 = 0,00250,0001 = 0,999401

teplota se zpolovičí každých ln 0,5/ln α ≈ 1 157 iterací

T1 000 = 109,9,   T3 000 = 33,1,   T5 000 = √200 · 0,5 = 10,0

(barvy podle vzorce výše; v polovině běhu je teplota geometrickým průměrem počáteční a koncové)

Věta — konvergence žíhání

Nechť S je konečná množina řešení, f : S → ℝ účelová funkce a N okolí, které je symetrické (s′ ∈ N(s) ⇔ s ∈ N(s′)) a souvislé (z každého řešení se lze přes sousedy dostat do každého). Nechť S* ⊆ S je množina globálních minim a sk řešení žíhání po k-té iteraci. Pro lokální minimum s ∉ S* definujme jeho hloubku

h(s) = min { maxl = 0, …, m f(tl) − f(s) : t0 = s, tl+1 ∈ N(tl), f(tm) < f(s) },

tj. o kolik nejméně musí cesta po sousedech ze s stoupnout, než dojde do ostře lepšího řešení, a nechť d* = max h(s) přes všechna lokální minima s ∉ S* (není-li žádné, d* = 0). Nechť teplota klesá logaritmicky:

Tk = c/ln(k + 1),   k = 1, 2, …,   c > 0.

Pak P(sk ∈ S*) → 1 pro k → ∞, právě když c ≥ d* (Hajek, 1988).

Slovy: chladí-li se dost pomalu, skončí žíhání s pravděpodobností blízkou jedné v globálním minimu, a „dost pomalu“ je určeno nejhlubší pastí, ze které musí algoritmus umět vylézt.

kdyby stačilo c = 20 km, teplotu 0,5 bychom měli až při ln(k + 1) = 20/0,5 = 40,

tedy po k ≈ e40 ≈ 2,4 · 1017 iteracích — zhruba miliardkrát víc, než je všech 239 500 800 okruhů

Laicky řečeno

Když budete chladit nekonečně pomalu, najdete optimum jistě. Jenže logaritmické chlazení je tak pomalé, že by trvalo déle než prohledat všechno. V praxi se proto chladí geometricky — rychle, bez záruky, ale s výsledky, které obvykle stačí.

7. Žíhání na krajských městech

Pusťme žíhání na stejnou úlohu: 10 000 iterací, teplota klesá geometricky z 200 na 0,5. Mapa ukazuje, jak vypadala trasa na začátku a po 1 000, 3 000, 5 000 a 10 000 iteracích:

0100200300 050100150 západ → východ (km) jih → sever (km) náhodný začátek · 2 251,4 km iterace 1000 · 1 985,3 km iterace 3000 · 1 159,2 km iterace 5000 · 1 060,4 km iterace 10000 · 1 060,4 km Praha Brno Ostrava Plzeň Liberec Olomouc Ústí nad Labem Hradec Králové České Budějovice Pardubice Zlín Jihlava Karlovy Vary
Jeden běh žíhání: trasa v průběhu chladnutí

Po tisíci iteracích je trasa pořád chaotická (1 985 km) — při vysoké teplotě žíhání přijímá skoro všechno. Po třech tisících už má tvar (1 159 km) a po pěti tisících je v optimu, 1 060,4 km. Z 1 498 přijatých tahů bylo 695 zhoršujících; horolezec by neudělal ani jeden z nich. Graf ukazuje, jak délka trasy skáče nahoru i dolů, dokud teplota neklesne:

120016002000 0100200 02 5005 0007 50010 000 iterace (počet navržených tahů) délka trasy (km) teplota T (km)
Průběh žíhání aktuální trasa nejlepší dosud teplota (vpravo)

Přechod od bloudění k sestupu je vidět i na počtu přijatých tahů v jednotlivých tisícovkách iterací: 597, 411, 232, 104, 35, 35, 26, 21, 26, 11. V první tisícovce, kdy je T mezi 200 a 110, se přijme víc než polovina návrhů. Od páté tisícovky (T pod 20) už jen desítky; zhoršujících mezi nimi bylo 37, z toho 26 drobných, pod 3 km.

A není to náhoda jednoho běhu: ze sta běhů s různými semínky skončilo v optimu 98 a zbylé dva o necelé 3 km vedle. Proti 61 % horolezce z jednoho startu je to velký rozdíl.

8. Kdy se žíhání vyplatí

Férově vzato: žíhání dělalo 10 000 iterací, horolezec z jednoho startu jen asi šest set vyhodnocení. Na malé úloze by horolezec s restarty za stejnou cenu dopadl stejně. Rozdíl se ukáže na větší úloze. Vezměme 60 náhodně rozmístěných měst a oběma algoritmům dejme stejný rozpočet — 200 000 vyhodnocených tahů 2-opt:

AlgoritmusDélka nejlepší trasy
Horolezec s náhodnými restarty2 312,5 km
Simulované žíhání (tři běhy)2 209,8 – 2 269,8 km

Horolezec se do rozpočtu vešel jen dvakrát: s 60 městy má okolí 1 711 tahů a nejstrmější sestup je všechny prohlédne v každém kroku. Žíhání zkouší po jednom náhodném tahu a stejný rozpočet rozprostře do průzkumu celé krajiny. Každý z jeho tří běhů skončil lépe než horolezec.

9. Žíhání v umělé inteligenci a jinde

  • Návrh čipů a rozvrhy. Rozmisťování součástek na čipu bylo jedním z prvních velkých nasazení žíhání v osmdesátých letech; dodnes se používá na rozvrhy, trasy vozidel nebo uspořádání skladu.
  • Učení neuronových sítí. Stochastický gradientní sestup počítá gradient z malé dávky dat, a tak je každý krok trochu náhodný — podobně jako žíhání může vyklouznout z mělkého dolíku. Rozvrhy rychlosti učení, které ji postupně snižují, se dokonce jmenují cosine annealing.
  • Teplota jazykových modelů. Když jazykový model volí další slovo, dělí skóre slov teplotou T a převede je funkcí softmax na pravděpodobnosti úměrné exp(z/T) — tatáž Boltzmannova formule. Vysoká teplota znamená nápaditější a riskantnější text, nízká opatrnější a předvídatelnější.
  • Kvantové žíhání. Specializované počítače (například D-Wave) hledají minimum energie fyzikálně, s využitím kvantových jevů. Zda a kdy jsou rychlejší než klasické algoritmy, je pořád předmětem výzkumu.
Příklad — teplota při volbě dalšího slova

Model dá třem kandidátům na další slovo skóre z = (z1, z2, z3) = (2, 1, 0). Při teplotě T > 0 je pravděpodobnost i-tého slova (i = 1, 2, 3)

pi = exp(zi/T)/∑j=13 exp(zj/T)

pi
pravděpodobnost, že model zvolí i-té slovo
exp(zi/T)
váha slova — Boltzmannova váha z oddílu o žíhání, jen s „energií“ −zi: vyšší skóre, větší váha
∑j exp(zj/T)
součet vah všech kandidátů; dělíme jím, aby pravděpodobnosti dávaly dohromady 1

T = 1:   váhy (e2, e1, e0) = (7,39; 2,72; 1), součet 11,11 → 0,665; 0,245; 0,090

T = 0,5:   váhy (e4, e2, 1) = (54,6; 7,39; 1), součet 62,99 → 0,867; 0,117; 0,016

T = 2:   váhy (e1, e0,5, 1) = (2,72; 1,65; 1), součet 5,37 → 0,506; 0,307; 0,186

například při T = 1: p1 = 7,39/11,11 = 0,665

Nižší teplota přesouvá pravděpodobnost k nejlepšímu kandidátovi (při T → 0 je to vždy on), vyšší ji rozlévá i na méně pravděpodobná slova — stejně jako žíhání při vysoké teplotě přijímá i horší trasy.

10. Shrnutí

  • Optimalizační úloha hledá řešení s nejlepší hodnotou účelové funkce; lokální hledání se pohybuje po okolí aktuálního řešení.
  • Horolezec jde vždy k lepšímu sousedovi a uvízne v lokálním minimu — na krajských městech v 39 ze 100 startů. Náhodné restarty pomáhají u malých úloh.
  • Simulované žíhání přijímá i horší kroky s pravděpodobností exp(−Δ/T); s klesající teplotou přechází od průzkumu k sestupu.
  • Na krajských městech našlo optimum v 98 ze 100 běhů; na větší úloze porazilo horolezce se stejným rozpočtem.
  • Stejná Boltzmannova formule žije v teplotě jazykových modelů a myšlenka chlazení v rozvrzích učení neuronových sítí.

Chcete si to osahat? Nechte AI agenta napsat žíhání pro vaši vlastní trasu — třeba přes místa, kam chcete o prázdninách — a zkuste, co udělá příliš rychlé chlazení.

Máte na to jiný názor? Napište na support@coden-app.com.

Agent na vašem počítači, ovládaný z telefonu