Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Algoritmi Neat - Harmony cautare

Aici am sa incerc si sa demonstreze un algoritm de optimizare elegant bazat pe principiile de muzicieni de jazz care efectueaza prin aplicarea lui la rezolva puzzle-uri Sudoku.

Harmony de cautare (de multe ori abreviat SA) este o optimizare metaheuristic algoritm de pionierat de Dr. Woo Zong Geem. Algoritmi Metaheuristic ca armonie incercarea de cautare pentru a gasi de intrare optim pentru o oarecare masura obiectii de calitate, sau cu alte cuvinte, gasiti cele mai "cel mai bun" solutie la o anumita problema. Armonia cautare a fost aplicat cu succes la o gama larga de astfel de probleme, cum ar fi problema comis-voiajor Calatoriti, design de retea de apa, si generarea reala de muzica algoritmice.

A se vedea algoritmul in actiune:

116116113113112112112111110110110110109109109
109:2411936371715884464857754147621638109:1418937691775885422858754146621668109:1418976671175874524959454147621368110:1218916391775485524949754132621668110:2211976371175874524848454137621368110:2411916671715874566847754137621368110:2418976691775475524758754147621638111:1411916371715874522958754132621668112:1211966391175875464759754137621638112:2418967691175485566947754146621338112:2418977391175484464959754146621698113:2211976371715885462957454137621638113:2411936671775875466949454137621668116:141891739177587546275975414262139812241189136767367911717548784545262467894578945754134267621363698

In partea stanga este o harta care arata de caldura in cazul in care in cele mai bune marci sunt castigate. Veti gasi, de orele petrecute studiind pe axa X si orele petrecute dormit pe axa Y, si marca realizate codate in culoarea la care punct de pe harta. O culoare alba reprezinta 100%, si o culoare neagra reprezinta un calificativ nesatisfacator. Puteti vedea ca in jurul valorii de marginile hartii culorile sunt mai intunecate, indicand o marca mai sarace. Exista, de asemenea, pare a fi un drept hotspot in mijlocul de la aproximativ 5 ore petrecute studiind si 8 ore petrecute de somn. Acest lucru este usor pentru noi sa vedem ca datele sunt stabilite in asa fel, putem vedea spatiul intreaga problema dintr-o data, si sa vedeti gama exacta a marcilor castigat doar uitandu-te la culori. Noi, oamenii pot identifica un model de marci majorandu-se cu uitam de culorile se apropie de alb ca intrari abordare pe care la fata locului dulce.

Sarcina unui algoritm de optimizare este de a face exact ceea ce facem cu ochii pe harta de caldura. Acesta poate, de asemenea, functii de cautare non diferentiabile, sau functii care ipotezele cateva pot fi facute. De asemenea, retineti faptul ca acest exemplu examen este un pic prostesc, pentru ca fiecare combinatie de intrare este reprezentata in aceasta harta de caldura, asa ca am putea scrie un program de brute force pentru a incerca doar le pe toate si pentru a gasi maxim destul de usor si rapid. Pentru a face chiar mai rau, cod sursa pentru functia de calitate relativ simpla si continua, este, de asemenea, in aceasta pagina, astfel incat aplicarea doar cateva calcul primul an putem gasi maxim la nivel mondial. Pentru functii de calcul complexe de variabile mult mai multe, sau functii non diferentiabile, aceste forta bruta si abordari de calcul nu sunt fezabile, si suntem lasati, sa gaseasca o strategie mai buna.

Introduceti Cautare Harmony

Armonia cautare este o strategie pentru a gasi astfel de un set optim de intrari la o functie de calitate adesea complicate, printre altele, cum ar fi cautare aleatoare, recoacere simulate, algoritmi genetici, si cautare tabu. Acesta actioneaza prin imitarea in timp ce activitatea de muzicieni improvizeze. Alegerea pe care NOTA Pentru a reda urmatoarea timp ce juca ca parte a unui trio sau cvartet este ceva care dureaza ani sa invete sa faca in mod eficient, deoarece este greu sa stii ce notele de acompaniament dvs. s-ar putea juca, si este greu sa stii ce note s-ar putea suna bine sau mare, in tandem cu celelalte. Muzicieni poate fi vazuta ca incercand sa joace un anumit set de note simultan pentru a produce o armonie fantastic, desi aceasta este o oarecum naiv sa ia pe toata treaba, asa ca nu permiteti-mi sa strice magia pentru tine.

Fiecare muzician in ansamblu este de multe ori se confrunta cu problema de a alege nota urmatoare. Pentru a face astfel incat sa poata referinta cunostintele lor de note in cheie in care sunt in joc (ceea ce note sune bine, in contextul cantec), precum si notele care le-au jucat anterior (ceea ce note sune bine in contextul recent ). Notele au jucat recent cel mai probabil a sunat bine, atat de des acestea sunt o alegere buna. De asemenea, acesta poate fi intelept sa alegeti o nota special, ca publicul ar putea astepta si ajusta pitch de ea departe de nota de asteptat pentru a crea un efect artistic si o noua, potential mai bine, armonie.

Aceste decizii care a spus muzician bland ipotetic face corespund exact cum functioneaza cautare armonie. Armonia cautare cauta o combinatie optima de intrari, la fel cum un muzician urmareste o armonie fantastica. Harmony cautare genereaza "armonii" a intrarilor pe care le evalueaza, apoi pentru calitate, si reitereaza acest proces pana cand se gaseste in cele mai bune posibil unul. Calitatea de o armonie muzicala este analog la calitatea de o anumita solutie, deci ati putea afirma ca armonia cautare incearca sa realizeze o combinatie fantastica de intrari, sau care muzicienii sunt incearca sa optimizeze problema de selectie nota folosind euristica lor.

Fiecare intrare a problemei este vazuta ca un instrument diferit intr-un ansamblu, fiecare o nota potentiale ale acestor instrumente ar putea juca corespunde la fiecare valoarea potentiala pe de intrari ale functiei-ar putea adopta. Armonia muzical de note este modelat ca o armonie programatic de valori. Noi evalueze calitatea Fosta utilizand urechile noastre, iar aceasta din urma, folosind o functie de calitate care descrie problema.

Noi solutii sa improvizeze

Armonia cautare continua sa utilizeze metafora muzician pentru a imbunatati iterativ solutionarea ei. Fiecare iteratie a algoritmului de cautare genereaza o armonie nou pentru a evalua pentru calitate. Utilizarea strategiilor de selectie nota mentionat anterior, note pentru fiecare instrument, sau valori pentru fiecare intrare, sunt selectate. Aceste intrari sunt hranite la functia de calitate pentru a determina calitatea armoniei. Notele sunt selectate pentru fiecare instrument fie selectand la intamplare o nota din gama de note pot fi redate, selectand o nota din setul de cele recent jucate, si / sau ajustarea ocazional pas de o nota in sus sau in jos.

Notiuni de o mai buna

Fiecare repetare o armonie nou este generat, calitatea acestuia se calculeaza, iar daca acest lucru face ca se taie de "incluse" in memoria muzicianului. In acest fel, prin repetare repetare, armonii vechi, de calitate proasta sunt dat afara si inlocuite cu altele mai bune. Calitatea medie a setului de armonii in aceasta memorie ca un intreg creste treptat ca aceste armonii noi le inlocuiesc pe cele sarace. Stralucire a algoritmului provine din aceasta: armonii noi, care sunt generate, pe care s-ar putea aminti de multe ori note de referinta la memorie, incepe sa utilizati notele care apartin sa stie de inalta calitate armonii. Astfel, armonii nou generat utilizare note bune, si de multe ori au calitati mai mare, deoarece de ea. Acest proces se repeta, in cazul in care creste cresterea calitatii armonii individuale generate de calitatea medie a memoriei, care creste calitatea armonii individuale generate, si asa mai departe si asa mai departe. La un moment dat (se spera), algoritmul genereaza o armonie care indeplineste "fantastic" de calitate pentru sperat.

Asta-l! Armonia cautare nu este prea complicat, dar ei un algoritm elegant inspirat de unele fenomene naturale, de zi cu zi. Cititi in continuare pentru cod si o cerere de exemplu.

Codul

In primul rand, permite mai mult formal definim cativa termeni.

Codul Pseudo pentru algoritmul real

  1. Initializeaza Parametrii pentru problema si algoritmul.
  2. Initializeaza memorie Armoniei (HM).
  3. Improviza o armonie nou.
  4. Actualizati memorie Armoniei in cazul in care armonia nou este mai bun decat cel mai mare armonie in memorie.
  5. Verificati criteriul de oprire, iar daca putem continua, merge inapoi pana la 3.

Piese de schimb

Algoritm, odata aplicate intr-o problema, este compus din 3 parti principale:

  1. Generator de armonie, care scuipa armonii noi, cu potential bun pe baza continutului de memorie armoniei si set de note de posibile
  2. Functia de calitate, care evalueaza o armonie special pentru calitatea acesteia.
  3. Algoritmul de cautare, care se misca in armonii si la iesirea din memorie pe baza calitatii acestora.

Am ales pentru a ingloba generator si algoritmul de cautare intr-o HarmonySearch clasa, si sa faca totul reutilizabile de a face o Harmony clasa, care intr-o anumita problema va fi extins la punerea in aplicare a functiei de calitate.

In continuare, vom defini parametrii formali pentru algoritmul:

Scheletul

Aici este scheletul pentru HarmonySearch clasa:

 HarmonySearch clasa HarmonySearch

: @ Implicite:
100 maxTries: 100

Infinity targetQuality: Infinity
false harmonyMemorySize: false

. 95 harmonyMemoryConsiderationRate:. 95
. 1 pitchAdjustmentRate: 1.

10 Acte: 10
[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] Note: [1, 2, 3, 4, 5, 6, 7, 8, 9]

10 harmonyMemorySize: 10

: (options) -> constructor: (optiuni) ->

= _.extend {}, HarmonySearch.defaults, options @ Optiuni _.extend = {}, HarmonySearch.defaults, optiunile

Toate acestea nu se defineste implicite pentru algoritmul.

Aici este de baza, extensibil Harmony clasa:

 Harmony clasa Harmony

# Trageti nota si indicele de nota de la coarda, a trecut in
# In [[note_1, index_1], [note_2, index_2],...] format
: (chord) -> constructor: (coarda) ->

= [] @ Constata = []
= [] @ NoteIndicies = []

i, info of chord pentru i, meciului de coarda
[i] = info[ 0 ] @ Ia act de [i] = meciului [0]

[i] = info[ 1 ] @ NoteIndicies [i] = meciului [1]

Cache # calcul de calitate
: - > calitate: ->
? = this.calculateQuality() @ = _quality Aceasta calculateQuality. ()?

@ _quality

: - > calculateQuality: ->
" Extend this class to define how a harmony's quality is evaluated " arunca "Extinderea acestei clase pentru a defini modul in care o calitate armonie este evaluata"

Clasa de mai sus gestioneaza parti generic de cautare. Pentru ao aplica la o problema de optimizare special, subclasa Harmony si sa defineasca un calcul de calitate care se potriveste problema la indemana. Mai jos vom ao aplica la problema marca examen mentionate mai sus, si apoi dupa o problema mai putin banal sudoku.

Harmony Generator

Aceasta este prima componenta a HarmonySearch clasei, responsabil pentru scuipa armonii noi, bazate pe cele stocate in memoria armonie, precum si HMCR si RAP.

 HarmonySearch clasa HarmonySearch

Generati # o armonie complet aleatoare
: - > getRandomHarmony: ->
for i in [ 0.. @options.instruments - 1 ] chord = i de la [0.. @ optiuni de instrumente - 1.]

Math.floor(Math.random() * @options.notesLength) index = Math.floor (Math.random () * @ optiuni. notesLength)

.notes[index], index] [@ Optiuni. Constata [index], indicele]

@options.harmonyClass(chord) noile optiuni @ harmonyClass (acord).

Generati #-o armonie nou, bazat pe HMCR si RAP
: - > getNextHarmony: ->
for i in [ 0.. @options.instruments - 1 ] chord = i de la [0.. @ optiuni de instrumente - 1.]

Math.random() < @options.harmonyMemoryConsiderationRate daca Math.random () <@ optiuni. harmonyMemoryConsiderationRate

Luati in considerare # HM. Alege o armonie aleatoriu, esantionul si nota de la aceasta pozitie in coarda
Math.floor(Math.random() * @options.harmonyMemorySize) harmonyMemoryIndex = Math.floor (Math.random () * @ optiuni. harmonyMemorySize)

@harmonyMemory [harmonyMemoryIndex].notes[i] # Grab note for this instrument act = @ harmonyMemory [harmonyMemoryIndex]. notele [i] Grab # nota pentru acest instrument

@harmonyMemory [harmonyMemoryIndex].noteIndicies[i] noteIndex = @ harmonyMemory [harmonyMemoryIndex] noteIndicies. [i]

# Nu ajustare pas

Math.random() < @options.pitchAdjustmentRate daca Math.random () <@ optiuni. pitchAdjustmentRate

Reglati # pas in sus sau in jos cu o
if Math.random() > 0.5 then 1 else - 1 Ajustarea = daca Math.random ()> 0,5 apoi 1 altceva - 1

(noteIndex + adjustment + @options.notesLength) % @options.notesLength noteIndex = (noteIndex + + ajustarea @ optiuni. notesLength)% @ optiuni. notesLength

@options.notes[noteIndex] act = @ optiuni. constata [noteIndex]

altfel

# Nu considera HM. Alege o nota aleator din toate valorile posibile.
Math.floor(Math.random() * @options.notesLength) noteIndex = Math.floor (Math.random () * @ optiuni. notesLength)

@options.notes[noteIndex] act = @ optiuni. constata [noteIndex]

Intoarcere # nota ales pentru chord

[Nota, noteIndex]

@options.harmonyClass(chord) noile optiuni @ harmonyClass (acord).

Speram ca toate aceste lucruri secundare nu este prea confuz, dar daca este, sectiunea urmatoare aduce pe toate impreuna si speram ca va face totul clar.

De asemenea, retineti ca fiecare Harmony clasa de magazine atat o serie de note si de o serie de indici de note, care pare un pic ciudat. Acest lucru se datoreaza faptului ca in codul de mai sus portiunea de ajustare teren are nevoie de acces la index originala a notei intr-un vector de note posibile, astfel incat sa poata gasi indicele urmator sau anterior sa se adapteze la. Asta e motivul pentru care Harmony constructorul clasei accepta [[note, index], [note2, index2],...] argumente stil, si se intoarce de mai sus acumulator [note, noteIndex], in loc de a face doar tablouri de note.

Core

Mai jos este nucleul a algoritmului de cautare, care executa, de fapt, intreg procesul de cautare prin generarea de noi armonii si a le muta in memoria armonia, daca acestea sunt mai bune decat cele mai grave actuale.

 HarmonySearch clasa HarmonySearch

: (callback) -> cautare: (invers) ->
Initialize # memorie armonie

= true @ Functionare = true
= for i in [ 1.. @options.harmonyMemorySize] @ HarmonyMemory = i de la [1.. @ optiuni harmonyMemorySize.]

.getRandomHarmony() aceasta getRandomHarmony ().

Initialize # variabile tracker pentru bucla
= 0 @ Incearca = 0

worstQuality, worstIndex ] = this._getWorst() [WorstQuality, worstIndex] = aceasta _getWorst ().

bestQuality, bestIndex ] = this._getBest() [BestQuality, bestIndex] = aceasta _getBest ().

# Itereaza peste de cautare pana cand fie de calitate tinta este lovit,
# Sau maxim pe iteratii conditie este trecut.
true in acelasi timp adevarat

++ # Increment tries counter each loop for end condition check @ Incearca + + # Increment Incearca contra fiecare bucla pentru a verifica starea sfarsitul anului

Verificati # conditie sfarsitul anului

@tries > @options.maxTries | | bestQuality >= @options.targetQuality daca incearca @> @ optiuni maxTries |. |. bestQuality> = @ optiuni targetQuality

# We either found it or exhausted the alloted time pauza # Am gasit-o, fie sau epuizat timpul alocat

# In caz contrar, genereaza o alta armonie
this.getNextHarmony() armonie = aceasta getNextHarmony ().

harmony.quality() > worstQuality daca harmony.quality ()> worstQuality
# Mai bine decat cel mai rau armonie. Adauga aceasta armonie pentru a sterge memoria si mai rau.

.push(harmony) @ HarmonyMemory Apasa (armonie).
.splice(worstIndex, 1 ) # Javascript for Array#delete @ HarmonyMemory lipitura (worstIndex, 1). # Javascript pentru Array sterge #

Actualizati # cel mai rau de calitate pentru urmatoarea iteratie bucla
worstQuality, worstIndex ] = this._getWorst() [WorstQuality, worstIndex] = aceasta _getWorst ().

Pista # cea mai buna calitate pentru a vedea daca ne-am indeplinit obiectivul de calitate
harmony.quality() > bestQuality daca harmony.quality ()> bestQuality

harmony.quality() bestQuality = harmony.quality ()

bestQuality, bestIndex ] = this._getBest() [BestQuality, bestIndex] = aceasta _getBest ().

@harmonyMemory [bestIndex] @ reveni harmonyMemory [bestIndex]

Asta e despre asta! Senzatie de bine? Cititi in continuare pentru un tanar de exemple de gel toate acestea.

Examen Mark Exemplu

Luati in considerare problema marca examenul prezentate mai sus. Sa presupunem ca ecuatia misterios marca examen a fost pusa in aplicare intr-o functie numita Javascript Exam.mark(timeSleeping, timeStudying).

 $ Exam.mark

# => Functiei (timeSleeping, timeStudying) {... }
, 0 ) $ Exam.mark (0, 0)

# => 30
, 10 ) $ Exam.mark (10, 10)

# => 50

Incercam sa gasiti cele mai optime global la aceasta ecuatie. Pentru acest model de cautare in armonie, ne intrebam cum de multe instrumente exista, ceea ce ia act de fiecare dintre ele pot juca, si cum pentru a determina calitatea armoniei produs.

In acest caz, Exam.mark ecuatia este cea pe care incercam sa optimizeze. Am modelul de intrare ca argumentele sale note, armonii si utilizarea compuse din diferite combinatii de ori. Exista doua instrumente, unul pentru fiecare argument al functiei, si pe fiecare instrument pot "juca" orice numar intre 0 si 10, care sunt limitele cum sa subliniat in aceasta problema. Calitate A armonie este marca de realizat atunci cand timpul este petrecut in alocare este special, pe care noi ca model de evaluare a Exam.mark functiei pentru doua note.

Clasa de armonie vom folosi pentru aceasta problema ar arata astfel:

 ExamHarmony extends Harmony ExamHarmony clasa extinde Harmony

: - > Exam.mark( @notes [ 0 ], @notes [ 1 ]) calitate: -> Exam.mark (@ note [0], @ note [1])

Asta nu e chiar asa de rau? Ne-ar executati de cautare pentru un numar suficient de mare de iteratii si uita-te la iesire.

 new HarmonySearch { cautare = new HarmonySearch {

ExamHarmony harmonyClass: ExamHarmony
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] note: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

2 Instrumente: 2
100 targetQuality: 100

2000 maxIterations: 2000
}
search.search() Rezultate obtinute = search.search ()

Dupa aceasta, rezultatele ar trebui sa detina cea mai buna calitate Harmony gasite.

Demo

Try 0. Best: 93.19. Worst: 69.35.
93.1985.6983.1578.4078.1377.4775.2175.0073.5373.5272.6171.4771.2870.5869.5469.3573.57
73.57:2.12.869.35:1.54.569.54:1.97.770.58:1.64.571.28:6.41.471.47:1.73.372.61:3.34.173.52:5.81.673.53:4.71.575.00:5.25.775.21:6.11.777.47:6.42.478.13:6.32.478.40:6.94.483.15:55.385.69:54.393.19:4.62.8

Armonia Cautare se executa direct la putere vizualizare de mai sus, precum si cel de la partea de sus a paginii. Fiecare parcela in cerc mov reprezinta o armonie in memorie, si astfel cercul este HM intreg. Fiecare parcela este etichetat de calitatea sa, precum si armonii cresc mai aproape de tinta de calitate, de culoarea penelor lor cresc mai mult violet. Armoniile bun sau mai rau si sunt, de asemenea, sunt evidentiate cu ajutorul unui frontiera verde sau rosu. Simtiti-va liber sa faceti clic pe o armonie pentru a vedea locatia pe harta de caldura, si a judeca cat de aproape este de punctul optim. De asemenea, observati cum armonii noi sunt adaugate in partea de sus a cercului si progresele inregistrate in sensul acelor de ceasornic cele noi sunt adaugate si cele sarace sunt eliminate. Cele mai bune armoniile se va deplasa tot drumul in jurul cercului, dar nu sa lovit afara, si ajung la partea din spate pentru o perioada lunga de timp, contribuind note de buna calitate pentru noile armonii generate.

Grila de numere din dreapta reprezinta selectie a notelor in fiecare armonie nou. Armonia la partea de sus a listei (cu toate liniile care decurg din acesta) este langa cele mai recente la memorie armonie, si fiecare linie de mai jos este o armonie progresiv mai mari in memorie. Fiecare nota in primul rand este generat fie alegand o nota de la set de cele alese anterior in memorie, sau alegand un mod aleatoriu de la un set de note posibile. Cei alesi de memorie sunt semnificat printr-o linie gri indreptat spre armonie de la care nota a fost ales. Daca ajustarea este aplicat pas, linia devine albastru. In caz contrar, nota este ales aleator, ceea ce este semnificat printr-o linie violet indreptat in sus in set de note posibile pentru fiecare nota in armonie. Trebuie doar veti observa acest lucru in demo Sudoku de mai sus, pentru ca nu exista spatiu suficient pentru a arata toate posibilitatile cu exemplul de examen.

Sudoku Exemplu

Armonia cautare pot fi aplicate la probleme mult mai complexe decat simple functii cum ar fi cele de mai sus. Sudoku este un caz specific a problemei de colorare grafic, unul dintre Karp de 21 NP-complet probleme. Cu alte cuvinte, timp de foarte consumatoare de brute force solutia intr-un Sudoku, incercand doar numere aleatorii si de a vedea daca acestia lucreaza. Exista algoritmi excelente care de multe ori alerga mai repede decat cautare armonia sau la oricare dintre fratii sai metaheuristic care rezolva Sudoku folosind metode inteligente, problema constienti si ghici atunci cand este nevoie.

Aceste "inteligente" sunt cei care rezolva Sunt sigur ca algoritmii de angajati de catre software-ul Sudoku adevarat, dar ele se bazeaza pe cunoastere intima a procesului de rezolvare a Sudoku si o intelegere a tehnicilor utilizate. Avem pentru a codifica cunostintele noastre de cum sa rezolvati sudokus intr-un program, de punere in aplicare caracteristica guessing, backtracking, si toate metodele pentru a elimina posibilitatile pentru o anumita celula. In loc de a dezvolta un algoritm ca aceasta, putem folosi o metoda de cautare pentru a gasi noi o solutie, atata timp cat avem o euristica pentru a spune de calitate a dat o solutie. Prin rezolvarea acestora in acest fel, nu avem nevoie sa ne preocupam de gasirea unei metode generale sau explorarea cazuri de margine sau nuante algoritmice, si ne lasati algoritmul de cautare cifra aceste lucruri pe cont propriu. Suntem capabili sa ridice povara de a intelege relatia dintre variabilele de intrare de la umeri noastre proprii, si, in loc sa permita algoritm pentru a explora aceste relatii in sine.

Speram ca puteti vedea avantajul de a folosind un algoritm de cautare pentru probleme in cazul in care punerea in aplicare inteligent, omului scris este greu sau imposibil de a crea. Daca avem o anumita masura de calitate pentru o solutie, si, astfel, o modalitate de a spune atunci cand o solutie este optima, putem lasa algoritmului de cautare, bine, cautare.

Modelul Sudoku

Sa rezolva un puzzle special Sudoku cautare folosind armonie. In primul rand, permiteti-ne sa identifice ce notele de o armonie sunt, si dupa, cum sa calculeze calitatea de unul.

In primul rand, observati ca, pentru orice solutie sa fie considerate ca atare, fiecare celula trebuie sa aiba o valoare. Unele dintre valorile sunt date de puzzle, iar unele trebuie sa fie decisa de catre noi. Cautam o alegere pentru fiecare celula, astfel incat nu exista conflicte, sau cu alte cuvinte, solutia optima la un Sudoku este unul care are toate celulele si completat in concediu fara reguli.

Am modelul valoarea de fiecare dintre celulele necunoscut ca o nota intr-o armonie, cu valoarea nota fiind un numar intreg intre 1 si 9. Armonia este acord lovit atunci cand am introduceti fiecare din aceste alegeri in puzzle-ului, si calitatea de solutie este cat de aproape de o adresa valida de completat puzzle-in aceasta solutie este. Obligarea matrice de note este inscris in puzzle-ul nu conteaza tot atat de mult, atata timp cat este conforma algoritmul va lucra la fel. Numarul de instrumente este numarul de celule nerezolvate.

2 5 4 3 1 6 8 9 7
7 6 3 9 8 5 1 2 4
1 9 8 4 2 7 6 5 3
9 8 1 7 5 3 2 5 6
2 3 2 7 4 8 7 1 5
5 4 7 2 6 1 9 3 8
4 6 5 6 9 2 3 8 1
3 1 6 5 7 8 4 9 2
8 2 6 1 3 4 5 7 9
Un puzzle sudoku in procesul de a fi rezolvate.

In partea stanga este o solutie exemplu propus intr-o iteratie timpurie de cautare armonie.

Verde, gri, si de celule rosii reprezinta optiunile pentru toate celulele necunoscut.

Apoi, vom decide cum sa evalueze calitatea unei solutii de date. Algoritmul cel mai evident este doar un numar de incalcari in puzzle, care este doar un numar de celule rosii in solutie. In testele mele aceasta euristica a lucrat un pic mai putin eficient decat o euristica usor diferita propus de Dr. Woo Zong Geem in [1]. Q, where Solutia optima este de minim global \ (Q \), in cazul in care

Q=?i=19?????j=19Si,j?45????+?j=19????i=19Si,j?45???+?k=19?????(i,j)?BkSi,j?45????
where

Euristic de mai sus ofera o masura mai detaliata a unei solutii de calitate. Acesta actioneaza prin luarea suma de fiecare rand si scazand 45, care este suma de numere de la 1 la 9. Q won't be minimal. Daca un rand special, are doua 1s in loc de A 1 si A 2, suma numerelor din randul nu vor fi 45, si \ (Q \) nu va fi minim. Q=0. O solutie corecta pentru o Sudoku-ar fi \ (Q = 0 \). Dupa cum sa mentionat in [1], este important de a vedea ca suma de un rand poate sa fie de 45, chiar daca numerele nu sunt exact setul de 1-9. sum {1,2,2,5,5,6,7,8,9}=45. Numerele intr-un rand s-ar putea intampla doar la suma la 45, de exemplu, \ (suma intre \ \ {1,2,2,5,5,6,7,8,9 \} = 45 \). Q away from 0, and thus denoting a sub optimal quality as desired. Cu toate acestea, in cazul in care acest caz, apare intr-un singur rand, apoi suma pentru coloanele care trec prin rand, sau suma pentru una din cutiile de rand nu vor fi 45, se deplaseaza valoarea finala a \ (Q \) distanta de 0, si, astfel, denota o calitate sub-optima dupa cum doriti. Singura modalitate de a obtine un rand, coloana, si caseta de suma de 45 este de a avea exact setul 1 la 9 in fiecare recipient.

Q on the generated sudoku puzzle. In rezumat, note pentru o armonie sunt set de valori pentru celulele necunoscut, si calitatea armonia este evaluare a functiei \ (Q \) pe puzzle sudoku generate. Cu aceste doua decizii luate, putem folosi acum cautare armonie, sa gaseasca o solutie (daca exista unul) la un puzzle sudoku dat.

Cod

Codul de exemplu, Sudoku este plictisitoare si, din pacate, mult timp, dar se poate vedea pe Github daca doriti. Q function above. Acelasi HarmonySearch clasa astfel cum sunt definite mai sus vor fi utilizate pentru a cauta in spatiul problemei, si de calitate o armonie ar fi calculat folosind \ (Q \) functia de mai sus.

Q gets smaller as the input approaches a valid solution. De asemenea, o nota separata rapid: HarmonySearch clasa incearca pentru a maximiza o calitate data, intrucat \ (Q \) devine mai mici de intrare se apropie de o solutie valabila. 135Q instead of just

Discutie

Demo la foarte de sus a paginii pune in aplicare Cautare Armoniei in incercarea de a rezolva o Sudoku. Am incercat destul de greu pentru a obtine rezultate similare cu cele pentru Geem [1], dar am fost lovit-a dreptul. Geem a reusit sa rezolve Sudoku implicit (cel numit "geem" in simularea mea) in "285 improvizatii", care pentru mine este doar absurd scazut. Este nevoie de punerea in aplicare mea oriunde 5000 la 50000 improvizatii, sa gaseasca o solutie valabila, care este o mult mai mult decat 285. Deci cred ca am facut nici o greseala grava atunci cand punerea in aplicare, o greseala grava atunci cand interpretarea rezultatelor Geem lui, sau a descoperit unele fraude academice. Am incredere in inventatorul a algoritmului de a fi mai bun la punerea sa in aplicare decat mine, asa ca sunt destul de sigur ca am facut o greseala la un moment dat sau altul.

Puzzle-ului in cauza are 41 de celule nerezolvate, oferind un spatiu de cautare cu 9 41 solutii diferite. Acest numar are 40 de cifre. Sale mari. Este suficient de mare pentru ca gasirea unei solutii doar dupa 235 Incearca este foarte, foarte impresionant. Intr-o incercare de a obtine numerele mele pana la cel putin de acelasi ordin de marime, am incercat precomputing optiunile posibile pentru fiecare celula in loc de a lasa fiecare dintre fi orice numar de la 1 la 9. Acest lucru este o prostie, deoarece prezinta nu avem nevoie sa utilizati SA pentru a rezolva aceasta problema la toate, pentru ca algoritmul pentru a determina alegeri posibile pentru fiecare celula este unul care am putea folosi pentru a rezolva doar puzzle. Daca vom putea obtine alegerile posibile pentru o celula cu ajutorul unor algoritm, putem alege doar o singura optiune, a se vedea daca solutia de lucrari, si daca nu, alege alegerea urmatoare, si se repeta. Noi suntem de punere in aplicare doar primul pas al algoritmului de rezolvare inteligenta pentru a face un prost doar un pic mai inteligent. Daca este posibil pentru noi de a veni cu un algoritm care poate rezolva o Sudoku determinist, in loc de a folosi o euristica pentru cautare, trebuie sa ne ia cel mai probabil fostul abordare.

In orice caz, adaugand in acest pas precomputation primit numerele de jos cum era de asteptat, deoarece reduce drastic marimea spatiului de cautare, dar inca nu in cazul in care in apropiere de Geems. Nu stiu de ce acesta este cazul, si mi-am petrecut o cantitate obscen de timp incercand sa-l dau seama, dar din pacate, am reusit. Daca va puteti da seama uitandu-se la codul sau doar pe baza mea (probabil incorecta) descriere a algoritmului, nu-mi spui asa ca am putea pune aceasta sa se odihneasca.

In sfarsit, problemele mentionate mai sus demonstreaza ca sudoku nu este cu adevarat bun ca un exemplu de algoritmi metaheuristic. Stim ca exista algoritmi mai eficiente, care le rezolva in cantitate foarte mica itty Bitty de timp, si, din pacate, acest algoritm rezolvitorului nu este chiar atat de departe de euristice de calitate avem deja sa scrie pentru HS. Am inclus, de asemenea, nici o strategie reala pentru a face cu sudokus imposibil de rezolvat, care este o intreaga clasa de alte probleme. Rusine pe mine pentru ca nu se ocupa cu acestea, dar cu aceasta clasa de algoritm, in special, extraordinar de greu. Cand se foloseste HS, nu exista nici o modalitate de a sti daca exista o solutie sau nu pana cand toate armoniile posibile au fost incercate. Aceasta cautare brute force este ceea ce incercam pentru a evita folosind o cautare euristica. In cazul in care numarul nostru incearca ajunge la unele definite de utilizator plafon, care este conditia de oprire utilizate in aceste demo-uri, am obiceiul stiu daca o solutie nu a fost gasit, deoarece nu exista, sau pentru ca pur si simplu nu am asteptat destul de mult. Din moment ce e atat de greu sa stiu, le cerem algoritm pentru a opri o data sa incercat 10000000 armonii, si presupunem ca solutia nu exista, chiar daca solutia optima ar putea fi armonie 10000001st incercat.

Concluzie

Speram ca acest lucru a fost o calatorie interesanta prin lumea de algoritmi de optimizare metaheuristic, si le-ati invatat un lucru sau doua. Am facut sigur. Takeaways sunt:

Multumesc pentru lectura!

Referinte

  1. Geem, ZW: Harmony algoritmului de cautare de Solutionare a Sudoku. Bazata pe Cunoastere Informatii inteligente si sisteme de Inginerie. http://dx.doi.org/10.1007/978-3-540-74819-9_46

Multumiri

Datorita Mo si Tomas pentru a ajuta editare. Datorita Dr Geem pentru crearea si publicarea atat de mult despre algoritmul. Va multumim pentru autorii de Protovis si Mathjax pentru cod superba care a facut vizualizarile si formulele de pe aceasta pagina arata foarte bine.

Useful Info
Published (Last edited): 21-09-2011 , source: http://harry.me/2011/05/07/neat-algorithms---harmony-search/