Á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
public Task()
lowerBounds = new double[NUMBER_OF_VARIABLES];
static public final double f(double x[], int n) |
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