Variationer1
Peter Lohmander
Version 2007-10-14
Varmt tack till
förvaltare Magnus Bergman och Utvecklingschef Karl Larsson, SCA, samt studenter
på
jägmästarprogrammet, för
relevanta parametrar samt kontroller av en tidigare version av denna modell !
Peter Lohmander
#1. Grundmodell
#2. Ökad lagringskostnad i september och oktober för talltimmer och
grantimmer
#3. Import av talltimmer upphör från och med November
#4. Ökade räntekrav
#5. Vägstandard kontra väglager
#6. Ändrade Lagringskostnader för vissa sortiment
#7. CTI utrustning, dyrare och tyngre bilar samt minskat vägslitage
#1. Grundmodell
! SCA_Logistik_Lohmander_2007;
! Peter
Lohmander;
! 20071014;
! Denna modell är en uppdaterad version av den
version som användes 20071012.
! Under den genomgangen
mottogs flera konstruktiva forslag och aktuella forutsattningar;
! gallande skogsforvaltning inom
SCA av forvaltare Magnus Bergman samt ;
! utvecklingschef Karl Larsson. Narvarande
studenter pa jagmastarprogrammet
bidrog
! med vardeulla kontroller
av vissa delresultat vilka visade sig bli orimliga;
! med den tidigare versionen av modellen. Dessa
kommentarer och bidrag har pa ;
! ett avgorande satt forbattrat denna modell och gjort den mer relevant for de ;
! aktuella fragestallningarna. Varmt Tack fran Peter Lohmander.;
Model:
! Relevant data are taken
from the file SCA_Logistik 2007.xls ;
SETS:
man/sep,okt,nov,dec,jan/:L_TT,L_GT,L_BM,L_FFG,L_LOV,L_TOT,
B_TT,B_GT,B_BM,B_FFG,B_LOV;
Avd/1..166/:
ID,HFSIFFRA,TERRBSIFFRA,M3F_TOT,TT,GT,BM,FFG,LOV,DAGAR,VSIFFRA,GA;
Per/sep, okt, nov,
dec/:GAVOL, SAVOL, Disk, GADAGAR, SADAGAR;
PerAvd(Avd,
Per):Andel, costperm3;
ENDSETS
! Malfunktion;
! Vi minimerar nuvardet av den totala kostnaden. ;
! Vi anvander foretagets egen
redovisade kalkylranta, 6.5% per year;
! Perrate beraknas
som rantan for en manad. Alla kostander antages uppsta
mitt
i respektive period (manad).;
! All
diskontering sker till mitten av period 0, d.v.s. Augusti 15.;
(1+perrate)^12 = 1.065;
@for(Per(t): Disk(t) = 1/(1+perrate)^t);
! En val
definiera ekonomisk malfunktion forutsatter
att
kostnaderna
foer drivning och vagtransport
fran de olika objekten aer
kalkylerade
for alternativa perioder och finns tillgangliga i en
tabell.;
! En sadan hypotetisk kostnadstabell har inkluderats i denna
datormodell
eftersom
en sadan tabell saknades i det befintliga
tabellunderlaget.;
@for(PerAvd(i,t):
costperm3(i,t) = 90);
min = TK;
TK = DrivnK + LagK;
DrivnK = @SUM(PerAvd(i,t):Disk(t)*costperm3(i,t)*Andel(i,t)*M3F_TOT(i));
LagK = @SUM(Per(t): Disk(t)*(10*L_TT(t)+10*L_GT(t)+10*L_BM(t)+10*L_FFG(t)+10*L_LOV(t)));
!Det finns en
mojlighet att definiera alla avverkningar som heltal.;
!Det ar dock
oftast ej ekonomiskt optimalt att gora detta.
!Det ar vanligen optimalt att starta vissa operationer under en
period
och
avsluta dem under nasta period. ;
!*********************************************************************;
!@for( PerAvd(i,t): @BIN(Andel(i,t)));
! GA(i) definieras
som 1 om gallringsmaskiner kan anvandas, annars 0.;
!Gallringsmaskinlag hanterar huggningsformerna HF1 och HF7;
!Slutavverkningsmaskinlag hanterar
HF2-HF6 samt HF8;
@for(Avd(i)|
HFSIFFRA#EQ#1 :GA(i) = 1);
@for(Avd(i)| HFSIFFRA#EQ#7 :GA(i) = 1);
@for(Avd(i)|
HFSIFFRA#GE#2 #AND# HFSIFFRA#LE#6:GA(i) = 0);
@for(Avd(i)| HFSIFFRA#EQ#8 :GA(i) = 0);
!Drivning med gallringsmaskinlag;
@for(Per(t): GAVOL(t) = @SUM(Avd(i): GA(i)*Andel(i,t)*M3F_TOT(i)));
!Drivning med slutavverkningsmaskinlag;
@for(Per(t): SAVOL(t) = @SUM(Avd(i): (1-GA(i))*Andel(i,t)*M3F_TOT(i)));
!Berakning av antal dagar som gallringslagen anvandes
under olika manader;
@for(Per(t): GADAGAR(t) = @SUM(Avd(i):GA(i)*Andel(i,t)*DAGAR(i)));
!Berakning av antal dagar som slutavverkningslagen
anvandes under olika manader;
@for(Per(t): SADAGAR(t) = @SUM(Avd(i):(1-GA(i))*Andel(i,t)*DAGAR(i)));
!Gallringsmaskinlagen har begransade kapaciteter i varje
period;
[GADAG_S] GADAGAR(1)
<= 3*20;
[GADAG_O] GADAGAR(2) <= 3*23;
[GADAG_N] GADAGAR(3)
<= 3*22;
[GADAG_D] GADAGAR(4) <= 3*19;
!Gallringsmaskinlagen vill helst
undvika alltfor stora neddragningar av verksamheten;
[GADAG_SL] GADAGAR(1) >= 3*20*0.8;
[GADAG_OL] GADAGAR(2)
>= 3*23*0.8;
[GADAG_NL] GADAGAR(3) >= 3*22*0.8;
[GADAG_DL] GADAGAR(4)
>= 3*19*0.8;
!Slutavverkningsmaskinlagen har begransade kapaciteter i varje
period;
[SADAG_S] SADAGAR(1)
<= 4*20;
[SADAG_O] SADAGAR(2) <= 4*23;
[SADAG_N] SADAGAR(3)
<= 4*22;
[SADAG_D] SADAGAR(4) <= 4*19;
!Slutavverkningsmaskinlagen vill helst
undvika alltfor stora neddragningar av verksamheten;
[SADAG_SL] SADAGAR(1) >= 4*20*0.8;
[SADAG_OL] SADAGAR(2)
>= 4*23*0.8;
[SADAG_NL] SADAGAR(3) >= 4*22*0.8;
[SADAG_DL] SADAGAR(4)
>= 4*19*0.8;
!Alternativa metoder
motsvarar HF8. Viss volym av detta skall drivas.;
!Just nu bortser vi
fran den restriktionen men den kan enkelt inkluderas;
!Alla vagar ar ej farbara alla
perioder;
!**************************************;
@for(Avd(i)| VSIFFRA(i)#GE#4 :
Andel(i,1) = 0);
@for(Avd(i)| VSIFFRA(i)#GE#4 : Andel(i,2) = 0);
@for(Avd(i)| VSIFFRA(i)#GE#4 :
Andel(i,3) = 0);
!Alla
avverkningsobjekt har ej acceptabel baerighet alla
perioder;
!****************************************************************;
@for(Avd(i)| TERRBSIFFRA(i)#GE#4 : Andel(i,1) = 0);
@for(Avd(i)| TERRBSIFFRA(i)#GE#4 :
Andel(i,2) = 0);
@for(Avd(i)| TERRBSIFFRA(i)#GE#4 : Andel(i,3) = 0);
! Total
avverkning;
! ****************;
!TotAvv = @sum(Avd(i): @sum(Per(t):
Andel(i,t)*M3F_TOT(i)));
! Total bestallning;
! *****************;
!TotBest = @sum(Per(t): B_TT(t)+B_GT(t)+B_BM(t)+B_FFG(t)+B_LOV(t));
! Total lagerfoerandring;
! **********************;
!TotLF = TotAvv - TotBest;
!@FREE(TotLF);
! Kontroll av
total lagerfoerandring;
!
**********************************;
!CheckLF = L_TOT(5) -
L_TOT(1);
!@FREE(CheckLF);
! Det visade sig
att TotLF överstiger CheckLF
beroende på att TotLF bygger på
tabellvärden
i kolumnen M3F_TOT. Om man summerar de olika sortimenten så blir
summan
av dem lagre an den totalt angivna volymen. Detta kan
bero på att
delar
av den totala volymen ska lamnas i skogen eller ej
kan klassificeras som de
olika
sortimenten.;
! Totala lager;
! ************;
@for(Per(t): L_TOT(t) = L_TT(t)+L_GT(t)+L_BM(t)+L_FFG(t)+L_LOV(t) );
L_TOT(5) = L_TT(5)+L_GT(5)+L_BM(5)+L_FFG(5)+L_LOV(5);
!Man kan inte
avverka mer än vad som finns i respektive avdelning;
!****************************************************************;
@for(Avd(i): @SUM(Per(t): Andel(i,t)) <= 1);
! Inlager ska inte vara lagre an kritiska granser;
! ***********************************************;
@for(Per(t): L_TT(t) >= 1000);
@for(Per(t): L_GT(t) >= 1000);
@for(Per(t): L_BM(t)
>= 1000);
@for(Per(t): L_FFG(t) >=
1000);
@for(Per(t): L_LOV(t) >= 500);
! Inlager ska inte vara foer hoega;
! ********************************;
!@for(Per(t): L_TT(t) <= 3000);
!@for(Per(t): L_GT(t) <= 3000);
!@for(Per(t): L_BM(t)
<= 2600);
!@for(Per(t): L_FFG(t) <= 2600);
!@for(Per(t): L_LOV(t) <=
2000);
! InLager + Avverkning - Utlager - Bestallning = 0 for
alla sortiment och perioder;
!*********************************************************************************;
@for(Per(t): L_TT(t) + @SUM(Avd(i): Andel(i,t)*TT(i)) - L_TT(t+1) - B_TT(t) = 0);
@for(Per(t): L_GT(t) + @SUM(Avd(i): Andel(i,t)*GT(i)) - L_GT(t+1) - B_GT(t) = 0);
@for(Per(t): L_BM(t) + @SUM(Avd(i): Andel(i,t)*BM(i)) - L_BM(t+1) - B_BM(t) = 0);
@for(Per(t): L_FFG(t) + @SUM(Avd(i): Andel(i,t)*FFG(i)) - L_FFG(t+1) - B_FFG(t) = 0);
@for(Per(t): L_LOV(t) + @SUM(Avd(i): Andel(i,t)*LOV(i)) - L_LOV(t+1) - B_LOV(t) = 0);
! Ingaende lagernivaer
i period 1 (September);
! *******************************************;
L_TT(1) = 1772;
L_GT(1) = 1619;
L_BM(1) = 1391;
L_FFG(1) = 1097;
L_LOV(1) = 635;
! Utgående lager
i period 4 = Ingående lager i period 5 (Januari);
! ***************************************************************;
L_TT(5) = 1500;
L_GT(5) = 1500;
L_BM(5) = 1500;
L_FFG(5) = 1500;
L_LOV(5) = 1000;
! Bestallningar i period 1
(September);
! ************************************;
B_TT(1) = 7000;
B_GT(1) = 4000;
B_BM(1) = 6000;
B_FFG(1) = 4000;
B_LOV(1) = 800;
! Bestallningar i period 2
(Oktober);
! **********************************;
B_TT(2) = 6000;
B_GT(2) = 6400;
B_BM(2) = 5000;
B_FFG(2) = 5500;
B_LOV(2) = 800;
! Bestallningar i period 3
(November);
! ***********************************;
B_TT(3) = 8000;
B_GT(3) = 5700;
B_BM(3) = 8000;
B_FFG(3) = 4400;
B_LOV(3) = 800;
! Bestallningar i period 4
(December);
! ***********************************;
B_TT(4) = 8500;
B_GT(4) = 5300;
B_BM(4) = 5500;
B_FFG(4) = 5500;
B_LOV(4) = 1200;
DATA:
ID,HFSIFFRA,TERRBSIFFRA,M3F_TOT,TT,GT,BM,FFG,LOV,DAGAR,VSIFFRA
=
@OLE('C:\SCA\SCA_Logistik_2007.XLS');
@OLE(
'C:\SCA\SCA_Resultat.XLS') = L_TT, L_GT, L_BM, L_FFG,
L_LOV, L_TOT,
B_TT, B_GT, B_BM,
B_FFG, B_LOV,
ANDEL, TERRBSIFFRA, VSIFFRA,
GAVOL, SAVOL, TK, DRIVNK, LAGK,
SADAGAR, GADAGAR;
ENDDATA
end
#2. Ökad lagringskostnad i september och oktober för talltimmer och
grantimmer
! SCA_Logistik_Lohmander_2007;
! Peter
Lohmander;
! 20071014;
! Denna modell är en uppdaterad version av den
version som användes 20071012.
! Under den genomgangen
mottogs flera konstruktiva forslag och aktuella forutsattningar;
! gallande skogsforvaltning inom
SCA av forvaltare Magnus Bergman samt ;
! utvecklingschef Karl Larsson. Narvarande
studenter pa jagmastarprogrammet
bidrog
! med vardeulla kontroller
av vissa delresultat vilka visade sig bli orimliga;
! med den tidigare versionen av modellen. Dessa
kommentarer och bidrag har pa ;
! ett avgorande satt forbattrat denna modell och gjort den mer relevant for de ;
! aktuella fragestallningarna. Varmt Tack fran Peter Lohmander.;
Model:
! Relevant data are taken
from the file SCA_Logistik 2007.xls ;
SETS:
man/sep,okt,nov,dec,jan/:L_TT,L_GT,L_BM,L_FFG,L_LOV,L_TOT,
B_TT,B_GT,B_BM,B_FFG,B_LOV;
Avd/1..166/:
ID,HFSIFFRA,TERRBSIFFRA,M3F_TOT,TT,GT,BM,FFG,LOV,DAGAR,VSIFFRA,GA;
Per/sep, okt, nov,
dec/:GAVOL, SAVOL, Disk, GADAGAR, SADAGAR;
PerAvd(Avd,
Per):Andel, costperm3;
ENDSETS
! Malfunktion;
! Vi minimerar nuvardet av den totala kostnaden. ;
! Vi anvander foretagets egen
redovisade kalkylranta, 6.5% per year;
! Perrate beraknas
som rantan for en manad. Alla kostander antages uppsta
mitt
i respektive period (manad).;
! All
diskontering sker till mitten av period 0, d.v.s. Augusti 15.;
(1+perrate)^12 = 1.065;
@for(Per(t): Disk(t) = 1/(1+perrate)^t);
! En val
definiera ekonomisk malfunktion forutsatter
att
kostnaderna
foer drivning och vagtransport
fran de olika objekten aer
kalkylerade
for alternativa perioder och finns tillgangliga i en
tabell.;
! En sadan hypotetisk kostnadstabell har inkluderats i denna
datormodell
eftersom
en sadan tabell saknades i det befintliga
tabellunderlaget.;
@for(PerAvd(i,t):
costperm3(i,t) = 90);
min = TK;
TK = DrivnK + LagK;
DrivnK = @SUM(PerAvd(i,t):Disk(t)*costperm3(i,t)*Andel(i,t)*M3F_TOT(i));
!LagK = @SUM(Per(t):
Disk(t)*(10*L_TT(t)+10*L_GT(t)+10*L_BM(t)+10*L_FFG(t)+10*L_LOV(t)));
LagKso = @SUM(Per(t)| t#LE#2:
Disk(t)*(20*L_TT(t)+15*L_GT(t)+10*L_BM(t)+10*L_FFG(t)+10*L_LOV(t)));
LagKnd = @SUM(Per(t)| t#GT#2: Disk(t)*(10*L_TT(t)+10*L_GT(t)+10*L_BM(t)+10*L_FFG(t)+10*L_LOV(t)));
LagK = LagKso + LagKnd;
!Det finns en
mojlighet att definiera alla avverkningar som heltal.;
!Det ar dock
oftast ej ekonomiskt optimalt att gora detta.
!Det ar vanligen optimalt att starta vissa operationer under en
period
och
avsluta dem under nasta period. ;
!*********************************************************************;
!@for( PerAvd(i,t): @BIN(Andel(i,t)));
! GA(i) definieras
som 1 om gallringsmaskiner kan anvandas, annars 0.;
!Gallringsmaskinlag hanterar huggningsformerna HF1 och HF7;
!Slutavverkningsmaskinlag hanterar
HF2-HF6 samt HF8;
@for(Avd(i)|
HFSIFFRA#EQ#1 :GA(i) = 1);
@for(Avd(i)| HFSIFFRA#EQ#7 :GA(i) = 1);
@for(Avd(i)|
HFSIFFRA#GE#2 #AND# HFSIFFRA#LE#6:GA(i) = 0);
@for(Avd(i)| HFSIFFRA#EQ#8 :GA(i) = 0);
!Drivning med gallringsmaskinlag;
@for(Per(t): GAVOL(t) = @SUM(Avd(i): GA(i)*Andel(i,t)*M3F_TOT(i)));
!Drivning med slutavverkningsmaskinlag;
@for(Per(t): SAVOL(t) = @SUM(Avd(i): (1-GA(i))*Andel(i,t)*M3F_TOT(i)));
!Berakning av antal dagar som gallringslagen anvandes
under olika manader;
@for(Per(t): GADAGAR(t) = @SUM(Avd(i):GA(i)*Andel(i,t)*DAGAR(i)));
!Berakning av antal dagar som slutavverkningslagen
anvandes under olika manader;
@for(Per(t): SADAGAR(t) = @SUM(Avd(i):(1-GA(i))*Andel(i,t)*DAGAR(i)));
!Gallringsmaskinlagen har begransade kapaciteter i varje
period;
[GADAG_S] GADAGAR(1)
<= 3*20;
[GADAG_O] GADAGAR(2) <= 3*23;
[GADAG_N] GADAGAR(3)
<= 3*22;
[GADAG_D] GADAGAR(4) <= 3*19;
!Gallringsmaskinlagen vill helst
undvika alltfor stora neddragningar av verksamheten;
[GADAG_SL] GADAGAR(1) >= 3*20*0.8;
[GADAG_OL] GADAGAR(2)
>= 3*23*0.8;
[GADAG_NL] GADAGAR(3) >= 3*22*0.8;
[GADAG_DL] GADAGAR(4)
>= 3*19*0.8;
!Slutavverkningsmaskinlagen har begransade kapaciteter i varje
period;
[SADAG_S] SADAGAR(1)
<= 4*20;
[SADAG_O] SADAGAR(2) <= 4*23;
[SADAG_N] SADAGAR(3)
<= 4*22;
[SADAG_D] SADAGAR(4) <= 4*19;
!Slutavverkningsmaskinlagen vill helst
undvika alltfor stora neddragningar av verksamheten;
[SADAG_SL] SADAGAR(1) >= 4*20*0.8;
[SADAG_OL] SADAGAR(2)
>= 4*23*0.8;
[SADAG_NL] SADAGAR(3) >= 4*22*0.8;
[SADAG_DL] SADAGAR(4)
>= 4*19*0.8;
!Alternativa metoder
motsvarar HF8. Viss volym av detta skall drivas.;
!Just nu bortser vi
fran den restriktionen men den kan enkelt inkluderas;
!Alla vagar ar ej farbara alla
perioder;
!**************************************;
@for(Avd(i)| VSIFFRA(i)#GE#4 :
Andel(i,1) = 0);
@for(Avd(i)| VSIFFRA(i)#GE#4 : Andel(i,2) = 0);
@for(Avd(i)| VSIFFRA(i)#GE#4 :
Andel(i,3) = 0);
!Alla
avverkningsobjekt har ej acceptabel baerighet alla
perioder;
!****************************************************************;
@for(Avd(i)| TERRBSIFFRA(i)#GE#4 : Andel(i,1) = 0);
@for(Avd(i)| TERRBSIFFRA(i)#GE#4 : Andel(i,2)
= 0);
@for(Avd(i)| TERRBSIFFRA(i)#GE#4 : Andel(i,3) = 0);
! Total
avverkning;
! ****************;
!TotAvv = @sum(Avd(i): @sum(Per(t):
Andel(i,t)*M3F_TOT(i)));
! Total bestallning;
! *****************;
!TotBest = @sum(Per(t): B_TT(t)+B_GT(t)+B_BM(t)+B_FFG(t)+B_LOV(t));
! Total lagerfoerandring;
! **********************;
!TotLF = TotAvv - TotBest;
!@FREE(TotLF);
! Kontroll av
total lagerfoerandring;
!
**********************************;
!CheckLF = L_TOT(5) -
L_TOT(1);
!@FREE(CheckLF);
! Det visade sig
att TotLF överstiger CheckLF
beroende på att TotLF bygger på
tabellvärden
i kolumnen M3F_TOT. Om man summerar de olika sortimenten så blir
summan
av dem lagre an den totalt angivna volymen. Detta kan
bero på att
delar
av den totala volymen ska lamnas i skogen eller ej
kan klassificeras som de
olika
sortimenten.;
! Totala lager;
! ************;
@for(Per(t): L_TOT(t) = L_TT(t)+L_GT(t)+L_BM(t)+L_FFG(t)+L_LOV(t) );
L_TOT(5) = L_TT(5)+L_GT(5)+L_BM(5)+L_FFG(5)+L_LOV(5);
!Man kan inte
avverka mer än vad som finns i respektive avdelning;
!****************************************************************;
@for(Avd(i): @SUM(Per(t): Andel(i,t)) <= 1);
! Inlager ska inte vara lagre an kritiska granser;
! ***********************************************;
@for(Per(t): L_TT(t) >= 1000);
@for(Per(t): L_GT(t) >= 1000);
@for(Per(t): L_BM(t)
>= 1000);
@for(Per(t): L_FFG(t) >=
1000);
@for(Per(t): L_LOV(t) >= 500);
! Inlager ska inte vara foer hoega;
! ********************************;
!@for(Per(t): L_TT(t) <= 3000);
!@for(Per(t): L_GT(t) <= 3000);
!@for(Per(t): L_BM(t)
<= 2600);
!@for(Per(t): L_FFG(t) <= 2600);
!@for(Per(t): L_LOV(t) <=
2000);
! InLager + Avverkning - Utlager - Bestallning = 0 for
alla sortiment och perioder;
!*********************************************************************************;
@for(Per(t): L_TT(t) + @SUM(Avd(i): Andel(i,t)*TT(i)) - L_TT(t+1) - B_TT(t) = 0);
@for(Per(t): L_GT(t) + @SUM(Avd(i): Andel(i,t)*GT(i)) - L_GT(t+1) - B_GT(t) = 0);
@for(Per(t): L_BM(t) + @SUM(Avd(i): Andel(i,t)*BM(i)) - L_BM(t+1) - B_BM(t) = 0);
@for(Per(t): L_FFG(t) + @SUM(Avd(i): Andel(i,t)*FFG(i)) - L_FFG(t+1) - B_FFG(t) = 0);
@for(Per(t): L_LOV(t) + @SUM(Avd(i): Andel(i,t)*LOV(i)) - L_LOV(t+1) - B_LOV(t) = 0);
! Ingaende lagernivaer
i period 1 (September);
! *******************************************;
L_TT(1) = 1772;
L_GT(1) = 1619;
L_BM(1) = 1391;
L_FFG(1) = 1097;
L_LOV(1) = 635;
! Utgående lager
i period 4 = Ingående lager i period 5 (Januari);
! ***************************************************************;
L_TT(5) = 1500;
L_GT(5) = 1500;
L_BM(5) = 1500;
L_FFG(5) = 1500;
L_LOV(5) = 1000;
! Bestallningar i period 1
(September);
! ************************************;
B_TT(1) = 7000;
B_GT(1) = 4000;
B_BM(1) = 6000;
B_FFG(1) = 4000;
B_LOV(1) = 800;
! Bestallningar i period 2
(Oktober);
! **********************************;
B_TT(2) = 6000;
B_GT(2) = 6400;
B_BM(2) = 5000;
B_FFG(2) = 5500;
B_LOV(2) = 800;
! Bestallningar i period 3
(November);
! ***********************************;
B_TT(3) = 8000;
B_GT(3) = 5700;
B_BM(3) = 8000;
B_FFG(3) = 4400;
B_LOV(3) = 800;
! Bestallningar i period 4
(December);
! ***********************************;
B_TT(4) = 8500;
B_GT(4) = 5300;
B_BM(4) = 5500;
B_FFG(4) = 5500;
B_LOV(4) = 1200;
DATA:
ID,HFSIFFRA,TERRBSIFFRA,M3F_TOT,TT,GT,BM,FFG,LOV,DAGAR,VSIFFRA
=
@OLE('C:\SCA\SCA_Logistik_2007.XLS');
@OLE( 'C:\SCA\SCA_Resultat.XLS')
= L_TT, L_GT, L_BM, L_FFG, L_LOV,
L_TOT,
B_TT, B_GT, B_BM,
B_FFG, B_LOV,
ANDEL, TERRBSIFFRA, VSIFFRA,
GAVOL, SAVOL, TK, DRIVNK, LAGK,
SADAGAR, GADAGAR;
ENDDATA
end
#3. Import av talltimmer upphör från och med November
! SCA_Logistik_Lohmander_2007;
! Peter
Lohmander;
! 20071014;
! Denna modell är en uppdaterad version av den
version som användes 20071012.
! Under den genomgangen
mottogs flera konstruktiva forslag och aktuella forutsattningar;
! gallande skogsforvaltning inom
SCA av forvaltare Magnus Bergman samt ;
! utvecklingschef Karl Larsson. Narvarande
studenter pa jagmastarprogrammet
bidrog
! med vardeulla kontroller
av vissa delresultat vilka visade sig bli orimliga;
! med den tidigare versionen av modellen. Dessa
kommentarer och bidrag har pa ;
! ett avgorande satt forbattrat denna modell och gjort den mer relevant for de ;
! aktuella fragestallningarna. Varmt Tack fran Peter Lohmander.;
Model:
! Relevant data are taken
from the file SCA_Logistik 2007.xls ;
SETS:
man/sep,okt,nov,dec,jan/:L_TT,L_GT,L_BM,L_FFG,L_LOV,L_TOT,
B_TT,B_GT,B_BM,B_FFG,B_LOV;
Avd/1..166/:
ID,HFSIFFRA,TERRBSIFFRA,M3F_TOT,TT,GT,BM,FFG,LOV,DAGAR,VSIFFRA,GA;
Per/sep, okt, nov,
dec/:GAVOL, SAVOL, Disk, GADAGAR, SADAGAR;
PerAvd(Avd,
Per):Andel, costperm3;
ENDSETS
! Malfunktion;
! Vi minimerar nuvardet av den totala kostnaden. ;
! Vi anvander foretagets egen
redovisade kalkylranta, 6.5% per year;
! Perrate beraknas
som rantan for en manad. Alla kostander antages uppsta
mitt
i respektive period (manad).;
! All
diskontering sker till mitten av period 0, d.v.s. Augusti 15.;
(1+perrate)^12 = 1.065;
@for(Per(t): Disk(t) = 1/(1+perrate)^t);
! En val
definiera ekonomisk malfunktion forutsatter
att
kostnaderna
foer drivning och vagtransport
fran de olika objekten aer
kalkylerade
for alternativa perioder och finns tillgangliga i en
tabell.;
! En sadan hypotetisk kostnadstabell har inkluderats i denna
datormodell
eftersom
en sadan tabell saknades i det befintliga
tabellunderlaget.;
@for(PerAvd(i,t):
costperm3(i,t) = 90);
min = TK;
TK = DrivnK + LagK;
DrivnK = @SUM(PerAvd(i,t):Disk(t)*costperm3(i,t)*Andel(i,t)*M3F_TOT(i));
LagK = @SUM(Per(t):
Disk(t)*(10*L_TT(t)+10*L_GT(t)+10*L_BM(t)+10*L_FFG(t)+10*L_LOV(t)));
!Det finns en
mojlighet att definiera alla avverkningar som heltal.;
!Det ar dock
oftast ej ekonomiskt optimalt att gora detta.
!Det ar vanligen optimalt att starta vissa operationer under en
period
och
avsluta dem under nasta period. ;
!*********************************************************************;
!@for( PerAvd(i,t): @BIN(Andel(i,t)));
! GA(i) definieras
som 1 om gallringsmaskiner kan anvandas, annars 0.;
!Gallringsmaskinlag hanterar huggningsformerna HF1 och HF7;
!Slutavverkningsmaskinlag hanterar
HF2-HF6 samt HF8;
@for(Avd(i)|
HFSIFFRA#EQ#1 :GA(i) = 1);
@for(Avd(i)| HFSIFFRA#EQ#7 :GA(i) = 1);
@for(Avd(i)|
HFSIFFRA#GE#2 #AND# HFSIFFRA#LE#6:GA(i) = 0);
@for(Avd(i)| HFSIFFRA#EQ#8 :GA(i) = 0);
!Drivning med gallringsmaskinlag;
@for(Per(t): GAVOL(t) = @SUM(Avd(i): GA(i)*Andel(i,t)*M3F_TOT(i)));
!Drivning med slutavverkningsmaskinlag;
@for(Per(t): SAVOL(t) = @SUM(Avd(i): (1-GA(i))*Andel(i,t)*M3F_TOT(i)));
!Berakning av antal dagar som gallringslagen anvandes
under olika manader;
@for(Per(t): GADAGAR(t) = @SUM(Avd(i):GA(i)*Andel(i,t)*DAGAR(i)));
!Berakning av antal dagar som slutavverkningslagen
anvandes under olika manader;
@for(Per(t): SADAGAR(t) = @SUM(Avd(i):(1-GA(i))*Andel(i,t)*DAGAR(i)));
!Gallringsmaskinlagen har begransade kapaciteter i varje
period;
[GADAG_S] GADAGAR(1)
<= 3*20;
[GADAG_O] GADAGAR(2) <= 3*23;
[GADAG_N] GADAGAR(3)
<= 3*22;
[GADAG_D] GADAGAR(4) <= 3*19;
!Gallringsmaskinlagen vill helst
undvika alltfor stora neddragningar av verksamheten;
[GADAG_SL] GADAGAR(1) >= 3*20*0.8;
[GADAG_OL] GADAGAR(2)
>= 3*23*0.8;
[GADAG_NL] GADAGAR(3) >= 3*22*0.8;
[GADAG_DL] GADAGAR(4)
>= 3*19*0.8;
!Slutavverkningsmaskinlagen har begransade kapaciteter i varje
period;
[SADAG_S] SADAGAR(1)
<= 4*20;
[SADAG_O] SADAGAR(2) <= 4*23;
[SADAG_N] SADAGAR(3)
<= 4*22;
[SADAG_D] SADAGAR(4) <= 4*19;
!Slutavverkningsmaskinlagen vill helst
undvika alltfor stora neddragningar av verksamheten;
[SADAG_SL] SADAGAR(1) >= 4*20*0.8;
[SADAG_OL] SADAGAR(2)
>= 4*23*0.8;
[SADAG_NL] SADAGAR(3) >= 4*22*0.8;
[SADAG_DL] SADAGAR(4)
>= 4*19*0.8;
!Alternativa metoder motsvarar
HF8. Viss volym av detta skall drivas.;
!Just nu bortser vi
fran den restriktionen men den kan enkelt inkluderas;
!Alla vagar ar ej farbara alla
perioder;
!**************************************;
@for(Avd(i)| VSIFFRA(i)#GE#4 :
Andel(i,1) = 0);
@for(Avd(i)| VSIFFRA(i)#GE#4 : Andel(i,2) = 0);
@for(Avd(i)| VSIFFRA(i)#GE#4 :
Andel(i,3) = 0);
!Alla
avverkningsobjekt har ej acceptabel baerighet alla
perioder;
!****************************************************************;
@for(Avd(i)| TERRBSIFFRA(i)#GE#4 : Andel(i,1) = 0);
@for(Avd(i)| TERRBSIFFRA(i)#GE#4 :
Andel(i,2) = 0);
@for(Avd(i)| TERRBSIFFRA(i)#GE#4 : Andel(i,3) = 0);
! Total
avverkning;
! ****************;
!TotAvv = @sum(Avd(i): @sum(Per(t):
Andel(i,t)*M3F_TOT(i)));
! Total bestallning;
! *****************;
!TotBest = @sum(Per(t): B_TT(t)+B_GT(t)+B_BM(t)+B_FFG(t)+B_LOV(t));
! Total lagerfoerandring;
! **********************;
!TotLF = TotAvv - TotBest;
!@FREE(TotLF);
! Kontroll av
total lagerfoerandring;
!
**********************************;
!CheckLF = L_TOT(5) -
L_TOT(1);
!@FREE(CheckLF);
! Det visade sig
att TotLF överstiger CheckLF
beroende på att TotLF bygger på
tabellvärden
i kolumnen M3F_TOT. Om man summerar de olika sortimenten så blir
summan
av dem lagre an den totalt angivna volymen. Detta kan
bero på att
delar
av den totala volymen ska lamnas i skogen eller ej
kan klassificeras som de
olika
sortimenten.;
! Totala lager;
! ************;
@for(Per(t): L_TOT(t) = L_TT(t)+L_GT(t)+L_BM(t)+L_FFG(t)+L_LOV(t) );
L_TOT(5) = L_TT(5)+L_GT(5)+L_BM(5)+L_FFG(5)+L_LOV(5);
!Man kan inte
avverka mer än vad som finns i respektive avdelning;
!****************************************************************;
@for(Avd(i): @SUM(Per(t): Andel(i,t)) <= 1);
! Inlager ska inte vara lagre an kritiska granser;
! ***********************************************;
@for(Per(t): L_TT(t) >= 1000);
@for(Per(t): L_GT(t) >= 1000);
@for(Per(t): L_BM(t)
>= 1000);
@for(Per(t): L_FFG(t) >=
1000);
@for(Per(t): L_LOV(t) >= 500);
! Inlager ska inte vara foer hoega;
! ********************************;
!@for(Per(t): L_TT(t) <= 3000);
!@for(Per(t): L_GT(t) <= 3000);
!@for(Per(t): L_BM(t)
<= 2600);
!@for(Per(t): L_FFG(t) <= 2600);
!@for(Per(t): L_LOV(t) <=
2000);
! InLager + Avverkning - Utlager - Bestallning = 0 for
alla sortiment och perioder;
!*********************************************************************************;
@for(Per(t): L_TT(t) + @SUM(Avd(i): Andel(i,t)*TT(i)) - L_TT(t+1) - B_TT(t) = 0);
@for(Per(t): L_GT(t) + @SUM(Avd(i): Andel(i,t)*GT(i)) - L_GT(t+1) - B_GT(t) = 0);
@for(Per(t): L_BM(t) + @SUM(Avd(i): Andel(i,t)*BM(i)) - L_BM(t+1) - B_BM(t) = 0);
@for(Per(t): L_FFG(t) + @SUM(Avd(i): Andel(i,t)*FFG(i)) - L_FFG(t+1) - B_FFG(t) = 0);
@for(Per(t): L_LOV(t) + @SUM(Avd(i): Andel(i,t)*LOV(i)) - L_LOV(t+1) - B_LOV(t) = 0);
! Ingaende lagernivaer
i period 1 (September);
! *******************************************;
L_TT(1) = 1772;
L_GT(1) = 1619;
L_BM(1) = 1391;
L_FFG(1) = 1097;
L_LOV(1) = 635;
! Utgående lager
i period 4 = Ingående lager i period 5 (Januari);
! ***************************************************************;
L_TT(5) = 1500;
L_GT(5) = 1500;
L_BM(5) = 1500;
L_FFG(5) = 1500;
L_LOV(5) = 1000;
! Bestallningar i period 1
(September);
! ************************************;
B_TT(1) = 7000;
B_GT(1) = 4000;
B_BM(1) = 6000;
B_FFG(1) = 4000;
B_LOV(1) = 800;
! Bestallningar i period 2
(Oktober);
! **********************************;
B_TT(2) = 6000;
B_GT(2) = 6400;
B_BM(2) = 5000;
B_FFG(2) = 5500;
B_LOV(2) = 800;
! Bestallningar i period 3
(November);
! ***********************************;
B_TT(3) = 8000*1.2;
B_GT(3) = 5700;
B_BM(3) = 8000;
B_FFG(3) = 4400;
B_LOV(3) = 800;
! Bestallningar i period 4
(December);
! ***********************************;
B_TT(4) = 8500*1.2;
B_GT(4) = 5300;
B_BM(4) = 5500;
B_FFG(4) = 5500;
B_LOV(4) = 1200;
DATA:
ID,HFSIFFRA,TERRBSIFFRA,M3F_TOT,TT,GT,BM,FFG,LOV,DAGAR,VSIFFRA
=
@OLE('C:\SCA\SCA_Logistik_2007.XLS');
@OLE(
'C:\SCA\SCA_Resultat.XLS') = L_TT, L_GT, L_BM, L_FFG,
L_LOV, L_TOT,
B_TT, B_GT, B_BM,
B_FFG, B_LOV,
ANDEL, TERRBSIFFRA, VSIFFRA,
GAVOL, SAVOL, TK, DRIVNK, LAGK,
SADAGAR, GADAGAR;
ENDDATA
End
#4. Ökade räntekrav
Det visade sig att ändrade räntekrav inom stora intervall knappast
ger några skillnader i det optimala programmet eftersom övriga kostnader och restriktioner
betyder mer för lösningen.