Global Minimum J++ V 1.0

Ávadas:

Tai yra optimizavimui skirtos programinës árangos paketas perraðytas JAVA kalba. Kol kas yra pervesti tik globalûs optimizavimo metodai. Apie naujø metodø prijungimà pakalbësime vëlesniuose skyreliuose. Pati programa nelabai skiriasi nuo C++ versijos ir jos naudojimas yra labai panaðus. Programos failus galite rasti adresu http://www.soften.ktu.lt/~krapau/GM. Ðiuo adresu jûs matysite failus *.class, priklausanèius programai, bei tø failø iðeities tekstus *.java. Taip pat rasite failà gm.html (jo prireiks jei norësite vykdyti programà su interneto brauserio pagalba) bei keletà *.gif failø, kuriuose saugojami programos tituliniai paveikslëliai. Jeigu norësite programà modifikuoti prijungdami savo uþdaviná jums reikës parsisiøsti Visus *.class failus bei failà Task.java, kuriame ir apraðoma optimizuojama funkcija. Þinoma jums prireiks ir visø kitø *.java failø jei norësite dël kokios nors prieþasties perkompiliuoti visà programà. Tam kad bûtø patogiau ir nereikëtø siuntinëti reikiamø failø po vienà, aukðèiau minëtu adresu rasite archyvà gm_unix.tar. Jame yra sudëti visi failai, kokiø tik gali prireikti kartu su visais iðeities tekstais. Taip pat pridëtas ir ðis apraðymas Global_Minimum.html ir Global_Minimum.doc formose. Iðsiarchyvuoti galite panaudodami tar -xf gm_unix.tar komandà.

Pastaba: Programa archyve gm_unix.tar kompiliuota su JDK 1.0.2 Windows 95 aplinkoje, nes bûtent ðio kompiliatoriaus generuojamas kodas pasirodë priimtiniausias. Taip pat programà buvo bandyta kompiliuoti su JDK 1.0 bei Microsoft Visual J++ 1.0 trial (beta3) Windows 95 aplinkoje, bei JDK 1.0 beta ir JDK 1.1.4 unix aplinkoje. Kiekvieno kompiliatoriaus sugeneruotas kodas turi savø trûkumø.
Kodo trûkumai pastebëti kompiliuojant su Microsoft Visual J++ 1.0 trial (beta3). Vykdant minimizavimà Exkor metodu bûdavo iðmetama klaida Falling of the end of the code (programa vykdyta Netscape 3.0 ir 4.03 brauseriais Windows 95 aplinkoje). Tà patá darant su MS Internet Explorer 3.0 (taip pat Windows 95 aplinkoje) ðis paprasèiausiai nulûþdavo. Kitais bûdais vykdyti programà nebuvo bandoma.
Kodo trûkumai pastebëti kompiliuojant su JDK 1.0 ir JDK 1.0.2 Windows 95 aplinkoje. Ið esmës abiejø kompiliatoriø generuojamas kodas savo funkcinëmis savybëmis panaðus. Vienintelis jo trûkumas, jog vykdant já JDK 1.1.4 unix-ui skirto vietinio interpretatoriaus javac ar appletviewer pagalba sutrinka langø perpieðimas atsidarant naujus grafinius dialoginius langus. Ðios problemos galima iðvengti perkompiliuojant su JDK 1.1.4 unix-ui, taèiau tuomet atsiras kitos problemos (þr. kodo trûkumai pastebëti kompiliuojant su JDK 1.1.4 unix-ui). Naudojant JDK Windows 95 interpretatorius bei interneto brauserius Netscape 3.0, Netscape 4.03, Interernet Explorer 3.0 Windows 95 aplinkoje , taip pat kaip ir su Netscape 3.0 unix-ui, programa dirbo gerai. Kitais bûdais programà vykdyti nebuvo bandoma.
Kodo trûkumai pastebëti kompiliuojant su JDK 1.0 beta Unix aplinkoje. Ðio kompiliatoriaus patrartina visai nenaudoti, nes programa korektiðkai nedirbo nei naudojant vietiná interpretatoriø, nei Netscape 3.0 unix-ui aplinkoje. Vietinis interpretatorius (JDK 1.0 beta) visai nepaisë uþduodamø langø dydþiø iðplësdamas juos per visà ekranà ir net uþ jo ribø. Netscape 3.0 unix-ui nerasdavo kai kuriø metodø, todël nebuvo ámanoma uþdarinëti atidarytø langø ir dialogø. Kitais bûdais programà vykdyti nebuvo bandoma.
Kodo trûkumai pastebëti kompiliuojant su JDK 1.1.4 Unix aplinkoje. Perkompiliuojant visà programà (pagrindinis programos failas yra Gm.java) iðveda perspëjimà jog daugelis programos failø naudoja pasenusá API (depricated APIs), kurio naudojimo reikia vengti. Ið liko ta pati problema kaip ir kompiliuoant su JDK 1.0 beta: Netscape 3.0 unix-ui neranda kai kuriø metodø, todël neámanoma uþdarinëti atidarytø langø ir dialogø. Naudojant vietiná interpretatoriø (JDK 1.1.4 unix-ui) programa dirbo gerai. Kitais bûdais programà vykdyti nebuvo bandoma.

Uþdavinio prijungimas, kompiliavimas ir paleidimas:

Kai jau bûsite parsisiuntæ ir iðsiarchyvavæ programà savo pasirinktoje direktorijoje jûs galësite modifikuoti uþdavinio failà Task.java. Þemiau jûs matote ðio failo pradiná variantà:
import java.lang.Object;

class Task extends Object
{
// Number of variables
public static final int NUMBER_OF_VARIABLES = 3;
public double lowerBounds[];
public double upperBounds[];
public double initialPoints[];

public Task()
{
// Initialize upper and lower bounds or initial points here:

lowerBounds = new double[NUMBER_OF_VARIABLES];
upperBounds = new double[NUMBER_OF_VARIABLES];
initialPoints = new double[NUMBER_OF_VARIABLES];
for ( int i = 0; i < NUMBER_OF_VARIABLES; i++ )
{
lowerBounds[i] = -2.0;
upperBounds[i] = 2.0;
initialPoints[i] = 0.0;
}
}

static public final double f(double x[], int n)
{
return Math.cos(x[0]);
}
}

Kaip matome ðiame faile apraðoma uþdavinio klasë. Klasës kintamàjame NUMBER_OF_VARIABLES nurodomas kintmøjø, kuriø atþvilgiu bus vykdomas minimizavimas, skaièius.
Masyvuose lowerBounds bei upperBounds yra laikomos virðutinës bei apatinës kiekvieno kintamojo kitimo ribos. Nuliniame elemente - pirmam kintamajam, pirmame elemente - antram kintamajam ir t.t. Programa dialoginiame reþime leis ávesti tik toká kintamojo reikðmiø kitimo intervalà, kuris neiðeis uþ intervalo, uþduoto per lowerBounds ir upperBounds ribø. T.y. aukðèiau pateikto pavyzdþio atveju mes negalësime nei vienam kintamajam ávesti þemutinës intervalo ribos maþesnës uþ -2.0 bei virðutinës intervalo ribos didesnës uþ 2.0. Bûtina jog reikðmë uþduota lowerBound masyve bûtø maþesnë uþ atitinkamà reikðmæ upperBound masyve. Toks realizavimo bûdas pasirinktas tam, jog programa geriau kontroliuotø uþdavinio kintamøjø kitimo ribas tuo atveju, kai jos þinomos ir gali bûti aiðkiai apibrëþtos. Tokiu bûdu jums bus neleista minimizavimà atlikinëti su kintamøjø reikðmëmis, kuriø ðie paprasèiausiai negali ágyti.
Masyve initialPoints taip pat galite nurodyti pradiná skaièiavimo taðkà. Jis reikalingas tik Exkor metodui (taip pat kai kuriems lokaliems metodams, kurie gal bût bus realizuoti vëliau). Bûtina, kad ðis taðkas priklausytø intervalui uþduotam per lowerBounds ir upperBounds.
Masyvuose lowerBounds, upperBounds ir initialPoints uþduotos reikðmës bus programos naudojamos kaip reikðmës pagal nutylëjimà. Jei masyvas lowerBounds bus neapibrëþtas (jam nebus iðskirta atmintis lowerBounds = new double[NUMBER_OF_VARIABLES] komanda), tai þemutinë kiekvieno kintamojo reikðmiø intervalo riba bus priimta lygi -1.0. Jei nebus apibrëþtas upperBounds masyvas, virðutinë kiekvieno kintamojo reikðmiø intervalo riba bus priimta lygi 1.0. Neapibrëþus masyvo initialPoints visos pradinio taðko koordinatës bus prilygintos nuliui. Taigi jei jus tenkina kintamøjø kitimo ribos [-1.0;1.0] bei nulinës pradinës koordinatës visà klasës Task konstruktoriø galite iðmesti.
Jûsø uþdaviná turi apraðyti metodas f, gràþinantis minimizuojamà reikðmæ. Aukðèiau pateiktame pavyzdyje minimizuojama pirmojo kintamojo sinuso reikðmë.

Po modifikavimo failà Task.java reikia perkompiliuoti. Programinës árangos kûrimo laboratorijoje (soften.ktu.lt) tai galit atlikti javac Task.java komandos pagalba. Þinoma prieð tai reikia prijungti kompiliatoriaus modulius mod add jdk komanda (taip prijungiama JDK 1.1.4 versija).

Vykdymui galite naudoti interneto brauserá, jame atsidarydami failà gm.html. Galima naudoti komandà appletviewer gm.html. Taip pat galite naudoti vietiná java interpretatoriø: programà galite paleisti ávykdydami komandà java Gm. Priminsime jog Gm yra pagrindinës programos klasës pavadinimas. Visai nesvarbu kokiu ið aukðèiau minëtø kompiliatoriø sukompiliuojama Task klasë. Programos funkcinës savybës priklausys nuo to, koks kompiliatorius buvo naudojamas kitø klasiø kompiliavimui.
Patarimas: Dirbantiems Windows 95 aplinkoje jokiø problemø neturëtø iðkilti, jei jie naudos JDK 1.0 ar 1.0.2. Dirbantiems unix aplinkoje patartina persikompiliuoti visà programà su JDK 1.1.4, jei jie norës jà vykdyti vietinio interpretatoriaus pagalba (java, appletviewer). Bei kategoriðkai rekomenduojama kompiliuoti vien klasæ Task, jei jie norës vykdyti programà Netscape 3.0 pagalba.

Darbas su programa:

Darbo su programa pradþia priklauso nuo to, koká bûdà jos vykdymui pasirinksime. Jei programà vykdysime kaip apletà interneto brauseryje, ar naudodami komandà appletviewer gm.html, gausime langà su þemiau parodytu fragmentu:

Pagrindiná programos langà galime pamatyti nuspaudæ mygtukà Show. Vëliau taip pat galësime langà paslëpti, nuspausdami mygtukà Hide. Ðiø mygtukø pagalba atliekamos operacijos programos lango nesukuria ir nesunaikina. Jos paprasèiausiai já parodo arba paslepia. Programos pagrindiná langà galime sunaikinti pasirinkdami File, Exit meniu punktà, bei atsakydami Yes pasirodþiusiame programos uþdarymo patvirtinimo dialoge. Tokiu atveju aukðèiau parodytas paveikslëlis pasikeis á:

Nuspaudæ mygtukà Restart galësime sukurti naujà pagrindiná programos langà.

Visos ðios áþangos nebus, jei programà vykdysime vietinio interpretatoriaus pagalba (java Gm). Mes ið karto pateksime á pagrindiná programos langà:

Trumpai apie kiekvienà meniu punktà.
Per File mes galime iðsirinkti tik vienà meniu punktà Exit skirtà iðëjimui ið programos.
Global skirtas vieno ið ðeðiø globaliø optimizavimo metodø pasirinkimui. Galime pasirinkti Bayes1, Mig1, Unt, Exkor, Glopt ar Lpmin metodà.
Local skirtas vieno ið trijø lokaliø optimizavimo metodø pasirinkimui. Galima pasirinkti Nlp, Flexi ar LBayes metodà, taèiau kadangi nei vienas ið jø kol kas nëra realizuotas tai programa nekeisdama esamo metodo iðves perspëjimà.
Operations skirtas skaièiavimo valdymui. Punktas Run skirtas skaièiavimams pradëti arba jiems pratæsti jei skaièiavimai buvo laikinai sustabdyti, naudojant punktà Stop. Punktas Stop skirtas laikinam skaièiavimo sustabdymui, nesunaikinant paties skaièiavimo proceso. Skaièiavimo proceso sunaikinimui skirtas punktas Terminate.
Parameters turi tik vienà punktà Set initial parameters. Per já atsidarome parametrø ávedimo dialogà. Dialogo pavidalas priklauso nuo pasirinkto optimizavimo metodo. Jei joks optimizavimo metodas dar nepasirinktas bus iðvedamas praðymas tai padaryti. Parametrus jûs galite keisti bet kuriuo metu, net ir vykstant skaièiavimams. Taèiau skaièiavimo procesui galios parametrai, kurie buvo nustatyti proceso paleidimo momentu.
Results taip pat turi tik vienà punktà Watch Results. Per já atsidarome rezultatø langà, kuris rodys esamu momentu minimaliausià surastà reikðmæ, ir taðko, kuriame ta reikðmë buvo surasta, koordinates.
Output leidþia pasirinkti keletà vizualinës informacijos iðvedimo bûdø. Numeric leidþia atsidaryti langà, rodantá iki esamo momento minimaliausià surastà reikðmæ ir iteracijos numerá. Convergence leidþia matyti konvergavimo kreivæ. Projections leidþia matyti nurodyto kintamojo projekcijà. Kintamojo numerá ávedame. Kintamieji skaièiuojami nuo vieneto.
Options leidþia pasirinkti ar projekcijø languose taðkus þymësime kryþeliais (Cross points), ar apskritimais (Circle points).
Per Help galima atsidaryti tik programos informaciná dialogà About. Pagalbos sistema nëra realizuota.

Pastaba: Jei norite skaièiavimus atlikti greitai, tai uþdarykite visus langus, kuriuose skaièiavimø rezultatai atsispindi vizualiai, nes grafiniai perpieðimai laibai eikvoja procesoriaus darbo laikà.

Naujø skaièiavimo metodø prijungimas prie programos:

Kuriant naujà optimizavimo metodo klasæ ji turi bûti kuriama klasës Method pagrindu. Minimali naujo metodo klasë pavaizduota þemiau:
import Method;
class NewMethod extends Method
{
public NewMethod( Output output, Parameters p, Results r, double fm[], double xn[][] )
{
super( output, p, r, fm, xn );
}

public void run()
{
newmethodcalculations(x, a, b, n, it, fm, xn);
finish();
}

private void newmethodcalculations(double x[], double a[], double b[], int n, int it, double fm[], double xn[][])
{
// Kodas
}
}

Method klasës konstruktoriui perduodami parametrai: output - objektas valdantis visà vizualiná skaièiavimø iðvedimà, p - skaièiavimo parametrai (ribos, pradiniai taðkai ir kt.), r - rezultatai, fm, xn - masyvai tam tikrø tarpiniø skaièiavimø saugojimui.

Optimizavimo algoritmà realizuojantis metodas turi bûti kvieèiamas metodo run() viduje. Tai reikalinga tam, kad optimizavimo metodas bûtø paleistas startuojant skaièiavimo procesui (priminsime, jog skaièiavimai atliekami lygiagreèiai su programa dirbanèiame procese). Kaip matome aukðèiau pateiktame pavyzdyje toks metodas yra newmethodcalculations(…). Ðio metodo pavadinimas ir parametrai gali bûti bet kokie. Pavyzdyje perduodami vidiniai klasës Method pagrindu sukurto objekto kintamieji. x - pradinio skaièiavimo taðko koordinaèiø masyvas, a - kintamøjø kitimo apatiniø ribø masyvas, b - kintamøjø kitimo virðutiniø ribø masyvas, n - kintamøjø skaièius, it - iteracijø skaièius, fm ir xn - masyvai tarpiniø skaièiavimo rezultatø saugojimui. Visi ðie kintamieji inicializuojami Method klasës konstruktoriaus.
Lieka dar vienas klausimas: kaip nurodyti programos interfeisui, jog pasikeitë minimaliausia surasta reikðmë, taðkas kuriame ta reikðmë buvo surasta, ar iteracijos numeris, bei kokios tos naujosios reikðmës yra. Ðiam tikslui klasëje Method yra apibëþtas vidinis Results klasës kintamasis r, inicializuojamas Method klasës konstruktoriaus. Ðio kintamojo pagalba galime atlikti tokius veiksmus: informuoti programà apie iteracijos pasikeitimà (r.iteration = new_iteration), apie naujà minimaliausià reikðmæ (r.y = new_min), apie taðko, kuriame buvo surasta minimaliausia funkcijos reikðmë, pasikeitimà (copy_array( r.x, new_x, n)). Èia new_iteration - sveikas skaièius, rodantis naujos iteracijos numerá, new_min - dvigubo tikslumo realus skaièius, nauja minimali funkcijos reikðmë, new_x - dvigubo tikslumo realiø skaièiø masyvas, su naujo taðko koordinatëmis. Visos ðios komandos paprastai naudojamos optimizavimo algoritmà realizuojanèio metodo viduje (newmethodcalculations).
Metodo run() pabaigoje reikia iðkviesti klasës Method metodà finish(), kuris sugràþins reikiamas programos bûsenas á iðeities padëtá.

Turint apraðytà naujà optimizavimo metodo klasæ reikia jà prijungti prie programos. Tam reikia modifikuoti klasës GmFrame metodà action(…). Geriausia nusikopijuoti jau kurio nors anksèiau prijungto metodo prijungimo gabaliukà ir reikiamose vietose pakeisti metodo pavadinimus. Gal bût reikës papildyti Minimizer klasës kintamøjø sàraðà, suteikiant naujam optimizavimo metodui numerá (þinoma jei tai jau nepadaryta anksèiau). Tai pat gali prireikti papildyti programos meniu, kuris apraðytas GmFrame klasës metode construct().
Dar reikës papildyti Minimizer klasës metodà run(). Taip pat galite nusikopijuoti kurio nors anksèiau prijungto metodo prijungimo gabaliukà ir atitinkamai já modifikuoti. Tokiø veiksmø turëtø pakakti. Kiek sunkiau bus jei naujai realizuojamas optimizavimo metodas reikalaus kokiø nors anksèiau nenumatytø parametrø. Tada gali prisieiti modifikuoti ParameterBox klasës konstruktoriø bei flushParameters() metodà. Blogiausiu atveju atveju gali reikëti papildyti Parameters klasës vidinius kintamuosius bei pataisyti konstruktoriø, taip pat modifikuojant Method klasæ taip, kad ðiø naujø kintamøjø reikðmës galëtø bûti saugomos Method klasës pagrindu sukurto objekto viduje. Priminsime, jog Parameters klasës objektas perduodamas Method klasës objektui per Method konstruktoriaus parametrus.

Programos tobulinimo galimybës:

Kaip jau minëjau anksèiau programoje nëra realizuotas nei vienas ið trijø lokalaus optimizavimo metodø (Nlp, Flexi, LBayes). Taip pat ParameterBox klasëje nëra realizuota galimybë pilnai ávesti ðiems metodams reikalingus parametrus. Reikalinga ParameterBox konstruktoriaus ir flushParameters() metodo modifikacija. Taip pat keletu ið ðiø atvejø reikës papildyti Parameters klasës kintamuosius bei pataisyti Parameters konstruktoriø ir pataisyti Method klasæ kaip buvo minëta aukðèiau.

Kadangi programa gali bûti vykdoma interneto brauserio aplinkoje iðkilo mintis, jog programa gali bûti uþkraunama per Internetà ið kokios nors vienos vietos, o vartotojai galëtø jai pateikti savo uþduotis (pavyzdþiui failo Task.java pavidalu) ir stebëti rezultatus pas save. Toká dalykà turëtø bûti ámanoma realizuoti CGI (Common Gateway Interface) pagalba. Bûtø galima naudodi ir ISAPI programas (tiksliau *.dll failus), taèiau ISAPI tinka tik tada, kai yra prapleèiamos Microsoft Information Server galimybës (Windows 95, NT). Unix atveju tai netiks.

CGI programa serverio pusëje turëtø kokiu nors bûdu pasiþymëti prie optimizavimo programos besijungianèius klijentus, priimti uþduoèiø failus, juos perkompiliuoti ir organizuoti Task.class klasës pasiuntimà tinklu atgal klijentui. Gali prisieiti daryti pakeitimus paèioje optimizavimo programoje, kad ði galëtø priimti ir savyje pakeisti senà Task.class klasæ á naujà. CGI programa taip pat turëtø praneðti klijentui, jei uþduoties nepavyko perkompiliuoti.

Tolesná ðios minties vystymà palieku tiems, kurie susidomës programos tobulinimu. Apie CGI informacijà galite rasti knygoje "Áèáëèîòåêà ñèñòåìíîãî ïðîãðàìèñòà 29, Ñåðâåð Wåá ñâîèìè ðóêàìè, À.Â.Ôðîëîâ, Ã.Â.Ôðîëîâ". Dar kartà paraðysiu knygos pavadinimà ið rusø kalbos iðvertæs á lietuviø, nes kiek teko patirti ne pas visus interneto brauseriai rodo rusiðkà raidynà. Taigi knyga vadinasi "Sisteminio programuotojo biblioteka, tomas 29, Web Serveris savo rankomis", A.V.Frolovas, G.V.Frolovas".

Adresai:

Su manimi galite susisiekti paðtu: [email protected]
Mano namø puslapis patalpintas adresu: http://www.soften.ktu.lt/~krapau