Difference between revisions of "SG0060 2010"

From Heureka Wiki
Jump to navigation Jump to search
 
(34 intermediate revisions by 2 users not shown)
Line 1: Line 1:
'''Lite snabbhjälp för dig som går kursen "Skoglig planering ur ett företagsperspektiv" höstterminen 2010.'''
+
'''Lite snabbhjälp för dig som går kursen "Skoglig planering ur ett företagsperspektiv" höstterminen 2011.'''
  
 
==Systemöversikt==
 
==Systemöversikt==
Line 168: Line 168:
 
En fullödig och välutvecklad handledning för optimeringsverktyget, ehuru endast tillgänglig på engelska, finner du [[Optimization | här]].
 
En fullödig och välutvecklad handledning för optimeringsverktyget, ehuru endast tillgänglig på engelska, finner du [[Optimization | här]].
  
Lite snabbt några kom-i-håg: föreliggande steg består alltså i att med hjälp av optimering välja ut ''ett'' skötselprogram (av de många vi nyss skapade) ''för varje bestånd''.
+
Föreliggande steg består alltså i att med hjälp av optimering välja ut ''ett'' skötselprogram (av de många vi nyss skapade) ''för varje bestånd''.
 
* '''Under menyn "Optimization" väljs "Open model..."'''
 
* '''Under menyn "Optimization" väljs "Open model..."'''
 
* '''Välj "ModelBasic.Hops"'''
 
* '''Välj "ModelBasic.Hops"'''
Eller har ni använt någon annan modell? (jag hittade inte denna på kurshemsidan) Annars får ni använda den med PlanWise-installationen medföljande modellen "Max nuvärde med jämnhetskrav ver 4.Hops". För dig som kan din linjärprogrammering så kanske vissa saker känns bekanta? Man bygger upp sin optimeringsmodell genom att definiera "Sets", "Parameters", "Variables" och "Constraints".
+
Eller har ni använt någon annan modell (jag hittade inte denna på kurshemsidan)? Annars får ni använda den med PlanWise-installationen medföljande modellen '''Max nuvärde med jämnhetskrav ver 4.Hops'''. För dig som kan din linjärprogrammering så kanske vissa saker känns bekanta? Man bygger upp sin optimeringsmodell genom att definiera "Sets", "Parameters", "Variables" och "Constraints".
  
I Heureka har man gjort ett verktyg på nätet [[http://www.zib.de/koch/zimpl/download/zimpl.pdf | här]], läs kapitel 4.2 till och med 4.5. Nedan följer sedan ett antal syntax-exempel från PlanWise.
+
I Heureka finns funktionalitet zimpl.zib.de/download/zimpl.pdf här], läs kapitel 4.2 till och med 4.5. Nedan följer sedan ett antal syntax-exempel, vanligt förekommande i en optimeringsmodell i PlanWise.
  
===Kontovariabel som summerar avverkad volym i varje tidsperiod:===
+
=====Kontovariabel som summerar avverkad volym i varje tidsperiod:=====
<pre>FORALL <p> IN _periods DO
+
<pre>FORALL <p> IN periods DO
         SUM<i,j,r> IN _treatmentunits * _alternatives * _rowno :
+
         SUM <i,j,r> IN treatmentunits * alternatives * rowno :
         _volumeHarv[i,j,p,r] * _area[i] * _x[i,j] == _volHarvTot[p];</pre>
+
         volumeHarv[i,j,p,r] * area[i] * x[i,j] == volHarvTot[p] ;</pre>
  
 
Definitionen skrivs in direkt i ''variabelns'' definitionsfönster, men är i egentlig mening en ''restriktion''. Restriktionen motsvarar följande matematiska uttryck (restriktion) i en LP-modell:
 
Definitionen skrivs in direkt i ''variabelns'' definitionsfönster, men är i egentlig mening en ''restriktion''. Restriktionen motsvarar följande matematiska uttryck (restriktion) i en LP-modell:
Line 189: Line 189:
 
''I'' = mängden (set) av behandlingsenheter ("Treatment Units")
 
''I'' = mängden (set) av behandlingsenheter ("Treatment Units")
  
''J'' = mängden av (index) för tillgängliga skötselprogram
+
''J'' = mängden av (index för) tillgängliga skötselprogram
 
   
 
   
 
''R'' = mängden åtgärder (åtgärdsnummer) i en och samma period
 
''R'' = mängden åtgärder (åtgärdsnummer) i en och samma period
Line 201: Line 201:
 
''x<sub>ij</sub>'' = beslutsvariabel (binär) = 1 om skötselprogram ''j'' tillämpas för enhet ''i'', annars 0
 
''x<sub>ij</sub>'' = beslutsvariabel (binär) = 1 om skötselprogram ''j'' tillämpas för enhet ''i'', annars 0
  
===Kontovariabel som summerar volym som slutavverkas i varje tidsperiod:===  
+
=====Kontovariabel som summerar volym som slutavverkas i varje tidsperiod:=====  
<pre>FORALL <p> IN _periods DO
+
<pre>FORALL <p> IN periods DO
         SUM<i,j,r> IN _treatmentunits * _alternatives * _rowno with _treatment[i,j,p,r]==8:
+
         SUM <i,j,r> IN treatmentunits * alternatives * rowno WITH treatment[i,j,p,r] == 8 :
          _volumeHarv[i,j,p,r] * _area[i] * _x[i,j] == _volHarvFinalFelledTot[p];</pre>
+
        volumeHarv[i,j,p,r] * area[i] * x[i,j] == volHarvFinalFelledTot[p] ;</pre>
  
Skillnaden mot föregående uttryck är att efter "rowno" följer ett villkor att summering bara ska göras för slutavverkningsåtgärder (som har koden 8). Notera användningen av dubbla likhetstecken. ''För att visa definitionen av en definierad kontovariabel dubbelklickar du på den.''
+
Skillnaden mot föregående uttryck är att efter "rowno" följer ett villkor att summering bara ska göras för slutavverkningsåtgärder (som har koden 8). Notera användningen av dubbla likhetstecken.
  
===Kontovariabel för arealen slutavverkning i varje tidsperiod:===
+
=====Kontovariabel för arealen slutavverkning i varje tidsperiod:=====
Denna variabel är nästan identisk med den föregående, vi tar bara bort parametern "_volumeHarv(i,j,p,r)" från uttrycket.
+
Denna variabel är nästan identisk med den föregående, vi tar bara bort parametern "volumeHarv(i,j,p,r)" från uttrycket.
<pre>FORALL <p> IN _periods DO
+
<pre>FORALL <p> IN periods DO
         SUM<i,j,r> IN _treatmentunits * _alternatives * _rowno with _treatment[i,j,p,r]==8:
+
         SUM <i,j,r> IN treatmentunits * alternatives * rowno WITH treatment[i,j,p,r] == 8 :
         _area[i] * _x[i,j] == _areaFinalFelledTot[p];</pre>
+
         area[i] * x[i,j] == areaFinalFelledTot[p] ;</pre>
''"8" i ovanstående två uttryck är alltså det numeriska värde som motsvarar slutavverkning för parametern "_treatment". Man kan kontrollera dylikt genom att högerklicka på parametern och välja "View definition" (testa detta även för "_forestDomain" och "_trmtCategory", särskilt bra om man skapat flera nya skogsdomäner med viss sorts skötsel definierat i kontrollkategorierna).''
+
''"8" i ovanstående två uttryck är alltså det numeriska värde som motsvarar slutavverkning för parametern "treatment". Man kan kontrollera dylikt genom att högerklicka på parametern och välja "View definition" (testa detta även för "forestDomain" och "trmtCategory", särskilt bra om man skapat flera nya skogsdomäner med viss sorts skötsel definierat i kontrollkategorierna).''
  
===Restriktion som begränsar hur stor areal som får slutavverkas i varje tidsperiod:===
+
=====Restriktion som begränsar hur stor areal som får slutavverkas i varje tidsperiod:=====
<pre>FORALL <p> IN _periods DO
+
<pre>FORALL <p> IN periods DO
_areaFinalFelledTot[p] <= 20;</pre>
+
areaFinalFelledTot[p] <= 20 ;</pre>
  
 
Vi använder alltså den kontovariabel för slutavverkningsareal som vi skapade ovan, och lägger in restriktionen (eg. restriktionerna) att den slutavverkade arealen får vara högst 20 hektar i en och samma period. ''Om du vill inaktivera en restriktion utan att ta bort så högerklicka och välj "Exclude".''
 
Vi använder alltså den kontovariabel för slutavverkningsareal som vi skapade ovan, och lägger in restriktionen (eg. restriktionerna) att den slutavverkade arealen får vara högst 20 hektar i en och samma period. ''Om du vill inaktivera en restriktion utan att ta bort så högerklicka och välj "Exclude".''
  
===Lägga till ny parameter===
+
=====Lägga till ny parameter=====
 
"Sets" och "Parameters" utgör indata till optimeringsmodellen. En parameter får sitt värde antingen genom att koppla den till resultatdata som har beräknats av skötselprogramgeneratorn eller genom att ge den en matematisk definition. ''Blanda inte ihop "variabler" som beräknas av skötselprogramgeneratorn med "beslutsvariabler" i optimeringsmodellen. För modellen är alla variabler som beräknas utanför den konstanter (dvs. element i ett "Set" eller i en "Parameter").''  
 
"Sets" och "Parameters" utgör indata till optimeringsmodellen. En parameter får sitt värde antingen genom att koppla den till resultatdata som har beräknats av skötselprogramgeneratorn eller genom att ge den en matematisk definition. ''Blanda inte ihop "variabler" som beräknas av skötselprogramgeneratorn med "beslutsvariabler" i optimeringsmodellen. För modellen är alla variabler som beräknas utanför den konstanter (dvs. element i ett "Set" eller i en "Parameter").''  
  
 
Så här gör man för att skapa en ny parameter och koppla den till resultatdata:
 
Så här gör man för att skapa en ny parameter och koppla den till resultatdata:
 
* Högerklicka på "Parameters" och välj "Add new parameter"
 
* Högerklicka på "Parameters" och välj "Add new parameter"
Har du gått vilse bland alla fönster så under menyn "View" väljs "Model Optimization Builder".
 
 
* Låt "Heureka result variable" vara valt och klicka på "Next"
 
* Låt "Heureka result variable" vara valt och klicka på "Next"
 
Vi ska alltså i detta läge inte skriva en ny formel, utan koppla parametern direkt till en kolumn i databasen där skötselprogramalternativen har sparats.
 
Vi ska alltså i detta läge inte skriva en ny formel, utan koppla parametern direkt till en kolumn i databasen där skötselprogramalternativen har sparats.
Line 233: Line 232:
 
Den nya hamnar längst ner bland alla "Parameters". Ett bättre namn är ett som indikerar vad det handlar om, i rutan "Properties" och bredvid "Description" kan en ännu fylligare förklaring skrivas in.   
 
Den nya hamnar längst ner bland alla "Parameters". Ett bättre namn är ett som indikerar vad det handlar om, i rutan "Properties" och bredvid "Description" kan en ännu fylligare förklaring skrivas in.   
  
Notera att systemet själv håller reda på indexeringen. I detta fall har vi en skötselkategori för varje behandlingsenhet, skötselprogramalternativ och period. Att vi har med period beror på att skötselkategorin kan vara olika före och efter slutavverkning (vi går inte in på detta mer i denna övning).
+
Notera att systemet själv håller reda på indexeringen. I detta fall har vi en skötselkategori för varje behandlingsenhet, skötselprogramalternativ och period. Att vi har med period beror på att skötselkategorin kan vara olika före och efter slutavverkning.
  
===Lägga till ny restriktion===
+
=====Lägga till ny restriktion=====
 
* Högerklicka på "Constraints" och välj "Add new constraint"
 
* Högerklicka på "Constraints" och välj "Add new constraint"
 
* Klicka på den restriktion som har skapats.
 
* Klicka på den restriktion som har skapats.
I rutan "Properties" för restriktionen väljer du "Click to add index", lägger till och väljer "_Periods[p]" för att skapa en restriktion för varje tidsperiod.
+
I rutan "Properties" för restriktionen väljer du "Click to add index", lägger till och väljer "Periods[p]" för att skapa en restriktion för varje tidsperiod.
  
===Exempelfiler===
+
=====Sammanfattningsvis=====
Dessa optimeringsfiler kan du ladda ner och öppna via meny "Optimization" > "Open optimization": 
+
I viss mån kanske denna kurs blivit lite för lätt, med färdiga och fungerande optimeringsmodeller... I figur 10 syns den med PlanWise medföljande modellen, röd pil markerar målfunktionen; aktiv syntax visar att det rör sig om två mål där man söker högt nuvärde men utan alltför ojämn avverkningsprofil. I egenskapsfönstret kan konstateras att optimeringsmodellens riktning är maximerande. ''Med så mycket förberett blir din uppgift att försöka förstå jämnhetsrestriktionerna "(max)volharvDecrease" och "(max)volharvIncrease", som de definierats finns en större svaghet och en stor styrka - ser du dessa?'' 
*[ftp://salix.slu.se/download/heureka/optimization/Model9c.hops Model9c.hops]
 
Nya och andra komponenter kommer att göras tillgängliga på denna ftp-server (ftp://salix.slu.se/download/Heureka/), t.ex. skript ("SQL queries") att använda (som mall - skriv om för att få ut det du vill ha) för rapporter från resultat-databasen. Detta avser både när man vill närmre studera initialtillståndet men kanske främst planen - simulerings- och optimeringsresultatet.
 
  
''Förbättrad funktionalitet under "View" > "Optimization Result Viewer" och möjligheten att här välja en simulering/optimering och sedan skapa egna diagram (under "Diagrams" > "User defined") för att beakta resultaten gör ev. SQL queries överflödiga.''
+
{|
 +
|[[Image:Figur10.jpg|1000px|thumb|left|Figur 10]]
 +
|}
  
 
====Lös optimeringsproblem====
 
====Lös optimeringsproblem====
 
* '''Högerklicka i optimeringsmodell-fönstret och välj "Compile and solve model..."'''
 
* '''Högerklicka i optimeringsmodell-fönstret och välj "Compile and solve model..."'''
Beakta utfallet i "Output"-fönstret.
+
Beakta utfallet i "Output"-fönstret. Med en bra modell gick allt bra och optimeringsproblemet kunde lösas. Det kan dock krångla, om felmeddelandet "Could not build model" beror det oftast på formuleringen av problemet i optimeringsmodellen. Gå tillbaka och kontrollera variabler och restriktioner, dess definitioner och syntax (ibland kan modellen bli för stor för att kunna byggas - ta då bort parametrar, variabler och restriktioner som inte används). Felmeddelandet "Solution: Infeasible" är lite bättre men givetvis inte bra. Det fanns alltså ingen lösning på föreliggande optimeringsproblem. Gå tillbaka till optimeringsmodellen och uteslut ("Exclude") alla dina restriktioner för att sedan inkludera dem, en efter en, och försök lösa problemet efter varje inkludering. På så sätt kan man hitta åt den restriktion som är alltför restriktiv. Ibland kan man måsta backa ännu längre och generera fler skötselprogram till varje bestånd - att optimeringsproblemet saknar lösning kan mycket väl bero på att det saknas sådana skötselprogram som kan uppfylla en viss restriktion. Gå även in under menyn "Optimization>Settings...", här kan man t.ex. tillåta en längre tid i sökandet efter problemlösning.
 +
 
 +
* '''Efter att en lösning av optimeringsproblemet erhållits, välj "Save Optimization Results"'''
 +
Detta så du ska kunna beakta resultatet under fliken "Optimization Results".
 +
 
 +
=====Round to integer solution?=====
 +
''Slutavverkas ett och samma bestånd i två på varandra följande tidsperioder? Det kan verka så emedan det eg. är fråga om delavverkning (t.ex. 75% (av beståndets yta) avverkas först, 25% under nästa 5-årsperiod). Sådant kan bli aktuellt om man har relativt få men stora bestånd (och kanske i optimeringen inkluderat ett villkor som begränsar hyggesstorleken, "limitFinalFelling"). Ett sätt att undvika detta är att för beslutsvariabeln "x" ändra "RangeType" till binär, alltså accepteras endast värdena 0 eller 1, optimeringen blir då emellertid svårare och kan ta lång tid.''
 +
 
 +
Att beslutsvariabeln tillåts anta decimaltalsvärden kan i vissa lägen vara önskvärt - ni har ju jobbat med både heltäckande data (där varje bestånd representerat enbart "sig själv") och ett dataset med stickprovsavdelningar där en avdelning har en representativ areal mycket större än sin faktiska och sålunda representerar flera andra avdelningar. Resultatet för en stickprovsavdelning kan då fördelas ut på dess representerade avdelningar i förhållande till värdet på beslutsvariabeln. Men generellt kan man nog säga '''Heltäckande data = heltalsavrundning'''.
 +
 
 +
Numer finns alltså möjligheten att avrunda till heltalslösningar, väljs under "Optimization>Settings..." och innebär att man '''efter optimering''' avrundar så att ett bestånd i sin helhet bara kan åtgärdas med en typ av åtgärd i en och samma period. Men det innebär åxå att du kan få olika resultat i "Output"-fönstret jämfört med de under fliken "Optimization Results".
  
 
==Analysmoment 4: Analysera resultat==
 
==Analysmoment 4: Analysera resultat==
Länk:
+
Hur du väljer att analysera och presentera resultaten beror på din uppgift. Vilka resultatvariabler som är av intresse att beakta får du välja själv. Under fliken "Optimization Results" finns goda möjligheter att presentera resultat på lämpligt sätt. Tre underflikar finns här:
* '''Gör en temakarta för variabeln "Treatments" för att se vilka åtgärder som görs i de olika bestånden i olika perioder'''
+
* '''Details'''
Tag först fram fliken "Map" (ev. via menyn "View") och välj "Strategic Optimization" i rutan bredvid "Result:" (ev. må du först trycka på "Refresh"-knappen). I fönstret "Map Properties" expanderar du "Treatments" och väljer "Treatment". Högerklicka och välj "Add Items Automatically" så får du upp en dialogruta. Ta bort åtgärder som du inte vill visa (markera och klicka på "Remove"). Spara bara t.ex. "Thin(ning)" och "FinalFelling" och ändra färgerna på dessa. Högerklicka igen på "Treatment" och välj "Show in Map". Högt upp i kartfönstret finns pilar för att bläddra mellan planperioderna.
+
Här presenteras för samtliga bestånd i aktuellt analysområde det valda ("bästa") skötselprogrammet, via "View Treatment Programs". Du bestämmer vilka variabelvärden som ska beaktas (via "Select Variables") i hur många 5-årsperioder. Möjligheten finns sen att kopiera datamatrisen in i annat medium, t.ex. Excel, och där fortsätta resultatanalysen. Figur 11 visar ett resultat där varje bestånds föreslagna åtgärder, och vid en föreslagen avverkningsåtgärd då den avverkade volymen (i m<sup>3</sup>sk/ha), presenteras för de tre första 5-årsperioderna.
 +
 
 +
{|
 +
|[[Image:Analysera_data_fig1.JPG|1000px|thumb|left|Figur 11]]
 +
|}
 +
 
 +
* '''Tables and Graphs'''
 +
Här kan användaren skapa egna period- och klassdiagram. Datamatrisen kan även här kopieras in i annan tabell etc. Observera möjligheten att välja typ av punkt-, linje- och olika sorters stapeldiagram. Du kan läsa mer här: [[Report Builder]]. Figur 12 visar en s.k. avverkningsprofil, med totalvolymer från gallring respektive slutavverkning, så man snabbt kan kontrollera t.ex. huruvida ställda jämnhetskrav haft genomslag. Med en "Period Graph" presenteras förutom diagrammet även de bakomliggande värdena i en datamatris (lämplig att kopiera och klistra in i t.ex. en tabell i Word eller i ett Excelark för att göra ett snyggare diagram). 
 +
 
 +
{|
 +
|[[Image:Analysera_data_fig2.JPG|1000px|thumb|left|Figur 12]]
 +
|}
 +
 
 +
* '''Map'''
 +
Gör t.ex. en temakarta för variabeln "Treatments" för att se vilka åtgärder som görs i de olika bestånden i olika perioder. Välj ett resultat, t.ex. "Strategic Optimization" i rutan bredvid "Result:" (ev. må du först trycka på "Refresh"-knappen). I fönstret "Map Properties" expanderar du "Treatments" och väljer "Treatment". Högerklicka och välj "Add Items Automatically" så får du upp en dialogruta. Ta bort åtgärder som du inte vill visa (markera och klicka på "Remove"). Spara bara t.ex. "Thinning" och "Final felling" (och ev. andra förekommande avverkningsformr) och ändra färgerna på dessa. Högerklicka igen på "Treatment" och välj "Show in Map". Bläddra mellan planperioderna för att beakta föreslagna avverkningar i respektive 5-årsperiod. Figur 13 visar hur man i kartan kan beakta vilka bestånd som föreslås till vissa åtgärder i en viss period.
 +
 
 +
{|
 +
|[[Image:Analysera_data_fig3.JPG|1000px|thumb|left|Figur 13]]
 +
|}
 +
 
 +
Du kan läsa mer om resultatredovisning här: [[:Category:Results]]
  
''Slutavverkas ett och samma bestånd i två på varandra följande tidsperioder? Det kan verka så emedan det eg. är fråga om delavverkning (t.ex. 75% (av beståndets yta) avverkas först, 25% under nästa 5-årsperiod). Sådant kan bli aktuellt om man har relativt få men stora bestånd (och kanske i optimeringen inkluderat ett villkor som begränsar hyggesstorleken, "_limitFinalFelling"). Ett sätt att undvika detta är att för beslutsvariabeln "_x" ändra "RangeType" till binär, alltså accepteras endast värdena 0 eller 1, optimeringen blir då emellertid svårare och kan ta rysligt lång tid.''
+
[[Category:Tutorials]]

Latest revision as of 12:30, 9 December 2011