Monthly Archives: August 2007

LINQ – .NET Language Integrated Query I Dio


U nekoliko prethodnih postova pisao sam o novinama i proširenjim nove verzije C# 3.0. Proširenja koja su spomenuta omogućuju implementaciju LINQ (Language Integrated Query) kao nove tehnologije pristupa i manipulacije informacija u aplikaciji.

Uvod

U Posljednjih 20 godina razvoj programskih jezika došao je do stadija kada posjedujemo moćne objektno orijentisane programske jezike poput C++, C#, JAVA, i sl. Programeri danas koriste sve blagodati OOP poput klasa, objekata, nasljeđivanja, polimorfizma i sl. Možemo kazati da je era OOP došla do svog vrhunca kada se počela razvijati tehnologija upravljanja i kontrole curenja memorije u programskim jezicima. U posljednjih nekoliko godina postavlja se pitanje šta dalje i u kom pravcu razvijati programske jezike, na način da pomažu programerima u razvijanju softvera.

Jedan pravac u kojem se ide, a koji je posljednjih nekoliko godina sve više zastupljen je razvijanje IDE alata za automatsko generiranje koda tzv. Rapid Application Developmen (RAD). Danas kad pogledamo software za razvoj aplikacija vidimo mnogo ugrađenih alata za generiranje raznih, uglavnom ponavljajući sekvenci izvornog koda. Danas se aplikacije razvijaju na način da imate osjećaj kako radite u nekom od klasičnih softvera za crtanje: povlačite stavke iz kutija sa alatima, dijagramski pišete klase i dodajete metode, članove, nasljeđivate klase itd.

Sagledavajući današnju tehnologiju i pravac u kome se razvija buduća tehnologija svakako je smanjivanje kompleksnosti pristupa i integracije informacijama koja nije prirodno povezana se OPP. Naime, gotovo svaka aplikacije manipuliše određenim podacima koji su po prirodi stvari odvojeni od same aplikacije. Podaci kojim manipulišemo dolaze uglavnom iz dva glavna izvora, a to su relacijske baze podataka i XML.

Manipulacija sa podacima koji dolaze iz ova dva izvora programera više stvara svestranijim nego stručnijim, jer nužno stvara uslov poznavanja drugih tehnologija osima primarne tehnologije razvoja aplikacija u određenom programskom jeziku. LINQ projekat se bazira na problemima manipulacije podataka opisanih prethodno.

LINQ kako i sam naziv govori je sastavni dio primarnog programskog jezika, koji sa sastoji od standardnih operatora upita za manipulaciju, projekciju, filtriranje sa podacima na način sličan kako se to radi pomoću SQL. Izvor podataka nad kojim se vrše upiti ne ograničava se samo na eksterne izvore podataka, nego na generalno svaki izvor podataka kako eksterni tako i interni – aplikacijski izvor podataka. Ovo omogućuje da programer ostaje u svom primarnom programskom jeziku dok manipuliše podacima iz izvora podataka.

Aplikacija standardnih operatora upita mogu se primjeniti na svaki izvor podataka koji je izveden iz IEnumerable<T> interfejsa.

Ovo omogućava da se razvijaju komponente trećih strana koje podržavaju LINQ, i koje mogu zamjeniti standardne operatore sa svojom vlastitom implementacijom, a samim tim se stvara široka lepeza primjene LINQ.

Upoznavanje sa LINQ

Za početak pogledajmo jednostavan program koji koristi standardne operatore upita primjenjene na polje stringova.

Ako ovaj program pokrenemo kao rezultat ćemo dobiti sve gradove koji se sastoje od 5 slova.

Kao što smo naglasili svaki tip koji je izveden iz IEnumerable<T> interfejsa podržava LINQ operatore. U našem primjeru koristili smo 3 standardna operatora upita: select, where, orderby. Isti primjer možemo napisati bez dotičnih operatora na sljedeći način:

Argumenti koji se pojavljuju u metodama standardnih upita zovem lambda izrazi , oni obezbjeđuju da se standardni operatori upita definišu posebno kao metode i spajaju lančano korištenjem tačka notacije.

Izvršavanje LINQ upita

U prethodnom primjeru značajno je kazati da se evaluacija upita ne dešava u trenutku njegovog deklarisanja. Evaluacija upita se dešava u onom trenutku kada pristupamo varijabli odnosno u našem primjeru evaluacija upita vrši se u bloku koji je označen naredbom foreach. Ovakva odgođena evaluacija upita upit čini fleksibilnim i dozvoljava izvršavanje više puta. Pretpostavimo sljedeći primjer:

Ako pokrenemo aplikaciju rezultat dobivamo:

Upit se evaluira svaki put kada smo iterirali varijablu izraz. Cjelokupan text u 5 dijelova koji je napisan o LINQ možete skinuti odavde.

Advertisements

Ultimate Toolbox, Grid i TCP/IP u open source verziji


Jedna od najpoznatijih kompanija koja razvija komponente bazirane na MFC C++ u posljednjih 15 godina bila je zasigurno Dundas Software’s. Njihovi proizvodi imali su prefiks Ultimate (UltimateGrid, UltimateToolbox, UltimateTCP/IP). U januaru 2005 godine David Cunningham and Chris Maunder (osnivač Code Project zajednice) osnivaju firmu TheUltimateToolbox.com, te izdvajaju iz Dundas Software’s Ultimate proizvode. U prethodnih nekoliko dana na Code Project zajednici objavljen je niz članaka u kojima se ove komponente nakon više od 10 godina otvaraju u Open Source verziji. Ove komponente mogu skinuti članovi Code Project zajednice jedne od najvećih zajednica koje razmjenjuju informacije o microsoftovim tehnlogijama C++,MFC, ATL, VB, C#, VB .NET, ASP itd. Više informacije o ovim komponentama možete dobiti ovdje. Naravo morate se učlaniti da bi skinuli cijeli source code.

O CodeProject.com

Ova zajednica broji preko 4,5 miliona članova, u svakom trenutku je preko 15000 članova online. Mogu se pohaviti da sam jedan od prvih članova ove zajednice (657 član od 6. Jula. 2000). Ako se želite baviti programiranjem na nekoj od microsoftovih tehnologija vaš izvor informacija na kojoj možete naći skoro sve što vas zanima je upravo www.codeproject.com.

ADODB Data Link – povezivanje sa bazom podataka


Primjer upotrebe Data Link dijaloga u povezivanju sa bazom podataka. Aplikacija je urađena u C# 2.0 VS2005. Uključen i primjer sa izvornim kodom.

Data Link dijalog je COM objekt pomoću kojeg na jednostavan način definišemo konekciju sa određenim provajderom baze podataka. Nakon podešavanja provajdera potrebno je podesiti server ili putanju do baze podataka (u zavisnosti od provajdera) za validan string konekcije.

U ovom primjeru biti će prezentirana jednostavna demo aplikacija koja poziva Data Link dijalog uzima string za konekciju sa bazom podatka, te pohranjuje isti u user.config datoteku koja obezbjeđuje stalnost stringa za korištenje.

Data Link

Slika 1 Data Link u akciji

DATA LINK Demo

Data Link demo je jednostavna aplikacija koja se sastoji od jedne forme u kojoj preko dugmeta “DataLink” pozivamo Data Link dijalog podešavamo konekciju stringa te isti prikazujemo u edit kontroli. Zatim isti string pohranjujemo u config datoteku.

Na narednoj slici prikazana je demo aplikacija sa kontrolama za manipulaciju da data link dijalogam.

String konekcije

Slika 2 Data Link Demo aplikacija

Prilikom aktivacije klika na dugme DataLink izvršava se sljedeći dio koda za upravljanje sa događajem button1_Click.

void button1_Click(object sender, EventArgs e)
{
    try
    {
        //Izlvacenje tipa šrograma pomocu refleksije
        Type type = Type.GetTypeFromProgID("DataLinks");

        //Formiranje instance dijaloskog okvira Data Link</span>
        object</span> links = Activator.CreateInstance(type);
        //Pojavljivanje dijaloga pomocu kojeg podesavamo konekciju</span>
        object str1 = type.InvokeMember("PromptNew", BindingFlags.InvokeMethod, null, links, null);

        //data link posjeduje osobinu "Connectionstring" u koju pohranjuje konekciju stringa koju smo upravo podesili
        object s = str1.GetType().InvokeMember("ConnectionString", BindingFlags.GetProperty, null, str1, new object[0]);

        //Provjera da li je vracena varijabla ( "ConnectionString" ) validna</span>
        if (s != null)
        {
            //Vracena varijabla je tipa string sto mozemo lako konvertovati</span>
            string strBuid = (string )s;

            //Zapis konekcije string u Edit kontrolu
            textBox1.Text = strBuid;

            //Pohranjivanje stringa konekcije u user config datoteku</span>
            Properties.Settings.Default.Save();

        }
    }

    catch (System.Exception ex)
    {
        MessageBox.Show(ex.Message);
        return;
    }
}

Pohranjivanje konekcija u config datoteku

Kada smo implementriali data link i string konekciju potrebno je isti pohraniti izvan memorije aplikacije da bi se uspješno mogao koristiti prilikom svakog startanja aplikacije. U tom smislu potrebno je definisati varijablu u settings.settings kategoriji a zatim povezati sa textmom edit kontrole. Na narednoj slici prikazan je način definisanja varijable u config datoteci

Pohranjivanje stringa u config datoteku

Slika 3 Definisanje varijable u confg datoteci

Prilikom definisanja varijable potrebno je definisati naziv varijable, tip, te inicijalu vrijednost (Name,Type, Value respektivno). Kolona pod nazivom scope označava na kojem nivou se varijabla definiše. U ovom kontekstu postoje dva nivoa:

  1. User – definisanje varijable na novou korisnika, to znači ako postoji više korisničkih računa u Windows OS, svaki račun će definisati varijablu zasebno. Config datoteka se pohranjuje u [DISK]:\Documents and Settings\[Naziv računa]\Local Settings
  2. Application – definisanje varijable na novou aplikacije i svi windows računi će dijeliti istu vrijednost varijable.

Nakon definisanja varijable potrebno je istu povezati sa textom edit kontrole u glavnoj formi aplikacije. Naredna slika pokazje pridruživanje varijable edit kontroli. Nakon pridruživanja potrebno je implementirati da se string konekcije iz edit kontrole zapiše u config datoteku. Ovo postižemo pozivom :

//Pohranjivanje stringa konekcije u user config datoteku
Properties.Settings.Default.Save();

Definisanje varijable

Slika 4 Povezivanje teksta edit kontrole varijabli stringKonekcije

Kompletan primjer sa izvornim kodom možete skinuti ovdje.

C# 3.0 var keyword


U nekoliko prethodnih postova sam pisao o novinama koje dolaze izlaskom C# 3.0. Jedna od novina koje su pobudile veliko interesovanje programera je novi tip var . Opis novog tipa ću pokušati objasniti na primjerima i specifičnostima njegove upotrebe.

Npr. imamo sljedeći kod:

var intVNumber = 23;
var strVRijec = "Vozdra Svijete";

Ovo znači da tip var neka vrsta zajedničkog tipa, koji može sadržavati bilo koji type. Ovo može zvučati kao izmišljanje tople vode, jer sve to može raditi i object tip.

Npr:

object objNumber = 23;
object objRijec = "Vozdra Svijete";

Međutim pogledajmo sljedeći dio koda:

intVNumber ++; //Kompajler ne prijavljuje nikakvu grešku jer je var uistinu tipa intint
objNumber++; //error CS0023: Operator '++' cannot be applied to operand of type 'object'

Ovo znači da nema govora o tome kako object može zamjeniti ovu riječ. Da bi se uvjerili u to pokušajmo kompajlirati sljedeći dio koda:

int VNumber = objNumber; //error CS0266: Cannot implicitly convert type 'object' to 'int'. An explicit conversion exists (are you missing a cast?)

Ali ovaj dio koda će se kompajlirati:

int VNumber = (int)objNumber;

Još jedna krucijalna stvar koja var tip razlikuje od tip object je nrp kada pokušamo kompajlirati sljedeći dio koda:

int VNumber=strVRiječ; // error CS0029: Cannot implicitly convert type 'string' to 'int'

Ovo znači da var u svojoj deklaraciji poprima jedan od tipova, koji se više ne može dinamički mijenjati tokom životnog vijeka ove varijable. Za razliku od var, object može poprimati različite tipove.

objNumber = objRijec;//Kompajler ne prijavljuje grešku

Pogledajmo sljedeći dio koda:

var objVarijabla=objNumber; //objVarijable je tipa object

Sada možemo pisati:

objVarijabla = "Vozdra Svijete";
objVarijabla = 123.456;objVarijabla = 's';

U ovom slučaju var objVarijabla inicijalizirana je sa varijablom tipa object, što znači da objVarijabla sada ima sve osobine tipa object.

Osobine var tipa

Nekoliko limitirajući osobina ovaj tip čini specifičnim:

Kada deklarišemo var tip tada mora postojati i inicijalizacija istog npr:var xvarijabla; // Greška, ne postoji inicijalizacija koja bi ukazivala na određeni tip

var xKolekcija = {1, 2, 3}; // Greška, inicijalizacija kolekcije nije dozvoljena
var xNull = null; // Greška, null tip nije dozvoljen

var

tip deklariše se samo kao lokalna varijabla, te ne može biti prosljeđena preko funkcije u bilo kojem obliku

public int Increment(var intNumber){return intNumber +=23;}

Kompajler će prijaviti grešku: error CS0825: The contextual keyword ‘var’ may only appear within a local variable declaration

Kao i u prethodnim zaključcima novine u C# 3.0 vežu se za LINQ Language integrated query, pa tako i tip var.

Genetic programming – Genetsko programiranje (GP)


Pojam “Genetsko programiranje” za čitaoce koji nisu upućeni u ovu temu pomisliće da se radi o nekakvom genetskom inžinjeringu, kloniranju i svim onim temama koji su vezani za genetiku. Međutim, nije tako. Genetsko programiranje je prvenstveno inženjerska metoda koja rješava određene probleme iz domena statistike, modeliranja inženjerskih problema, i šire. Metoda se široko koristi od komponovanja muzike do izračunavanja određenih kalkulacija u istraživanju svemira. Moje prvo upoznavanje sa Evolucijskim algortmima bilo je prošle godine na predavanju u sklopu postdiplomskom studijia na Tehničkom fakultetu u Bihaću. Iskreno na početku sam bio zbunjen, a malo kasnije definitivno odlučio primjenjivati tamo gdje god je to efikasno i provodljivo.

Naime o čemu se radi…

Sredinom 60-tih godina profesor Holland je prvi razvio metodu rješavanja problema optimizacije genetskim algoritmom. Njegov student Goldber razvio je i usavršio metodu za rješavanje kompleksnih problema optimizacije. 1989 godine Goldber objavljuje knjigu koja se poslije javlja kao inspiracija i startna tačka skoro svih metoda razvijenih na bazi evolucijskog programiranja.

Kroz primjer pokušat ćemo da objasnimo osnove Genetskog algoritma kao preteče genetskog programiranja. Na primjer, posmatrajmo funkciju y=f(x). Kad postavimo problem određivanja optimuma ove funkcije, prvo što nam na um pada je da izračunamo derivaciju funkcije, te izjednačimo je s nulom i riješimo matematičku jednačinu. Međutim, šta ako funkcija nije derivabilna, odnosno neprekidna u nekom intervalu (što je čest slučaj realnih procesa), šta ako ona ima više od 3 nezavisno promjenjive. U tom slučaju koristićemo iterativne metode postepenog približavanja datom cilju (jer su jednostavnije i lakše primjenjive pomoću računara). Međutim, za više nezavisnih varijabli (10, 20 pa čak i 100) ovaj problem postaje vrlo složen. Ista je situacija ako je funkcija vrlo kompleksna matematička jednačina. Čak idemo do toga da je funkcija y=f(x), skup diskretnih brojeva, odnosno skup eksperimentalnih podataka. U tom slučaju prstupi ćemo korištenjem regresijske analize i Gausove metode izračunavanja najmanjih kvadrata, prevođenjem eksperimentalnih rezultata u polinomni oblik, te opet tražiti derivaciju polinoma u odredjenom intervalu itd …

Svi navedeni problemi (kod rješavanja optimizacije) upravo su prednosti Genetskog algoritma. Sumiranjem iznesenog možemo navesti prednosti korištenja Genetskog algoritma (GA) i to:

  1. Optimizacija kako kontinualnih tako disketnih varijabli
  2. Neprekidnost funkcije (derivabilnost) nije potreban uslov
  3. Simultano traženje rješenja iz širokog skupa mogućih rješenja, inteligentno približavanje tačnom riješenju
  4. Uspješno se primjenjuje kod velikog broja nezavisno promjenjihvih varijabli
  5. Nema tendenciju padanja u lokalne optimume (veliki problem klasičnih metoda)
  6. Uspješno se primjenjuje nad generiranih podacima – eksperimentalnim ili analitičkih funkcija

A sad malo teorije….

GA počinje definisanjem strukture hromosoma. Ako hromosom ima Nvar (Nvar dimenzionalni optimizacijski problem ) određen sa p1,p2,p3,…,pn, tad se hromosom može odrediti kao vektor od Nvar koordinata:

hromosom=[ p1,p2,p3,…,pn],
gdje je p1,p2, …pn, binarni, cijeli ili realni brojevi koji reprezentiraju (predstavljaju) hromosom.

Npr. ako rješavamo optimizacvijski problem sa dvije nazavisne varijable tada je:
vrijednost=f(hromosom)=f(x,y)

Varijable u GA odnosno hromosome prikazujemo binarno (binarnim brojevima), cijelim ili realnim brojevima. Zavisno od prirode procesa kojeg optimiziramo, primjenjuje se i adekvatan tip hromosoma.

Selekcija je proces kojim se osigurava prenošenje boljeg genetskog materijala iz generacije u generaciju. Postupci selekcije međusobno se razlikuju po načinu odabira hromosoma koji će se prenijeti u sljedeću generaciju.
Prema načinu prenošenja genetskog materijala selekcije se dijele na (slika 3.3):

  • Generacijske selekcije -proces odabire najbolje jedinke i od njih kreira novu generaciju.
  • Eliminacijske selekcije – proces selekcije eliminira najgore jedinke iz te generacije.

Ukrštanje je proces u kojem se od dva roditelja, parenjem njihovih gena, dobiju jedan ili dva hromosoma koji predstavljaju njihovo potomstvo. Ukrštanje u GA pomoću računara uveliko zavisi od tipa hromosoma. Kada je hromosom prikazan u obliku vektora bitova (binarni hromosom) postoji nekoliko načina ukrštanja.

Ukrštanje binarnog hromosoma dijelimo na:

  1. Ukrštanje s jednom tačkom prekida
  2. Ukrštanje s dvije tačke prekida
  3. Jednoliko ukrštanje – provodimo kao logičke operacije nad bitovima, AND, OR, XOR itd. Npr. Ako su roditelji A i B, tada je POTOMAK= A + XOR(A * B).

ukrstanjegena
Ukrštanje hromosoma s jednom tačkom prekida

Mutacija kao i sama pojava u prirodi dovodi do toka da se u hromosomu ili jedinci unosi potpuno novi genetski materijal. Ona uglavnom potpomže da se izbjegne “padanje” u lokalni optimum funkcije cilja. Primjenom mutacija postiže se raznolikost genetskog materijala i omogućava pretraživanje novih – potencijalno najboljih rješenja.

mutacijagena
Mutacija hromosoma predstavljeni binarnim brojevima

Kad svi geni u jednom hromosomu postanu jednaki, vrijednost hromosoma se ne može promijeniti putem ukrštanja, nego mutacijom, gdje se postiže da upravo takvi dijelovi u hromosomu budu promjeni.

Parametri GA odredjuju način evolucije hromosoma u populaciji te njihovim podešavanjem možemo znatno smanjiti vrijeme izvodjenja algoritma, agresivnost s kojom će algoritam konvergirati u optimum.

Parametri GA:

  1. veličina populacije M,
  2. broj iteracija I
  3. vjerojatnost mutacije vm
  4. vjerojatnost ukrštanja vu
  5. metoda selekcije

Ovisno o tipu hromosoma, vrsti selekcije mogu se pojaviti i neki parametri svojstveni npr. binarnom hromosomu kao što je dužina hromosoma, selekcijski pritisak kod turnirske selekcije, itd.

Vjerojatnost mutacije je jedan od najvažnijih parametara optimizacijskog GA, i direktno uslovljava izbjegavanje padanja u lokalni optimum funkcije cilja.

Pored vjerojatnosti mutacije veličina populacije (M) je parametar koji direktno utiče na kvalitet dobijenih rješenja. Medjutim to je i parametar koji naviše utiče na brzinu kompjuterske obrade GA. Ovaj parametar je u direktnoj vezi sa brojem iteracija. Što je veličina populacije manja potrebno je smanjiti i broj iteracija, i obrnuto.

Broj iteracija takodjer utiče na vrijeme obrade algoritmai na kvalitetu dobijenih rješenja. Što je veći broj iteracija to su i rješenja kvalitetnija. Obzirom da je cilj da se za što kraće vrijeme dobiju što kvalitetniji rezultati, cilj svakog istraživanja pomoću GA je da se minimalnim brojem iteracija i veličine populacije dobiju zadovoljavajuća riješenja.

Pokušaja da se parametri GA povežu i formira njihova medjuzavisnost uvijek je rezultirala neuspjehom, te se došlo do činjenice da rješenje jednog problema nema uticaja za rješavanje nekog drugog primjenom istih parametara.

Obzirom da se GA izvodi pomoću računara moguće je da se parametri GA dinamički mjenjaju u toku izvodjenja algoritma, tako da se npr. poslije 500 iteracija mijenjaju parametri GA, ako algoritam nije u tom razmaku ponudio bolje rješenje.

GENETSKO PROGRAMIRANJE

Ideja genetskog programiranja (GP) došla je kao generalizacija GA. Obzirom da u GA vršimo manipulaciju sa hromosomima koji predstavljaju binarne prirodne ili realne brojeve, moguće je formirati hromosome koji predstavljaju kompjuterske programe nad kojim bi vršili operacije ukrštanja i mutacije i tako dolazili do kompjuterskog programa koji bi rješavao odredjeni problem. Ovu metodu prezentirao je John Koza 1990 godine. Slično kao kod GA u GP razvijena je metoda reprezentacije hromosoma.

U GP hromosomi u populaciji su u obliku hiearhijske strukture sastavljani od primitivnih funkcija i terminala za pojedina problemska područja.

Skup primitivnih funkcija od kojih su hromosomu sastavljani čine aritmetičke operacije, matematičke funkcije, bulove logičke operatore i posebne funkcije specifične za pojedine probleme.

Skup terminala koji takodjer čine strukturu hromosoma obično su sastavljani od ulaznih parametara procesa i različitih numeričkih konstanti.

Kompozicija primitivnih funkcija i terminala kao ideja pronadjena je u programskom jeziku LISP, gdje se takve kompozicije nazivaju simbolički izrazi ili S-izrazi. Simbolički izrazi predstavljaju se kao binarno uređeno drvo, gdje je korijen i ostali unutrašnji čvorovi binarnog drveta označeni sa funkcijama, dočim su vanjski čvorovi označeni terminalima. Tako definisan algoritam pretražuje rješenje problema u prostoru svih mogućih kompozicija funkcija, koje se rekurzivo generišu od dostupnih primitivnih funkcija, i terminala.

U GP populacija sastavljenja od hromosoma se razmnožava po Darwinovom principu opstanka i reprodukcija najprilagođenijih; preko genetskog reproduciranja (ukrštanja) operacija prilagodjenih parenju kompjuterskih programa.

GP kao i GA počinje inicijalizacijom početne populacije slučajno odabranim kompjuterskim programima sastavljanim od funkcija i terminala. Svaki kompjuterski program (hromosom) u populaciji evaluira se u smislu kako dobro riješava problem. Analogno GA ovo mjerenje zovemo mjerenje funkcije cilja hromosoma.

Hromosome u GP predstavljamo u obliku binarnog drveta. Korijen i unutrašnji čvorovi sastavljeni su od funkcija dok su vanjski čvorovi sastavljeni od terminala.

Pretpostavimo kompjuterski program (hromosom): (+,(*,a,b),(ln,c)) , njegova reprezentacija predstavljena je na sljedećeoj slici.

gphromosom
Reprezentacija hromosoma u GP (a*b+ln(c))

Program uzima 3 terminala a,b,c i 3 algebarske funkcije sabiranja, množenja, i prirodnog logaritma. Kompjuterski program u prirodnom obliku možemo prikazati kao: a*b+ln(c), gdje su a,b,c ulazni prarametri problema ili slučajno generirane konstante.

U GP kompjuterski programi ukrštaju se shodno Darwinovom principu reprodukcije i opstanka najprilagodjenijih jedinki. Slučajnim odabirom dva kompjuterska programa (hromosoma) iz populacije ukrštamo i na način de se slučajno odabere tačka ukrštanja te se genetski materija razmijeni izmedju roditelja stvarajući na taj način potomke.

Donja slika predstavlja ukrštanje dva kompjuterska programa.

ukrstanjegp

Ukštanje u GP

Slučajno izabrane tačke ukrštanja u oba kompjuterska programa označavaju koje čvorove programi će razmijeniti i tako generirati svoje potomke.

Kao i kod GA mutacija predstavlja unošenje novog genetskog materijala u kompjuterski program. Mutacija se ivodi tako što se slučajno izabere čvor koji će mutirati te se slučajno generira simbol koji predstavlja uniju skupa funkcija i terminala. Donja slika predstavlja primjer mutacije kompjuterskog programa, gdje je čvor sa oznakom funkcije ln mutirao u funkciju /. Obzirom da funkcija / zahtjeva dva argumenta slučajno se generira drugi argument iz skupa terminala ili funkcija. Obzirom da kod mutiranja ovakav proces može se neprekidno generirati, organičenja u pogledu dubine mutiranja čini sastavni dio parametara GP.

mutacijagp

Mutacija u GP

Početna struktura u GP sadrži jedinke u početnoj populaciji sastavljene od slučajno generiranih S -izraza. Početak generiranja počinje slučajnim odabirom jedne od funkcija i skupa F. Ovo ograničenje korijenskog čvora samo na skup funkcija je iz razloga da se strukture ne degeneriraju u samo jedan čvor.

Nakon generiranja koriejnskog čvora postoji nekoliko metoda generiranja strukture.

Puna (Full) metoda generiranja

Kod pune metode generiranja struktura drveta je odredjena konstantnom veličinom dubine strukture. Punom metodom generiramo binarno drvo iz skup funkcija sve dok se ne dostigne maximalna novo (dubina) strukture. Kada se to desi generiraju se simboli iz skupa terminala T.

Rastuća (GROW) metoda generiranja

Rastuća metoda sastoji se u slučajnom generiranju strukture. Ovakvo generiranje proizvodi oblike strukture različitim. Metoda kreće sa slučajnim generiranju čvora koji popima vrijednosti iz skupa C=F U T, odnosno skupa funkcija i terminala. Ovakva metoda ograničena je uslovom da dubina ovako generirane strukture može biti u intervalu 0 do maksimalne dubine drveta. Ako struktura dostigne maksimalnu dubinu drveta u tom nivou se prisiljava algoritam da poprimi vrijednost terminala, a samim tim i završava generiranje.

Miješana (“ramped half-and-half“) metoda generiranje

Ovu metodu autor GP preporuča za mnoge problema koji se rješavaju sa GP. Suština ove metode je da se iskoriste prednosti obe pomenute metode. Iz tog razloga ova metoda se zove još i mješana metoda generiranja. Metoda se jednostavno pojašnjava na primjeru: Npr. ako je

6 maksimalna dubina drveta, tada 20% početne populacije će sadržavati binarne strukture od 2 nivoa dubine, 20% 3 nivoa, 20% 4 nivoa, itd sve do 6 nivoa (1). Tada populacija u ovom stanju sadrži 50% binarnih struktura koje su generirane rastućom metodom, a 50 % punom metodom.

Evaluacija funkcije cilja u GA i GP

Svaki genetski algoritam zahtjeva implementaciju ocjene jedinke. Podobnost neke jedinke – hromosoma ili (S- izraza u GP) mjera je kvalitete toga riješenja u zadanom prostoru rješenja. Kod problema rješavanja optimizacije u GA podobnost hromosoma predstavlja optimalnu vrijednost funkcije cilja. Kod simboličke regresije u GP podobnost jedinke mjeri se odstupanjem kompjuterskog programa od stvarnog rješenja. Zavisno od problema kojeg rješavamo genetskim algoritmima zavisi će i evaluacija hromosoma u populaciji.

PS

Ovo je dio teksta prezentiranog u naučnom radu kojeg sam zajedno sa prof. dr. M. Jurkovićem objavio pod naslovom: MODELLING AND OPTIMIZATION OF THE TOOL STRESS IN DRILLING PROCESS BY EVOLUTION ALGORITHMS by Milan Jurković, Bahrudin Hrnjica, INTERNATIONAL CONFERENCE ON MANUFACTURING SCIENCE AND EDUCATION- MSE 2007- SIBIU-ROMANIA

Backup & Restore MS SQL baze podataka u C#, koristeći SMO


Na nekoliko foruma pisao sam oko manipulacije bazom podataka u MS SQL. Tematika je bila kako iz klijent aplikacije manipulisati sa bazom podataka, prvenstveno prilikom arhiviranja i restauracije. Tehnologiju koji Microsoft preporuča, a tiče se manipulacije bazom podataka u .NET programskim jezicima je SMO (SQL Management Objects). Ova tehnologija je nova, jer je uvedena pojavom MS SQL Servera 2005. Prijašnje tehnologije koje su bile zastupljenje u SQL Serveru 2000 ticala se alata koji su bili razvijani na COM tehnologiji.

Jedan od najčešće postavljanih pitanja je kako iz klijent aplikacije izvršiti backup baze podataka. A poslije tog pitanja slijed a kako stvoreni backup vratiti na SQL server.

U daljenjm tekstu prikazane su dvije metode koje vrše backup i restore baze podataka. Prije korištenja ovih metoda dobro je malo se upoznati sa SMO tehnologijom.

Implementacija

using System.Data.SqlClient;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using System.Collections.Specialized;</code>

// Backup baze podataka.
public static void BackupDatabase(string strConnString, string backUpName, string backUpPath, DateTime datumIsteka)
{
try
{
string dbName;
using (SqlConnection cnn = new SqlConnection(strConnString))
{
  cnn.Open();
  dbName = cnn.Database.ToString();
  //Konekcija na server
  ServerConnection sc = new
  ServerConnection(cnn);
  Server sv = new
  Server(sc);
  // Formiranje uredjaja
  BackupDeviceItem bdi = new
  BackupDeviceItem(backUpPath+"\\" + backUpName+".bak", DeviceType.File);

  // Forimiranje informacija o backupu
  Backup bk = new
  Backup();
  bk.Devices.Add(bdi);
  bk.Action = BackupActionType.Database;
  bk.BackupSetDescription = "SQL Express backuping..!";
  bk.BackupSetName = backUpName;
  bk.Database = dbName;
  bk.ExpirationDate = datumIsteka;
  bk.LogTruncation = BackupTruncateLogType.Truncate;
  // Pokreni backup
  bk.SqlBackup(sv);
  System.Windows.Forms.MessageBox.Show("BackUp je uspješno izveden!");
}
}
catch (System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}

// Restauracija backupa
public static void RestoreBackup(string strConnString,string restorePathWithFileName)
{
try
{
string dbName;
using (SqlConnection cnn = new SqlConnection(strConnString))
{
cnn.Open();
dbName = cnn.Database.ToString();
cnn.ChangeDatabase("master");

ServerConnection sc = new
ServerConnection(cnn);
Server sv = new
Server(sc);
BackupDeviceItem bdi = new
BackupDeviceItem(restorePathWithFileName, DeviceType.File);

// formiranje restor objekta
Restore resDB = new
Restore();

resDB.Devices.Add(bdi);
resDB.NoRecovery = false;
resDB.ReplaceDatabase = true;
resDB.Database = dbName;

// restauracija baze
resDB.SqlRestore(sv);
System.Windows.Forms.MessageBox.Show("Restauracija je uspješno izvedena!");
}
}
catch (System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}