2.2 Algoritmi putanje


Algoritmi putanje su oni metaheuristički algoritmi koji u svakom koraku izabiru samo jedno (trenutno) rješenje. Ime su dobili po tome što se ovakvim načinom opisuje putanja u prostoru pretrage rješenja. Algoritmi putanje opisani u ovom podpoglavlju su: pohlepni algoritam, lokalno pretraživanje, algoritam simuliranog kaljenja, tabu pretraživanje i pretraživanje promjenjivom okolinom.

2.2.1       Pohlepni algoriatm

Jedan od najjednostavnijih heurističkih algoritama je pohlepni algoritam (Greedy Algorithm). Traženje optimalnog rješenja može biti eksponencijalne složenosti, a pohlepni algoritam smanjujući prostor pretraživanja, smanjuje i samu složenost. Naime, pohlepni pristup nas u svakom trenutku usmjeruje na trenutno najbolje rješenje, ne uzimajući u obzir da nas to ne mora voditi k globalnom optimumu. Zbog toga, pohlepni algoritam ne mora uvijek naći optimalno rješenje, ali je znatno brži od drugih algoritama.

Primjer 2.1. Trgovac koji koristi pohlepni algoritam

Tipičan primjer na kojem se ilustrira pohlepni algoritam (zasnovan na pohlepnom pristupu) je povrat ostatka (novca) prilikom kupnje. Kupac je platio neki proizvod s novčanicom većom nego je proizvod koštao i sada mu trgovac treba vratiti određenu sumu novca S. Neka trgovac pri tome ima kod sebe puno novčanica N1, N2, N3 i N4 (N1>N2>N3>N4=1) i neka može odjednom staviti u ruke kupcu samo jednu novčanicu.  Trgovcu se žuri (jer je red u trgovini jako velik) i u interesu mu je što prije vratiti ostatak kupcu. Budući da je trgovac obrazovan, on zna za pohlepni algoritam i koristi ga. Trgovac čini:

1.      stavlja najveću novčanicu koja ne prelazi sumu S

2.   od sume S oduzima vrijednost te novčanice i suma S poprima vrijednost dobivene razlike

3.      ako je S jednako nula trgovac je vratio ostatak, inače se vraća na korak 1.

Izračunaj ostatak S koji treba vratiti;

Dok (N1 <= S) {

     Stavi novčanicu N1 u ruke kupcu;

     S = S - N1;

}

Dok (N2 <= S) {

     Stavi novčanicu N2 u ruke kupcu;

     S = S - N2;

}

Dok (N3 <= S) {

     Stavi novčanicu N3 u ruke kupcu;

     S = S - N3;

}

Dok (N4 <= S) {

     Stavi novčanicu N4 u ruke kupcu;

     S = S - N4;

}

Obavi ostale poslove;

Slika 2.2 Pseudokod trgovca

Ako trgovac treba vratiti 62 kn, a posjeduje novčanice od 50 kn, 10 kn, 5 kn i 1 kn, trgovac će vratiti ostatak sa jednom novčanicom od 50 kn, jednom od 10 kn i dvije novčanice od 1 kn. Ovakav pristup ne mora nužno voditi do najboljeg rješenja. Ako trgovac, primjerice, treba vratiti 15 kn, a ima novčanice od 11 kn, 5 kn i 1 kn, on će pohlepnim algoritmom vratiti ostatak jednom novčanicom od 11 kn i četiri novčanice od 1 kn, premda bi mu bilo brže vratiti ostatak sa tri novčanice od 5 kn.

Premda pohlepni algoritam ne mora uvijek voditi globalnom optimumu, on može biti vrlo koristan u razmatranju NP-teških problema. Naime, pohlepni pristup vodi do rješenja koje sigurno predstavlja donju među (ogradu) globalnog maksimuma, ukoliko se traži maksimum, odnosno gornju među globalnog minimuma, ukoliko se traži minimum. Kako se pohlepni algoritam brzo izvodi i daje ogradu optimalnom rješenju, on nam omogućava da drugim algoritmima smanjimo prostor pretrage rješenja. Dodatna prednost pohlepne strategije je da, čak i kada ne pronađe optimalno rješenje, često vodi na novu strategiju razvoja algoritma koja rezultira efikasnijim rješenjem ili tehnikom koja brzo pronalazi dobru aproksimaciju rješenja (heuristika) [6]. Heuristika koju koristi pohlepni algoritam je jednostavna: pronađi najbolje trenutno rješenje i idi za njim. Valja napomenuti da postoje mnogi algoritmi koji su zasnovani na pohlepnom pristupu, pa kada govorimo o pohlepnom algoritmu, ustvari govorimo o skupini algoritama.

Postoje problemi kod kojih je dokazano da pohlepni algoritam daje optimalno rješenje. Jedan od tih problema je i problem rasporeda zadataka. Pitanje je kako rasporediti zadatke, a da prosječno vrijeme završavanja zadatka bude minimalno. Neka su poslovi a1, a2, a3 i a4, a njihova vremena izvođenja redom dta1=10s, dta2=11s, dta3=5s i dta4=15s. Ako poredamo poslove redoslijedom a1, a2, a3 i a4 onda će vrijeme završavanja poslova (od početnog trenutka) biti redom t1=10s, t2=21s, t3=26s i t4=41s. Prosječno vrijeme završavanja (od početnog trenutka) jednako je tp=24.5s. Sada preuredimo raspored tako da prvi poslovi budu oni s manjim vremenima trajanja, tj. da se poslovi obavljaju redom a3, a1, a2 i a4. To je u skladu s pohlepnim pristupom. Vremena završavanja će iznositi redom t3=5s, t1=15s, t2= 26s i t4=41, a prosječno vrijeme izvršavanja će biti tp=21.75s. Općenito se može dokazati da će prosječno vrijeme završavanja biti najmanje ako najprije obavljamo najkraće poslove (u skladu s pohlepnim algoritmom). Ipak, valja pripaziti kada ovom problemu pristupamo pohlepnim algoritmom jer nemaju svi poslovi jednak prioritet [3, 6, 7, 9].  

2.2.2       Lokalno pretraživanje

Kao i svi heuristički algoritmi, tako i lokalno pretraživanje (Local Search, LS) nastoji pronaći optimalno rješenje zadanog problema smanjujući prostor pretraživanja. LS možemo opisati u nekoliko koraka. Prvo se odabere rješenje i izmjeri se njegova vrijednost (ili valjanost; ovisno o problemu koji se promatra). Zatim se pretražuju susjedi od odabranog rješenja i u ovisnosti o njihovim vrijednostima se izabere najbolji. Susjedi su pri tome definirani ovisno o problemu koji se promatra. Sada se nizom iteracija nastoji doći do optimalnog rješenja. Trajanje algoritma je određeno brojem iteracija, bez obzira je li pronađeno rješenje, pa ga svrstavamo u nezavršne algoritme, kao i većinu metaheurističkih algoritama. Bitno je uočiti da algoritam zamjene sa najboljim susjedom može dovesti do neprestanog alterniranja dvaju susjeda u izboru rješenja, pa algoritam neće postići stabilizaciju u globalnom optimumu. Taj problem je moguće riješiti odabirom dobre funkcije cilja (funkcije transformacije trenutnog rješenja), tj. odabirom dovoljno velikog lokalnog prostora pretraživanja (odabirom dovoljno velikog broja susjeda ukoliko je moguće), ili malom preinakom algoritma. Dakako, ukoliko se podešava lokalni prostor pretrage, treba paziti da ne bude prevelik jer se može dogoditi da nam je odabir susjeda sveden na odabir slučajne varijable unutar prostora mogućih rješenja.

LS

 Slika 2.3 Lokalni i globalni minimum i alterniranje rješenja

.

Primjer 2.2 Lokalno pretraživanje na problemu SAT

Ilustrirajmo algoritam lokalnog pretraživanja na prvom problemu za kojeg je pokazano da je NP-potpun. To je problem zadovoljenja Booleove formule, a češće se označava sa SAT  ( SAT(x) znači „x je propozicijska formula koja je istinita za neke Booleove vrijednosti”[10]). Potrebno je otkriti postoji li kombinacija vrijednosti varijabli (istina ili laž) da Booleova formula bude istinita. SAT spada u klasu NP-potpunih problema. Pogodno je Booleovu funkciju napisati u potpunom konjuktivnom obliku (produktu makstermi), te argumentima (varijablama) funkcije pridružiti binarni vektor. Taj vektor će predstavljati vrijednost argumenata funkcije (0-laž, 1-istina). Problem ćemo riješiti GSAT algoritmom. GSAT algoritam se sastoji od dvije petlje, jedna ugniježđena u drugoj. U prvoj petlji se nasumice odabire jedan binarni vektor, a sama petlja ima konačno mnogo iteracija. Druga petlja je ugniježđena u prvu i kroz konačno mnogo iteracija provjerava da li za binarni vektor

funkcija GSAT (funkcija *Booleova){

    binarni_vektor t;

    indeks p;

    za (i = 1 do BROJ_POKUŠAJA) {

        t=slučajno_odaberi();

        za (j = 1 do BROJ_PROMJENA){

            ako (Booleova(t)==istina) vrati t;

            odredi indeks bita p čijom promjenom dobivamo

            najveći broj istinitih makstermi;

            t(p)=1-t(p);

        }  

    }

    vrati nisam našao zadovoljavajući vektor 

}

                                   

Slika 2.4 Pseudokod GSAT-a

(određene vrijednosti literala)  Booleova funkcija poprima vrijednost istine. Ako poprima, algoritam završava sa izvođenjem, a ako ne, mijenja se jedan od bitova binarnog vektora (vrijednost jednog literala) i to onaj čijom promjenom najveći broj makstermi poprima vrijednost istine. Pri tome se može i smanjiti broj istinitih makstermi. Algoritam završava pronalaženjem binarnog vektora za kojeg Booleov izraz poprima vrijednost istina ili prolaskom kroz obje petlje.

Da bi izbjegli pojavu zaglavljivanja u lokalnom optimumu, možemo za svaku makstermu uvesti oznaku težine koja će se povećavati unutar ugniježđene petlje dok god maksterma nema vrijednost istine za binarni vektor t [5]. Sada će se mijenjati onaj bit binarnog vektora t čijom je promjenom zbroj težina neistinitih makstermi najmanji [5, 10].

                   ...

    težine mintermi w[2^broj_varijabli]={0};

                   ...

        ako (Booleova(t)==istina) vrati t;

            odredi indeks bita p čijom promjenom zbroj težina

        neistinitih makstermi za bitovni vektor t je najmanji i             uvećaj težine tih makstermi;

        t(p)=1-t(p);

                   ...

Slika 2.5 Poboljšani GSAT

2.2.3       Algoritam simuliranog kaljenja

Algoritam simuliranog kaljenja (Simulated Annealing, SA) jedan je od stohastičkih optimizacijskih algoritama, a razlikuje se od algoritama lokalnog pretraživanja po tome što omogućuje bijeg iz lokalnog optimuma. Algoritam je nastao po analogiji sa metalurškim kaljenjem, čiji je cilj oplemenjivanje metala tako da oni postanu čvršći. Ako želimo postići čvrstoću metala, potrebno je kristalnu rešetku metala pomjeriti tako da ima minimalnu potencijalnu energiju. U procesu metalurškog kaljenja metal se prvo zagrijava do visoke temperature, a potom se, nakon kraćeg zadržavanja na toj temperaturi, polagano hladi do sobne temperature. Prebrzo hlađenje bi moglo uzrokovati pucanje metala. Posljedica toga je da atomi metala nakon procesa kaljenja tvore pravilnu kristalnu rešetku. Time je postignut i energetski minimum kristalne rešetke.

U skladu s navedenim, SA će sadržavati parametar temperature, a funkciju kojoj želimo odrediti globalni optimum možemo promatrati kao energiju rešetke, ukoliko određujemo minimum, odnosno negativnu energiju rešetke, ukoliko određujemo maksimum. Algoritam počinje odabirom nekog početnog  rješenja, a početna temperatura ima relativno veliku vrijednost. Postojeće rješenje se zamjenjuje sa boljim, ali se može zamijeniti i sa lošijim uz određenu vjerojatnost prihvaćanja [12]. Ta vjerojatnost se određuje odabirom slučajnog broja a iz intervala [0,1] i uvjeta da je a manje od exp(E(staro) – E(novo)/T), gdje je E(x) funkcija za koju se traži globalni minimum, a T temperatura. Ukoliko je izraz istinit novo rješenje se prihvaća. Ovo nam omogućava bijeg iz lokalnog minimuma. Isto tako, vjerojatnost da će biti odabrano lošije rješenje je veće kada je veća temperatura. To znači da je u početku prostor pretrage rješenja dosta velik i da se smanjuje padom temperature, a pri kraju procesa je usko lokaliziran. Ponašanje funkcije je uvelike određeno početnom vrijednosti temperature i njenom brzinom padanja. Najčešće temperatura opada eksponencijalno s parametrom a iz intervala 0<a<1 (a je blizak jedinici). Za premali a hlađenje je prebrzo (pucanje metala) i veća je vjerojatnost upada u lokalni optimum. Za preveliki a temperatura presporo pada, i zbog velike vjerojatnosti da se u početku zamjenjuju bolja rješenja s lošijim, algoritam ima svojstvo da nasumično pretražuje veliki prostor rješenja. To dodatno usporava rad, te se a nastoji odabrati da bude dovoljno velik, ali da temperatura pri kraju procesa bude niska. Time se rješenje pred kraj procesa stabilizira u lokalnom području. Zbog velike osjetljivosti na koeficijent a, posebnu pažnju valja obratiti njegovom odabiranju.

imabe006

Slika 2.6 Globalna pretraga i stabilizacija kod SA-a

Primjer 2.3 Problem naprtnjače i SA

SA se može dobro opisati na problemu naprtnjače. Zamislimo vozača kamiona Matu koji ima osmeročlanu obitelj i koji svojim kamionom prevozi raznovrsnu robu zarađujući tako za život. Pitanje se postavlja kako će Mate najviše profitirati ako se zna da su svi predmeti različiti, svaki predmet ima određen profit i masu, te da njegov kamion ima ograničenu nosivost N. Mate zna za algoritam simuliranog kaljena, te pokušava konstruirati najbolje rješenje.  On uzima polje nula i jedinica (polje x), koje mu označava koji će element uzeti, i dva polja od n elemenata: jedno da stavi profite pojedinih predmeta (polje p), a drugo da stavi mase pojedinih predmeta (polje t). Ovisno o vremenskim prilikama, on odabire početnu temperaturu i koeficijent a. Ukupni profit odabranih predmeta P i ukupna masa odabranih predmeta  M se dobivaju po formulama (2.1).

formula1

(2.1)

Pri odabiru polja x, Mate pazi da ukupna masa (M) nije veća od nosivosti (N), pa uzima u obzir samo rješenja koja zadovoljavaju taj uvjet. Isto tako, on je uočio da je zgodno imati varijablu koja pamti najbolju kombinaciju predmeta uopće (xnaj, Pmax). Naime, trenutno rješenje se nastoji „poboljšati”, ali moguće je i „pogoršanje”, pa on ovako dobiva najbolje rješenje od onih kombinacija koje je pregledao [11, 12].

funkcija simuliranog_kaljenja(nosivost N, poc_temp T0, koef_alfa a){

temperatura T=T0;

polje_odabira x={0},y,xnaj={0};

polje_profita p;

profit Pmax=0,Ptr=0;

polje_masa t;

ukupna_masa M=0;

slucajna v,r;

dopustivo d;

za(i=0; i<broj_iteracija; i++){

            v = slucajno_odaberi_iz_intervala_(0,n-1);

            y=x;

            y[v]=1-x[v];

            ako(y[v]==1 i (M+t[v] > N)) d=laž;

            inače d=istina;

            ako(d==istina){

                   //zamjena s boljim rješenjem

                   ako(y[v]==1){

                         x=y;

                         M+=t[v];

                         Ptr+=p[i]*x[i];

                         ako(Ptr > Pmax) {

                               xnaj=x;

                               Pmax=Ptr;

                         }

                   }

                   //zamjena s gorim rješenjem

                   inače{

                         r= slucajno_odaberi_iz_intervala_(0,1);

                         ako(r < exp(-p[v]/T)){

                               x=y;

                               M-=t[v];

                         }

                   }

            }

            T=a*T;

     }

     vrati xnaj;

}

Slika 2.7 Pseudokod SA-a za problem naprtnjače

 

2.2.4       Tabu pretraživanje

Tabu pretraživanje (Tabu Search, TS) kombinira osnovni algoritam lokalnog pretraživanja sa kratkotrajnom memorijom koja mu omogućuje bijeg iz lokalnog optimuma i izbjegavanje alternacije dvaju rješenja[1]. Cilj je odrediti optimum zadane funkcije. U tu svrhu, algoritam koristi posebnu tabu listu koja služi kao kratkotrajna memorija. U njoj pamti rješenja odabrana unatrag nekoliko prethodnih koraka. Rješenja koja se nalaze u tabu listi se ne mogu pojaviti kao rješenje u sljedećem koraku. Time je definiran dopušteni skup rješenja u sljedećem koraku. Ponašanje algoritma ovisi o veličini tabu liste i veličina se podešava tako da ne bude premala, jer to može dovesti do cikličkog ponavljanja rješenja, niti prevelika, jer to može dovesti do znatnog usporenja algoritma. Kada se odredi novo rješenje, iz tabu liste se po principu FIFO (first in, first out) strukture izbacuje jedno rješenje i stavlja novo. Algoritam se obavlja dok god se ne zadovolji kriterij zaustavljanja ili se svako moguće rješenje nalazi u tabu listi. Ovako jednostavno definiran algoritam moguće je unaprijediti. Umjesto da se stavljaju rješenja u tabu listu, što često nije učinkovito zbog mogućeg zapisa rješenja, mogu se u tabu listu staviti samo atributi koji opisuju rješenje. Time se gube neke informacije o rješenju (jer različita rješenja mogu imati iste atribute), ali se dobiva na brzini i jednostavnosti pretrage i korištenja tabu liste.

Inicijaliziraj tabu_lista;

Inicijaliziraj x; //početno rješenje

Skup_rješenja X=Ø;

Dok (Zaustavni_kriterij != zadovoljen){

      X={y|y nije u tabu_lista ili usisni_kriterij(y)==zadovoljen};

      Ako(X == Ø) izađi_iz_petlje;

      x=odaberi_najbolji(X);

      obnovi_tabu_listu();

      obnovi_usisni_kriterij();

}

Slika 2.8 Pseudokod TS-a

Opis rješenja atributima može dovesti i do toga da se u sljedećim koracima ne mogu pojaviti rješenja koja imaju isti opis kao i rješenje odabrano u nekom od prethodnih koraka, a to može uzrokovati ispuštanjem dobrih rješenja. Da bi se to izbjeglo, uvodi se usisni kriterij koji omogućava da se rješenje pojavi premda ga tabu lista zabranjuje. Najčešće je usisni kriterij tako postavljen da se usisavaju ona rješenja koja su bolja od trenutno najboljeg.

img10

Slika 2.9 Ubacivanje u tabu listu

Osim kratkotrajne memorije, algoritam može koristiti i dugotrajnu memoriju koja posjeduje informacije od početka djelovanja algoritma. Ona može koristiti algoritmu kao strateška potpora, a uglavnom je zasnovana na jednom od četiri principa: svježine, učestalosti, kvalitete i utjecaja [1]. Memorija zasnovana na principu svježine nam daje za svako rješenje (ili atribut) najbližu iteraciju u kojem je rješenje odabrano, dok nam memorija zasnovana na principu učestalosti daje za svako rješenje (ili atribut) broj njegova odabira. Memorija zasnovana na principu kvalitete nam omogućava da razlučimo potencijalno dobra rješenja od loših, a memorija zasnovana na principu utjecaja  nam daje informacije o najkritičnijim odlukama.

Ovako definiran algoritam se vrlo lako može izmijeniti ili nadopuniti u cilju poboljšanja njegovih karakteristika, a dokaz tomu su i unaprijeđene varijante tabu pretraživanja poput robusnog tabu pretraživanja ili reaktivnog tabu pretraživanja [1, 2].

2.2.5       Pretraživanje promjenjivom okolinom

Pretraživanja promjenjivom okolinom (Variable Neighborhood Search,VNS) je metaheuristički algoritam koji se zasniva na promjeni okoline (susjedstva) prilikom traženja optimalnog rješenja. Postoje različite inačice algoritma, a sve su međusobno slične. Za sve varijante je karakteristično da prvo izaberu konačan skup susjednih struktura Nk(k=1,...,n) i generiraju početno rješenje r, a međusobno se razlikuju u načinu korištenja susjednih struktura prilikom pretrage prostora rješenja. Skup susjednih struktura se tipično odabire tako da vrijedi |N1| <...<|Nk|. U nastavku će se opisati najpoznatije inačice, a opisivanje započinjemo sa osnovnim VNS-om.

Osnovni VNS (Basic VNS, BVNS), kao i druge inačice, prvo izabere skup susjednih struktura i generira početno rješenje. Tijelo algoritma je ostvareno dvjema petljama. Vanjska petlja čini ciklus koji se prekida kada je zadovoljen zaustavni kriterij. Ugniježđena petlja traži optimalno rješenje kroz n susjedstava i u njoj razabiremo tri

Izaberi skup susjedstva N[n];

Brojilo k=1,...,n;

r=generiraj_rješenje();

dok(zaustavni_kriterij != zadovoljen){

   k=1;

  dok(k <= n){

        r2=slučano_odaberi(N[k]);

        r3=lokalno_pretraživanje(N[1],r2);

        //f je funkcija koja se minimizira

        ako(f(r3) < f(r)){

            r=r3;

            k=1;

        }

        inače k++;

 }

} 

Slika 2.10 Pseudokod BVNS-a

dijela. U prvom dijelu se slučajno odabire rješenje iz k-tog susjedstva, gdje je k brojilo koje ovisi o broju iteracija petlje i valjanosti odabranih rješenja iz prethodnih susjedstava. Drugi dio predstavlja lokalno pretraživanje po nekom od susjedstava, pri

čemu početno rješenje predstavlja rješenje generirano iz prvog dijela petlje. Lokalno pretraživanje se uglavnom provodi nad prvim susjedstvom, a čak se može stvoriti posebno susjedstvo koje se ne nalazi u skupu izabranih susjedstava i nad njime vršiti lokalno pretraživanje. Rješenje koje dobijemo lokalnim pretraživanjem u trećem dijelu uspoređuje se s dosad najboljim rješenjem, i ukoliko je optimalnije, izabire se kao najbolje. U suprotnome se prelazi na potragu za najboljim rješenjem uz pomoć sljedećeg susjedstva (brojilo k se uvećava).

img12

Slika 2.11 Pretraživanje po različitim okolinama

Bitno je istaknuti da lokalni optimum u jednom susjedstvu ne znači nužno i lokalni optimum u drugom susjedstvu [13]. To nam unosi raznolikost u našu pretragu i donekle omogućava bijeg iz lokalnog optimuma. Bijeg iz lokalnog optimuma se zasniva na činjenici da dobro rješenje u jednom susjedstvu ne znači i dobro rješenje u drugom susjedstvu. To je posljedica različitih kardinalnosti susjedstava. 

Umjesto da u k-tom koraku nasumično izabiremo rješenja iz k-tog susjedstva i provodimo lokalno pretraživanje nad samo jednim susjedstvom, možemo napraviti poboljšanje tako da pronađemo najboljeg susjeda od trenutnog rješenja u k-tom susjedstvu. Ova inačica algoritma se naziva spuštanje promjenjivom okolinom (Variable Neighborhood Descent, VND).

...

r2=pronađi_najboljeg_susjeda(N[k],r);

//f je funkcija koja se minimizira

ako(f(r2) < f(r)){

r=r3;

k=1;

}

inače k++;

...

Slika 2.12 Pseudokod VND-a

U svrhu postizanja veće brzine, može nam poslužiti inačica algoritma poznata kao reducirano pretraživanje promjenjivom okolinom (Reduced VNS, RVNS). RVNS je isti kao i BVNS samo što nema lokalnog pretraživanja u svrhu poboljšanja slučajno izabranog rješenja iz susjedstva Nk. Vidimo da RVNS traži rješenje slučajno birajući rješenja iz različitih susjedstva. Činjenica da ne sadrži lokalno pretraživanje ga znatno ubrzava, ali je time dozvoljena veća učestalost pojave krivih rješenja.

Neka se rješenja traženog problema mogu rastaviti na komponente. Tada, u svakom koraku BVNS-a možemo svakom rješenju pridružiti točno k promjenjivih komponenti. Struktura susjedstva Nk izmijenjenog algoritma je jasno definirana, a prilikom lokalnom pretraživanja mijenjamo samo promjenjive komponente. Takva inačica algoritma se naziva  dekompozicijsko pretraživanje promjenjive okoline (Variable Neighborhood Decomposition Search, VNDS).

           

...

r2=slučano_odaberi(N[k]);

r3=lokalno_pretraživanje(N[1],r2,prom_komponente);

//f je funkcija koja se minimizira

ako(f(r3) < f(r)){

      r=r3;

      k=1;

}

inače k++;

...

Slika 2.13 Pseudokod VNDS-a

BVNS ne omogućava zamjenu rješenja r sa lošijim rješenjem r3. Ponekad bi ta zamjena mogla brže voditi do boljeg rješenja i vjerojatnijeg bijega iz lokalnog optimuma. Prihvaćanje lošijeg rješenja bi trebalo ovisiti o udaljenosti δ(r,r3) između r i r3, te o parametru α koji predstavlja važnost udaljenosti u ispitnom kriteriju. Izmijenimo li BVNS u skladu sa prethodnim razmatranjem dobivamo algoritam ukošenog pretraživanja promjenjivom okolinom (Skewed VNS, SVNS).

...

ako(f(r3)+ a*d(r,r3)< f(r)){

       r=r3;

       k=1;

}

inače k++;

...

Slika 2.14 Pseudokod SVNS-a

 

VNS skupina algoritama uspješno rješava kombinatorne probleme vezane uz kombinatornu strukturu  graf [1, 2, 13].