Fuzzy Time Series Markov Chain adalah kombinasi dari dua metode: deret waktu fuzzy (Fuzzy Time Series, FTS) dan rantai Markov (Markov Chain). Tujuannya adalah untuk memperoleh probabilitas terbesar dengan menggunakan matriks probabilitas transisi Markov.

Acknowledgement: Dimas Adriansyah (who provide the original code, the code has been modified for the purposes of this research)

Input Data

datauji <- read.csv("suhu_rata_rata_kalsel_2003_2013.csv", header=T, sep =",") 
data = datauji$Rata.Rata
n=length(data)
n
[1] 132

Plot data aktual

plot(data,xlab="Periode",ylab="Suhu Rata Rata (°C)",type = "l")

Mencari data maksimum dan minimum

minimum = min(data)
maximum = max(data)
minimum
[1] 25.3
maximum
[1] 28.4

Mencari data minimum baru dan data maksimum baru untuk dijadikan sebagai batas bawah dan batas atas interval semeste pembicaraan U

new.min = minimum-0.2
new.max = maximum+0.3
new.min
[1] 25.1
new.max
[1] 28.7

Menentukan banyak interval (n) dan panjang interval (L)

n = round(1 +(3.3 *logb(length(data), base = 10)))
n
[1] 8
L = (new.max - new.min)/n
L
[1] 0.45

Menentukan batas-batas interval

intrv.1 = seq(new.min,new.max,len = n+1)
intrv.1
[1] 25.10 25.55 26.00 26.45 26.90 27.35 27.80 28.25 28.70

Pembagian interval dan membentuk himpunan fuzzy

box1 = data.frame(NA,nrow=length(intrv.1)-1,ncol=3)
names(box1) = c("bawah","atas","kel")

for (i in 1:length(intrv.1)-1) {
  box1[i,1]=intrv.1[i]
  box1[i,2]=intrv.1[i+1]
  box1[i,3]=i
  
}
box1

Menentukan nilai tengah interval

n.tengah = data.frame(tengah=(box1[,1]+box1[,2])/2,kel=box1[,3])
n.tengah

Menentukan bilangan fuzzy

fuzifikasi=c() 
for (i in 1:length(data)){
  for (j in 1:nrow(box1)){
    if (i!=which.max(data)){
      if (data[i]>=(box1[j,1])&data[i]<(box1[j,2])){
        fuzifikasi[i]=j
        break
      }
    }
    else {
      if (data[i]>=(box1[j,1])&data[i]<=(box1[j,2])){
        fuzifikasi[i]=j
        break
      }
    }
  }
}
fuzifikasi
  [1] 5 4 5 5 6 5 3 5 5 5 5 3 2 4 3 5 4 5 3 1 5 7 5 4 4 5 5 5 5 5 4 5 6 4 5 3 3 3 4 4 6 3 4 4 6 8 7 5 4 3 4 4 5 4 3 3 5 6 3 4 3 4 3 4 3 2 2 2 4 4 5 4 3 3 4 5 5 7 3 5 7 5 6 4 3 5 4 5 6
 [90] 3 2 3 2 4 4 2 2 3 3 3 5 4 3 5 4 5 4 2 3 3 3 4 5 4 1 3 5 5 5 4 3 4 4 5 5 6 2 3 4 6 4 3

Fuzifikasi ke data asal

fuzzyfy = cbind(data,fuzifikasi)
fuzzyfy
       data fuzifikasi
  [1,] 26.9          5
  [2,] 26.7          4
  [3,] 27.0          5
  [4,] 27.3          5
  [5,] 27.6          6
  [6,] 27.1          5
  [7,] 26.1          3
  [8,] 27.3          5
  [9,] 27.3          5
 [10,] 27.2          5
 [11,] 27.1          5
 [12,] 26.0          3
 [13,] 25.6          2
 [14,] 26.5          4
 [15,] 26.1          3
 [16,] 27.3          5
 [17,] 26.6          4
 [18,] 26.9          5
 [19,] 26.1          3
 [20,] 25.3          1
 [21,] 27.2          5
 [22,] 27.8          7
 [23,] 26.9          5
 [24,] 26.5          4
 [25,] 26.6          4
 [26,] 27.0          5
 [27,] 26.9          5
 [28,] 27.1          5
 [29,] 27.1          5
 [30,] 27.3          5
 [31,] 26.7          4
 [32,] 27.0          5
 [33,] 27.6          6
 [34,] 26.6          4
 [35,] 26.9          5
 [36,] 26.4          3
 [37,] 26.0          3
 [38,] 26.4          3
 [39,] 26.7          4
 [40,] 26.8          4
 [41,] 27.4          6
 [42,] 26.0          3
 [43,] 26.5          4
 [44,] 26.6          4
 [45,] 27.4          6
 [46,] 28.4          8
 [47,] 27.9          7
 [48,] 27.2          5
 [49,] 26.7          4
 [50,] 26.0          3
 [51,] 26.5          4
 [52,] 26.8          4
 [53,] 27.2          5
 [54,] 26.6          4
 [55,] 26.2          3
 [56,] 26.3          3
 [57,] 27.0          5
 [58,] 27.4          6
 [59,] 26.4          3
 [60,] 26.5          4
 [61,] 26.4          3
 [62,] 26.7          4
 [63,] 26.4          3
 [64,] 26.5          4
 [65,] 26.3          3
 [66,] 25.9          2
 [67,] 25.9          2
 [68,] 25.7          2
 [69,] 26.7          4
 [70,] 26.6          4
 [71,] 26.9          5
 [72,] 26.7          4
 [73,] 26.0          3
 [74,] 26.1          3
 [75,] 26.8          4
 [76,] 27.3          5
 [77,] 27.2          5
 [78,] 28.1          7
 [79,] 26.3          3
 [80,] 27.2          5
 [81,] 28.0          7
 [82,] 27.3          5
 [83,] 27.4          6
 [84,] 26.6          4
 [85,] 26.1          3
 [86,] 26.9          5
 [87,] 26.6          4
 [88,] 27.2          5
 [89,] 27.5          6
 [90,] 26.3          3
 [91,] 25.9          2
 [92,] 26.2          3
 [93,] 25.9          2
 [94,] 26.7          4
 [95,] 26.5          4
 [96,] 25.9          2
 [97,] 25.9          2
 [98,] 26.2          3
 [99,] 26.1          3
[100,] 26.2          3
[101,] 27.0          5
[102,] 26.5          4
[103,] 26.2          3
[104,] 26.9          5
[105,] 26.8          4
[106,] 27.3          5
[107,] 26.7          4
[108,] 25.9          2
[109,] 26.2          3
[110,] 26.1          3
[111,] 26.4          3
[112,] 26.8          4
[113,] 27.1          5
[114,] 26.5          4
[115,] 25.5          1
[116,] 26.3          3
[117,] 26.9          5
[118,] 27.3          5
[119,] 27.0          5
[120,] 26.5          4
[121,] 26.4          3
[122,] 26.5          4
[123,] 26.8          4
[124,] 27.2          5
[125,] 27.0          5
[126,] 27.4          6
[127,] 25.9          2
[128,] 26.2          3
[129,] 26.8          4
[130,] 27.6          6
[131,] 26.6          4
[132,] 26.0          3

Membuat Fuzzy Logical Relation (FLR)

FLR = data.frame(fuzzifikasi=0,left=NA,right =NA)
for (i in 1:length(fuzifikasi)) {
  FLR[i,1] = fuzifikasi[i]
  FLR[i+1,2] = fuzifikasi[i]
  FLR[i,3] = fuzifikasi[i]
}
FLR = FLR[-nrow(FLR),]
FLR = FLR[-1,]
FLR

Membuat Fuzyy Logical Relation Group (FLRG)

FLRG = table(FLR[,2:3])
FLRG
    right
left  1  2  3  4  5  6  7  8
   1  0  0  1  0  1  0  0  0
   2  0  3  4  3  0  0  0  0
   3  1  4  8 10  8  0  0  0
   4  1  2 11  7 12  3  0  0
   5  0  0  4 13 12  6  3  0
   6  0  1  3  3  1  0  0  1
   7  0  0  1  0  3  0  0  0
   8  0  0  0  0  0  0  1  0

Membuat matriks transisi

bobot = round(prop.table(table(FLR[,2:3]),1),5)
bobot
    right
left       1       2       3       4       5       6       7       8
   1 0.00000 0.00000 0.50000 0.00000 0.50000 0.00000 0.00000 0.00000
   2 0.00000 0.30000 0.40000 0.30000 0.00000 0.00000 0.00000 0.00000
   3 0.03226 0.12903 0.25806 0.32258 0.25806 0.00000 0.00000 0.00000
   4 0.02778 0.05556 0.30556 0.19444 0.33333 0.08333 0.00000 0.00000
   5 0.00000 0.00000 0.10526 0.34211 0.31579 0.15789 0.07895 0.00000
   6 0.00000 0.11111 0.33333 0.33333 0.11111 0.00000 0.00000 0.11111
   7 0.00000 0.00000 0.25000 0.00000 0.75000 0.00000 0.00000 0.00000
   8 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 1.00000 0.00000

Peralaman awal

diagonal = diag(bobot)
m.diagonal = diag(diagonal)
#mengambil nilai selain diagonal
pinggir = bobot-m.diagonal

ramal=NULL
for (i in 1:(length(fuzifikasi))){
  for (j in 1:(nrow(bobot))){
    if (fuzifikasi[i]==j)
    {ramal[i+1]=(diagonal[j]*data[i])+sum(pinggir[j,]*n.tengah[,1]) }else
      if (fuzifikasi[i]==j)
      {ramal[i]=0}
  }
}
ramal = ramal[-length(ramal)]
ramal
  [1]       NA 26.94737 26.67985 26.97895 27.07369 26.67473 27.01053 26.48280 27.07369 27.07369 27.04211 27.01053 26.45699 26.17250 26.64096 26.48280 27.07369 26.66040 26.94737
 [20] 26.48280 26.67500 27.04211 26.90000 26.94737 26.64096 26.66040 26.97895 26.94737 27.01053 27.01053 27.07369 26.67985 26.97895 26.67473 26.66040 26.94737 26.56022 26.45699
 [39] 26.56022 26.67985 26.69929 26.67473 26.45699 26.64096 26.66040 26.67473 28.02500 26.90000 27.04211 26.67985 26.45699 26.64096 26.69929 27.04211 26.66040 26.50860 26.53441
 [58] 26.97895 26.67473 26.56022 26.64096 26.56022 26.67985 26.56022 26.64096 26.53441 26.26250 26.26250 26.20250 26.67985 26.66040 26.94737 26.67985 26.45699 26.48280 26.69929
 [77] 27.07369 27.04211 26.90000 26.53441 27.04211 26.90000 27.07369 26.67473 26.66040 26.48280 26.94737 26.66040 27.04211 26.67473 26.53441 26.26250 26.50860 26.26250 26.67985
 [96] 26.64096 26.26250 26.26250 26.50860 26.48280 26.50860 26.97895 26.64096 26.50860 26.94737 26.69929 27.07369 26.67985 26.26250 26.50860 26.48280 26.56022 26.69929 27.01053
[115] 26.64096 26.67500 26.53441 26.94737 27.07369 26.97895 26.64096 26.56022 26.64096 26.69929 27.04211 26.97895 26.67473 26.26250 26.50860 26.69929 26.67473 26.66040

Adjusted forecasting value (peramalan tahap kedua)

adjusted = rep(0,nrow(FLR)) 
selisih = FLR[,3]-FLR[,2] 
for(i in 1:nrow(FLR))
{
  if (FLR[i,2]!=FLR[i,3] && diagonal[FLR[i,2]]==0)
  {adjusted[i]=selisih[i]*(L/2)} else   #Untuk tidak komunicate
    if (selisih[i]==1 && diagonal[FLR[i,2]]>0)
    {adjusted[i]=(L)} else #Untuk  komunicate
      if (FLR[i,2]!=FLR[i,3] && diagonal[FLR[i,2]]>0)
      {adjusted[i]=selisih[i]*L/2} #Untuk komunicate
}
adjusted
  [1] -0.225  0.450  0.000  0.450 -0.225 -0.450  0.450  0.000  0.000  0.000 -0.450 -0.225  0.450 -0.225  0.450 -0.225  0.450 -0.450 -0.450  0.900  0.450 -0.450 -0.225  0.000  0.450
 [26]  0.000  0.000  0.000  0.000 -0.225  0.450  0.450 -0.450  0.450 -0.450  0.000  0.000  0.450  0.000  0.450 -0.675  0.450  0.000  0.450  0.450 -0.225 -0.450 -0.225 -0.225  0.450
 [51]  0.000  0.450 -0.225 -0.225  0.000  0.450  0.450 -0.675  0.450 -0.225  0.450 -0.225  0.450 -0.225 -0.225  0.000  0.000  0.450  0.000  0.450 -0.225 -0.225  0.000  0.450  0.450
 [76]  0.000  0.450 -0.900  0.450  0.450 -0.450  0.450 -0.450 -0.225  0.450 -0.225  0.450  0.450 -0.675 -0.225  0.450 -0.225  0.450  0.000 -0.450  0.000  0.450  0.000  0.000  0.450
[101] -0.225 -0.225  0.450 -0.225  0.450 -0.225 -0.450  0.450  0.000  0.000  0.450  0.450 -0.225 -0.675  0.450  0.450  0.000  0.000 -0.225 -0.225  0.450  0.000  0.450  0.000  0.450
[126] -0.900  0.450  0.450  0.450 -0.450 -0.225

Peralaman tahap terakhir

ramal=ramal[c(2:length(ramal))]
adj.forecast=adjusted + ramal
adj.forecast
  [1] 26.72237 27.12985 26.97895 27.52369 26.44973 26.56053 26.93280 27.07369 27.07369 27.04211 26.56053 26.23199 26.62250 26.41596 26.93280 26.84869 27.11040 26.49737 26.03280
 [20] 27.57500 27.49211 26.45000 26.72237 26.64096 27.11040 26.97895 26.94737 27.01053 27.01053 26.84869 27.12985 27.42895 26.22473 27.11040 26.49737 26.56022 26.45699 27.01022
 [39] 26.67985 27.14929 25.99973 26.90699 26.64096 27.11040 27.12473 27.80000 26.45000 26.81711 26.45485 26.90699 26.64096 27.14929 26.81711 26.43540 26.50860 26.98441 27.42895
 [58] 25.99973 27.01022 26.41596 27.01022 26.45485 27.01022 26.41596 26.30941 26.26250 26.26250 26.65250 26.67985 27.11040 26.72237 26.45485 26.45699 26.93280 27.14929 27.07369
 [77] 27.49211 26.00000 26.98441 27.49211 26.45000 27.52369 26.22473 26.43540 26.93280 26.72237 27.11040 27.49211 25.99973 26.30941 26.71250 26.28360 26.71250 26.67985 26.19096
 [96] 26.26250 26.71250 26.50860 26.48280 26.95860 26.75395 26.41596 26.95860 26.72237 27.14929 26.84869 26.22985 26.71250 26.50860 26.48280 27.01022 27.14929 26.78553 25.96596
[115] 27.12500 26.98441 26.94737 27.07369 26.75395 26.41596 27.01022 26.64096 27.14929 27.04211 27.42895 25.77473 26.71250 26.95860 27.14929 26.22473 26.43540

Tabel pembanding dengan hasil penyesuaian kedua

datapakai = data[c(2:length(data))]
galat = abs(datapakai-adj.forecast)
tabel = cbind(datapakai,ramal,adjusted,adj.forecast,galat)
tabel
       datapakai    ramal adjusted adj.forecast      galat
  [1,]      26.7 26.94737   -0.225     26.72237 0.02236925
  [2,]      27.0 26.67985    0.450     27.12985 0.12984750
  [3,]      27.3 26.97895    0.000     26.97895 0.32105175
  [4,]      27.6 27.07369    0.450     27.52369 0.07631475
  [5,]      27.1 26.67473   -0.225     26.44973 0.65026675
  [6,]      26.1 27.01053   -0.450     26.56053 0.46052725
  [7,]      27.3 26.48280    0.450     26.93280 0.36720225
  [8,]      27.3 27.07369    0.000     27.07369 0.22631475
  [9,]      27.2 27.07369    0.000     27.07369 0.12631475
 [10,]      27.1 27.04211    0.000     27.04211 0.05789375
 [11,]      26.0 27.01053   -0.450     26.56053 0.56052725
 [12,]      25.6 26.45699   -0.225     26.23199 0.63199175
 [13,]      26.5 26.17250    0.450     26.62250 0.12250000
 [14,]      26.1 26.64096   -0.225     26.41596 0.31595950
 [15,]      27.3 26.48280    0.450     26.93280 0.36720225
 [16,]      26.6 27.07369   -0.225     26.84869 0.24868525
 [17,]      26.9 26.66040    0.450     27.11040 0.21040350
 [18,]      26.1 26.94737   -0.450     26.49737 0.39736925
 [19,]      25.3 26.48280   -0.450     26.03280 0.73279775
 [20,]      27.2 26.67500    0.900     27.57500 0.37500000
 [21,]      27.8 27.04211    0.450     27.49211 0.30789375
 [22,]      26.9 26.90000   -0.450     26.45000 0.45000000
 [23,]      26.5 26.94737   -0.225     26.72237 0.22236925
 [24,]      26.6 26.64096    0.000     26.64096 0.04095950
 [25,]      27.0 26.66040    0.450     27.11040 0.11040350
 [26,]      26.9 26.97895    0.000     26.97895 0.07894825
 [27,]      27.1 26.94737    0.000     26.94737 0.15263075
 [28,]      27.1 27.01053    0.000     27.01053 0.08947275
 [29,]      27.3 27.01053    0.000     27.01053 0.28947275
 [30,]      26.7 27.07369   -0.225     26.84869 0.14868525
 [31,]      27.0 26.67985    0.450     27.12985 0.12984750
 [32,]      27.6 26.97895    0.450     27.42895 0.17105175
 [33,]      26.6 26.67473   -0.450     26.22473 0.37526675
 [34,]      26.9 26.66040    0.450     27.11040 0.21040350
 [35,]      26.4 26.94737   -0.450     26.49737 0.09736925
 [36,]      26.0 26.56022    0.000     26.56022 0.56021575
 [37,]      26.4 26.45699    0.000     26.45699 0.05699175
 [38,]      26.7 26.56022    0.450     27.01022 0.31021575
 [39,]      26.8 26.67985    0.000     26.67985 0.12015250
 [40,]      27.4 26.69929    0.450     27.14929 0.25070850
 [41,]      26.0 26.67473   -0.675     25.99973 0.00026675
 [42,]      26.5 26.45699    0.450     26.90699 0.40699175
 [43,]      26.6 26.64096    0.000     26.64096 0.04095950
 [44,]      27.4 26.66040    0.450     27.11040 0.28959650
 [45,]      28.4 26.67473    0.450     27.12473 1.27526675
 [46,]      27.9 28.02500   -0.225     27.80000 0.10000000
 [47,]      27.2 26.90000   -0.450     26.45000 0.75000000
 [48,]      26.7 27.04211   -0.225     26.81711 0.11710625
 [49,]      26.0 26.67985   -0.225     26.45485 0.45484750
 [50,]      26.5 26.45699    0.450     26.90699 0.40699175
 [51,]      26.8 26.64096    0.000     26.64096 0.15904050
 [52,]      27.2 26.69929    0.450     27.14929 0.05070850
 [53,]      26.6 27.04211   -0.225     26.81711 0.21710625
 [54,]      26.2 26.66040   -0.225     26.43540 0.23540350
 [55,]      26.3 26.50860    0.000     26.50860 0.20860375
 [56,]      27.0 26.53441    0.450     26.98441 0.01559025
 [57,]      27.4 26.97895    0.450     27.42895 0.02894825
 [58,]      26.4 26.67473   -0.675     25.99973 0.40026675
 [59,]      26.5 26.56022    0.450     27.01022 0.51021575
 [60,]      26.4 26.64096   -0.225     26.41596 0.01595950
 [61,]      26.7 26.56022    0.450     27.01022 0.31021575
 [62,]      26.4 26.67985   -0.225     26.45485 0.05484750
 [63,]      26.5 26.56022    0.450     27.01022 0.51021575
 [64,]      26.3 26.64096   -0.225     26.41596 0.11595950
 [65,]      25.9 26.53441   -0.225     26.30941 0.40940975
 [66,]      25.9 26.26250    0.000     26.26250 0.36250000
 [67,]      25.7 26.26250    0.000     26.26250 0.56250000
 [68,]      26.7 26.20250    0.450     26.65250 0.04750000
 [69,]      26.6 26.67985    0.000     26.67985 0.07984750
 [70,]      26.9 26.66040    0.450     27.11040 0.21040350
 [71,]      26.7 26.94737   -0.225     26.72237 0.02236925
 [72,]      26.0 26.67985   -0.225     26.45485 0.45484750
 [73,]      26.1 26.45699    0.000     26.45699 0.35699175
 [74,]      26.8 26.48280    0.450     26.93280 0.13279775
 [75,]      27.3 26.69929    0.450     27.14929 0.15070850
 [76,]      27.2 27.07369    0.000     27.07369 0.12631475
 [77,]      28.1 27.04211    0.450     27.49211 0.60789375
 [78,]      26.3 26.90000   -0.900     26.00000 0.30000000
 [79,]      27.2 26.53441    0.450     26.98441 0.21559025
 [80,]      28.0 27.04211    0.450     27.49211 0.50789375
 [81,]      27.3 26.90000   -0.450     26.45000 0.85000000
 [82,]      27.4 27.07369    0.450     27.52369 0.12368525
 [83,]      26.6 26.67473   -0.450     26.22473 0.37526675
 [84,]      26.1 26.66040   -0.225     26.43540 0.33540350
 [85,]      26.9 26.48280    0.450     26.93280 0.03279775
 [86,]      26.6 26.94737   -0.225     26.72237 0.12236925
 [87,]      27.2 26.66040    0.450     27.11040 0.08959650
 [88,]      27.5 27.04211    0.450     27.49211 0.00789375
 [89,]      26.3 26.67473   -0.675     25.99973 0.30026675
 [90,]      25.9 26.53441   -0.225     26.30941 0.40940975
 [91,]      26.2 26.26250    0.450     26.71250 0.51250000
 [92,]      25.9 26.50860   -0.225     26.28360 0.38360375
 [93,]      26.7 26.26250    0.450     26.71250 0.01250000
 [94,]      26.5 26.67985    0.000     26.67985 0.17984750
 [95,]      25.9 26.64096   -0.450     26.19096 0.29095950
 [96,]      25.9 26.26250    0.000     26.26250 0.36250000
 [97,]      26.2 26.26250    0.450     26.71250 0.51250000
 [98,]      26.1 26.50860    0.000     26.50860 0.40860375
 [99,]      26.2 26.48280    0.000     26.48280 0.28279775
[100,]      27.0 26.50860    0.450     26.95860 0.04139625
[101,]      26.5 26.97895   -0.225     26.75395 0.25394825
[102,]      26.2 26.64096   -0.225     26.41596 0.21595950
[103,]      26.9 26.50860    0.450     26.95860 0.05860375
[104,]      26.8 26.94737   -0.225     26.72237 0.07763075
[105,]      27.3 26.69929    0.450     27.14929 0.15070850
[106,]      26.7 27.07369   -0.225     26.84869 0.14868525
[107,]      25.9 26.67985   -0.450     26.22985 0.32984750
[108,]      26.2 26.26250    0.450     26.71250 0.51250000
[109,]      26.1 26.50860    0.000     26.50860 0.40860375
[110,]      26.4 26.48280    0.000     26.48280 0.08279775
[111,]      26.8 26.56022    0.450     27.01022 0.21021575
[112,]      27.1 26.69929    0.450     27.14929 0.04929150
[113,]      26.5 27.01053   -0.225     26.78553 0.28552725
[114,]      25.5 26.64096   -0.675     25.96596 0.46595950
[115,]      26.3 26.67500    0.450     27.12500 0.82500000
[116,]      26.9 26.53441    0.450     26.98441 0.08440975
[117,]      27.3 26.94737    0.000     26.94737 0.35263075
[118,]      27.0 27.07369    0.000     27.07369 0.07368525
[119,]      26.5 26.97895   -0.225     26.75395 0.25394825
[120,]      26.4 26.64096   -0.225     26.41596 0.01595950
[121,]      26.5 26.56022    0.450     27.01022 0.51021575
[122,]      26.8 26.64096    0.000     26.64096 0.15904050
[123,]      27.2 26.69929    0.450     27.14929 0.05070850
[124,]      27.0 27.04211    0.000     27.04211 0.04210625
[125,]      27.4 26.97895    0.450     27.42895 0.02894825
[126,]      25.9 26.67473   -0.900     25.77473 0.12526675
[127,]      26.2 26.26250    0.450     26.71250 0.51250000
[128,]      26.8 26.50860    0.450     26.95860 0.15860375
[129,]      27.6 26.69929    0.450     27.14929 0.45070850
[130,]      26.6 26.67473   -0.450     26.22473 0.37526675
[131,]      26.0 26.66040   -0.225     26.43540 0.43540350

Penyesuaian overestimate ramalan

adj.forecast2 = rep(0,length(datapakai)) 
for(i in 1:length(datapakai)){
  if((ramal[i]-datapakai[i])<(adj.forecast[i]-datapakai[i])) {
    adj.forecast2[i]=ramal[i]+(L/2)
  } else {
    adj.forecast2[i]=adj.forecast[i]}
}
adj.forecast2
  [1] 26.72237 26.90485 26.97895 27.29869 26.44973 26.56053 26.70780 27.07369 27.07369 27.04211 26.56053 26.23199 26.39750 26.41596 26.70780 26.84869 26.88540 26.49737 26.03280
 [20] 26.90000 27.26711 26.45000 26.72237 26.64096 26.88540 26.97895 26.94737 27.01053 27.01053 26.84869 26.90485 27.20395 26.22473 26.88540 26.49737 26.56022 26.45699 26.78522
 [39] 26.67985 26.92429 25.99973 26.68199 26.64096 26.88540 26.89973 27.80000 26.45000 26.81711 26.45485 26.68199 26.64096 26.92429 26.81711 26.43540 26.50860 26.75941 27.20395
 [58] 25.99973 26.78522 26.41596 26.78522 26.45485 26.78522 26.41596 26.30941 26.26250 26.26250 26.42750 26.67985 26.88540 26.72237 26.45485 26.45699 26.70780 26.92429 27.07369
 [77] 27.26711 26.00000 26.75941 27.26711 26.45000 27.29869 26.22473 26.43540 26.70780 26.72237 26.88540 27.26711 25.99973 26.30941 26.48750 26.28360 26.48750 26.67985 26.19096
 [96] 26.26250 26.48750 26.50860 26.48280 26.73360 26.75395 26.41596 26.73360 26.72237 26.92429 26.84869 26.22985 26.48750 26.50860 26.48280 26.78522 26.92429 26.78553 25.96596
[115] 26.90000 26.75941 26.94737 27.07369 26.75395 26.41596 26.78522 26.64096 26.92429 27.04211 27.20395 25.77473 26.48750 26.73360 26.92429 26.22473 26.43540

Tabel pembanding dengan hasil penyesuaian kedua

tabel2 = cbind(datapakai,ramal,adj.forecast,adj.forecast2)
tabel2
       datapakai    ramal adj.forecast adj.forecast2
  [1,]      26.7 26.94737     26.72237      26.72237
  [2,]      27.0 26.67985     27.12985      26.90485
  [3,]      27.3 26.97895     26.97895      26.97895
  [4,]      27.6 27.07369     27.52369      27.29869
  [5,]      27.1 26.67473     26.44973      26.44973
  [6,]      26.1 27.01053     26.56053      26.56053
  [7,]      27.3 26.48280     26.93280      26.70780
  [8,]      27.3 27.07369     27.07369      27.07369
  [9,]      27.2 27.07369     27.07369      27.07369
 [10,]      27.1 27.04211     27.04211      27.04211
 [11,]      26.0 27.01053     26.56053      26.56053
 [12,]      25.6 26.45699     26.23199      26.23199
 [13,]      26.5 26.17250     26.62250      26.39750
 [14,]      26.1 26.64096     26.41596      26.41596
 [15,]      27.3 26.48280     26.93280      26.70780
 [16,]      26.6 27.07369     26.84869      26.84869
 [17,]      26.9 26.66040     27.11040      26.88540
 [18,]      26.1 26.94737     26.49737      26.49737
 [19,]      25.3 26.48280     26.03280      26.03280
 [20,]      27.2 26.67500     27.57500      26.90000
 [21,]      27.8 27.04211     27.49211      27.26711
 [22,]      26.9 26.90000     26.45000      26.45000
 [23,]      26.5 26.94737     26.72237      26.72237
 [24,]      26.6 26.64096     26.64096      26.64096
 [25,]      27.0 26.66040     27.11040      26.88540
 [26,]      26.9 26.97895     26.97895      26.97895
 [27,]      27.1 26.94737     26.94737      26.94737
 [28,]      27.1 27.01053     27.01053      27.01053
 [29,]      27.3 27.01053     27.01053      27.01053
 [30,]      26.7 27.07369     26.84869      26.84869
 [31,]      27.0 26.67985     27.12985      26.90485
 [32,]      27.6 26.97895     27.42895      27.20395
 [33,]      26.6 26.67473     26.22473      26.22473
 [34,]      26.9 26.66040     27.11040      26.88540
 [35,]      26.4 26.94737     26.49737      26.49737
 [36,]      26.0 26.56022     26.56022      26.56022
 [37,]      26.4 26.45699     26.45699      26.45699
 [38,]      26.7 26.56022     27.01022      26.78522
 [39,]      26.8 26.67985     26.67985      26.67985
 [40,]      27.4 26.69929     27.14929      26.92429
 [41,]      26.0 26.67473     25.99973      25.99973
 [42,]      26.5 26.45699     26.90699      26.68199
 [43,]      26.6 26.64096     26.64096      26.64096
 [44,]      27.4 26.66040     27.11040      26.88540
 [45,]      28.4 26.67473     27.12473      26.89973
 [46,]      27.9 28.02500     27.80000      27.80000
 [47,]      27.2 26.90000     26.45000      26.45000
 [48,]      26.7 27.04211     26.81711      26.81711
 [49,]      26.0 26.67985     26.45485      26.45485
 [50,]      26.5 26.45699     26.90699      26.68199
 [51,]      26.8 26.64096     26.64096      26.64096
 [52,]      27.2 26.69929     27.14929      26.92429
 [53,]      26.6 27.04211     26.81711      26.81711
 [54,]      26.2 26.66040     26.43540      26.43540
 [55,]      26.3 26.50860     26.50860      26.50860
 [56,]      27.0 26.53441     26.98441      26.75941
 [57,]      27.4 26.97895     27.42895      27.20395
 [58,]      26.4 26.67473     25.99973      25.99973
 [59,]      26.5 26.56022     27.01022      26.78522
 [60,]      26.4 26.64096     26.41596      26.41596
 [61,]      26.7 26.56022     27.01022      26.78522
 [62,]      26.4 26.67985     26.45485      26.45485
 [63,]      26.5 26.56022     27.01022      26.78522
 [64,]      26.3 26.64096     26.41596      26.41596
 [65,]      25.9 26.53441     26.30941      26.30941
 [66,]      25.9 26.26250     26.26250      26.26250
 [67,]      25.7 26.26250     26.26250      26.26250
 [68,]      26.7 26.20250     26.65250      26.42750
 [69,]      26.6 26.67985     26.67985      26.67985
 [70,]      26.9 26.66040     27.11040      26.88540
 [71,]      26.7 26.94737     26.72237      26.72237
 [72,]      26.0 26.67985     26.45485      26.45485
 [73,]      26.1 26.45699     26.45699      26.45699
 [74,]      26.8 26.48280     26.93280      26.70780
 [75,]      27.3 26.69929     27.14929      26.92429
 [76,]      27.2 27.07369     27.07369      27.07369
 [77,]      28.1 27.04211     27.49211      27.26711
 [78,]      26.3 26.90000     26.00000      26.00000
 [79,]      27.2 26.53441     26.98441      26.75941
 [80,]      28.0 27.04211     27.49211      27.26711
 [81,]      27.3 26.90000     26.45000      26.45000
 [82,]      27.4 27.07369     27.52369      27.29869
 [83,]      26.6 26.67473     26.22473      26.22473
 [84,]      26.1 26.66040     26.43540      26.43540
 [85,]      26.9 26.48280     26.93280      26.70780
 [86,]      26.6 26.94737     26.72237      26.72237
 [87,]      27.2 26.66040     27.11040      26.88540
 [88,]      27.5 27.04211     27.49211      27.26711
 [89,]      26.3 26.67473     25.99973      25.99973
 [90,]      25.9 26.53441     26.30941      26.30941
 [91,]      26.2 26.26250     26.71250      26.48750
 [92,]      25.9 26.50860     26.28360      26.28360
 [93,]      26.7 26.26250     26.71250      26.48750
 [94,]      26.5 26.67985     26.67985      26.67985
 [95,]      25.9 26.64096     26.19096      26.19096
 [96,]      25.9 26.26250     26.26250      26.26250
 [97,]      26.2 26.26250     26.71250      26.48750
 [98,]      26.1 26.50860     26.50860      26.50860
 [99,]      26.2 26.48280     26.48280      26.48280
[100,]      27.0 26.50860     26.95860      26.73360
[101,]      26.5 26.97895     26.75395      26.75395
[102,]      26.2 26.64096     26.41596      26.41596
[103,]      26.9 26.50860     26.95860      26.73360
[104,]      26.8 26.94737     26.72237      26.72237
[105,]      27.3 26.69929     27.14929      26.92429
[106,]      26.7 27.07369     26.84869      26.84869
[107,]      25.9 26.67985     26.22985      26.22985
[108,]      26.2 26.26250     26.71250      26.48750
[109,]      26.1 26.50860     26.50860      26.50860
[110,]      26.4 26.48280     26.48280      26.48280
[111,]      26.8 26.56022     27.01022      26.78522
[112,]      27.1 26.69929     27.14929      26.92429
[113,]      26.5 27.01053     26.78553      26.78553
[114,]      25.5 26.64096     25.96596      25.96596
[115,]      26.3 26.67500     27.12500      26.90000
[116,]      26.9 26.53441     26.98441      26.75941
[117,]      27.3 26.94737     26.94737      26.94737
[118,]      27.0 27.07369     27.07369      27.07369
[119,]      26.5 26.97895     26.75395      26.75395
[120,]      26.4 26.64096     26.41596      26.41596
[121,]      26.5 26.56022     27.01022      26.78522
[122,]      26.8 26.64096     26.64096      26.64096
[123,]      27.2 26.69929     27.14929      26.92429
[124,]      27.0 27.04211     27.04211      27.04211
[125,]      27.4 26.97895     27.42895      27.20395
[126,]      25.9 26.67473     25.77473      25.77473
[127,]      26.2 26.26250     26.71250      26.48750
[128,]      26.8 26.50860     26.95860      26.73360
[129,]      27.6 26.69929     27.14929      26.92429
[130,]      26.6 26.67473     26.22473      26.22473
[131,]      26.0 26.66040     26.43540      26.43540
tail(tabel2)
       datapakai    ramal adj.forecast adj.forecast2
[126,]      25.9 26.67473     25.77473      25.77473
[127,]      26.2 26.26250     26.71250      26.48750
[128,]      26.8 26.50860     26.95860      26.73360
[129,]      27.6 26.69929     27.14929      26.92429
[130,]      26.6 26.67473     26.22473      26.22473
[131,]      26.0 26.66040     26.43540      26.43540

Uji Ketepatan

galat2 = abs(datapakai-adj.forecast2)
MSE = mean(galat2^2, na.rm = TRUE)
MAE = mean(abs(galat2), na.rm = TRUE)
MAPE = mean(abs(galat2/datapakai*100), na.rm=TRUE)
ketepatan = cbind(MSE,MAE,MAPE)
ketepatan
           MSE       MAE     MAPE
[1,] 0.1274708 0.2827911 1.058075

Plot data asli dan data prediksi

plot(c(2:length(data)),data[c(2:length(data))],type="l",xlab="Periode",ylab="Suhu Rata Rata (°C)") 
lines(c(2:length(data)),ramal[c(1:length(ramal))],lty=2) 
legend(10,12000,c("actual","forecast.markov"),bty="n",lty=c(1,2))

LS0tDQp0aXRsZTogIkEgRlVaWlkgVElNRSBTRVJJRVMgTUFSS09WIENIQUlOIChGVFNNQykgTU9ERUwgV0lUSCBBTiBBUFBMSUNBVElPTiBUTyBGT1JFQ0FTVCBUSEUgQVZFUkFHRSBURU1QRVJBVFVSRSBJTiBTT1VUSCBLQUxJTUFOVEFOIEJBU0VEIE9OIE1PTlRITFkgREFUQSBGUk9NIFRIRSBDRU5UUkFMIFNUQVRJU1RJQ1MgQUdFTkNZIChCUFMpIElOIDIwMDMtMjAxMyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCkZ1enp5IFRpbWUgU2VyaWVzIE1hcmtvdiBDaGFpbiBhZGFsYWgga29tYmluYXNpIGRhcmkgZHVhIG1ldG9kZTogZGVyZXQgd2FrdHUgZnV6enkgKEZ1enp5IFRpbWUgU2VyaWVzLCBGVFMpIGRhbiByYW50YWkgTWFya292IChNYXJrb3YgQ2hhaW4pLiBUdWp1YW5ueWEgYWRhbGFoIHVudHVrIG1lbXBlcm9sZWggcHJvYmFiaWxpdGFzIHRlcmJlc2FyIGRlbmdhbiBtZW5nZ3VuYWthbiBtYXRyaWtzIHByb2JhYmlsaXRhcyB0cmFuc2lzaSBNYXJrb3YuDQoNCioqQWNrbm93bGVkZ2VtZW50OioqIERpbWFzIEFkcmlhbnN5YWggKHdobyBwcm92aWRlIHRoZSBvcmlnaW5hbCBjb2RlLCB0aGUgY29kZSBoYXMgYmVlbiBtb2RpZmllZCBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgcmVzZWFyY2gpDQoNCioqSW5wdXQgRGF0YSoqDQoNCmBgYHtyfQ0KZGF0YXVqaSA8LSByZWFkLmNzdigic3VodV9yYXRhX3JhdGFfa2Fsc2VsXzIwMDNfMjAxMy5jc3YiLCBoZWFkZXI9VCwgc2VwID0iLCIpIA0KZGF0YSA9IGRhdGF1amkkUmF0YS5SYXRhDQpuPWxlbmd0aChkYXRhKQ0Kbg0KYGBgDQoNCioqUGxvdCBkYXRhIGFrdHVhbCoqDQoNCmBgYHtyfQ0KcGxvdChkYXRhLHhsYWI9IlBlcmlvZGUiLHlsYWI9IlN1aHUgUmF0YSBSYXRhICjCsEMpIix0eXBlID0gImwiKQ0KYGBgDQoNCioqTWVuY2FyaSBkYXRhIG1ha3NpbXVtIGRhbiBtaW5pbXVtKioNCg0KYGBge3J9DQptaW5pbXVtID0gbWluKGRhdGEpDQptYXhpbXVtID0gbWF4KGRhdGEpDQptaW5pbXVtDQptYXhpbXVtDQpgYGANCg0KKipNZW5jYXJpIGRhdGEgbWluaW11bSBiYXJ1IGRhbiBkYXRhIG1ha3NpbXVtIGJhcnUgdW50dWsgZGlqYWRpa2FuIHNlYmFnYWkgYmF0YXMgYmF3YWggZGFuIGJhdGFzIGF0YXMgaW50ZXJ2YWwgc2VtZXN0ZSBwZW1iaWNhcmFhbiBVKioNCg0KYGBge3J9DQpuZXcubWluID0gbWluaW11bS0wLjINCm5ldy5tYXggPSBtYXhpbXVtKzAuMw0KbmV3Lm1pbg0KbmV3Lm1heA0KYGBgDQoNCioqTWVuZW50dWthbiBiYW55YWsgaW50ZXJ2YWwgKG4pIGRhbiBwYW5qYW5nIGludGVydmFsIChMKSoqDQoNCmBgYHtyfQ0KbiA9IHJvdW5kKDEgKygzLjMgKmxvZ2IobGVuZ3RoKGRhdGEpLCBiYXNlID0gMTApKSkNCm4NCkwgPSAobmV3Lm1heCAtIG5ldy5taW4pL24NCkwNCmBgYA0KDQoqKk1lbmVudHVrYW4gYmF0YXMtYmF0YXMgaW50ZXJ2YWwqKg0KDQpgYGB7cn0NCmludHJ2LjEgPSBzZXEobmV3Lm1pbixuZXcubWF4LGxlbiA9IG4rMSkNCmludHJ2LjENCmBgYA0KDQoqKlBlbWJhZ2lhbiBpbnRlcnZhbCBkYW4gbWVtYmVudHVrIGhpbXB1bmFuIGZ1enp5KioNCg0KYGBge3J9DQpib3gxID0gZGF0YS5mcmFtZShOQSxucm93PWxlbmd0aChpbnRydi4xKS0xLG5jb2w9MykNCm5hbWVzKGJveDEpID0gYygiYmF3YWgiLCJhdGFzIiwia2VsIikNCg0KZm9yIChpIGluIDE6bGVuZ3RoKGludHJ2LjEpLTEpIHsNCiAgYm94MVtpLDFdPWludHJ2LjFbaV0NCiAgYm94MVtpLDJdPWludHJ2LjFbaSsxXQ0KICBib3gxW2ksM109aQ0KICANCn0NCmJveDENCmBgYA0KDQoqKk1lbmVudHVrYW4gbmlsYWkgdGVuZ2FoIGludGVydmFsKioNCg0KYGBge3J9DQpuLnRlbmdhaCA9IGRhdGEuZnJhbWUodGVuZ2FoPShib3gxWywxXStib3gxWywyXSkvMixrZWw9Ym94MVssM10pDQpuLnRlbmdhaA0KYGBgDQoNCioqTWVuZW50dWthbiBiaWxhbmdhbiBmdXp6eSoqDQoNCmBgYHtyfQ0KZnV6aWZpa2FzaT1jKCkgDQpmb3IgKGkgaW4gMTpsZW5ndGgoZGF0YSkpew0KICBmb3IgKGogaW4gMTpucm93KGJveDEpKXsNCiAgICBpZiAoaSE9d2hpY2gubWF4KGRhdGEpKXsNCiAgICAgIGlmIChkYXRhW2ldPj0oYm94MVtqLDFdKSZkYXRhW2ldPChib3gxW2osMl0pKXsNCiAgICAgICAgZnV6aWZpa2FzaVtpXT1qDQogICAgICAgIGJyZWFrDQogICAgICB9DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgaWYgKGRhdGFbaV0+PShib3gxW2osMV0pJmRhdGFbaV08PShib3gxW2osMl0pKXsNCiAgICAgICAgZnV6aWZpa2FzaVtpXT1qDQogICAgICAgIGJyZWFrDQogICAgICB9DQogICAgfQ0KICB9DQp9DQpmdXppZmlrYXNpDQpgYGANCg0KKipGdXppZmlrYXNpIGtlIGRhdGEgYXNhbCoqDQoNCmBgYHtyfQ0KZnV6enlmeSA9IGNiaW5kKGRhdGEsZnV6aWZpa2FzaSkNCmZ1enp5ZnkNCmBgYA0KDQoqKk1lbWJ1YXQgRnV6enkgTG9naWNhbCBSZWxhdGlvbiAoRkxSKSoqDQoNCmBgYHtyfQ0KRkxSID0gZGF0YS5mcmFtZShmdXp6aWZpa2FzaT0wLGxlZnQ9TkEscmlnaHQgPU5BKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGZ1emlmaWthc2kpKSB7DQogIEZMUltpLDFdID0gZnV6aWZpa2FzaVtpXQ0KICBGTFJbaSsxLDJdID0gZnV6aWZpa2FzaVtpXQ0KICBGTFJbaSwzXSA9IGZ1emlmaWthc2lbaV0NCn0NCkZMUiA9IEZMUlstbnJvdyhGTFIpLF0NCkZMUiA9IEZMUlstMSxdDQpGTFINCmBgYA0KDQoqKk1lbWJ1YXQgRnV6eXkgTG9naWNhbCBSZWxhdGlvbiBHcm91cCAoRkxSRykqKg0KDQpgYGB7cn0NCkZMUkcgPSB0YWJsZShGTFJbLDI6M10pDQpGTFJHDQpgYGANCg0KKipNZW1idWF0IG1hdHJpa3MgdHJhbnNpc2kqKg0KDQpgYGB7cn0NCmJvYm90ID0gcm91bmQocHJvcC50YWJsZSh0YWJsZShGTFJbLDI6M10pLDEpLDUpDQpib2JvdA0KYGBgDQoNCioqUGVyYWxhbWFuIGF3YWwqKg0KDQpgYGB7cn0NCmRpYWdvbmFsID0gZGlhZyhib2JvdCkNCm0uZGlhZ29uYWwgPSBkaWFnKGRpYWdvbmFsKQ0KI21lbmdhbWJpbCBuaWxhaSBzZWxhaW4gZGlhZ29uYWwNCnBpbmdnaXIgPSBib2JvdC1tLmRpYWdvbmFsDQoNCnJhbWFsPU5VTEwNCmZvciAoaSBpbiAxOihsZW5ndGgoZnV6aWZpa2FzaSkpKXsNCiAgZm9yIChqIGluIDE6KG5yb3coYm9ib3QpKSl7DQogICAgaWYgKGZ1emlmaWthc2lbaV09PWopDQogICAge3JhbWFsW2krMV09KGRpYWdvbmFsW2pdKmRhdGFbaV0pK3N1bShwaW5nZ2lyW2osXSpuLnRlbmdhaFssMV0pIH1lbHNlDQogICAgICBpZiAoZnV6aWZpa2FzaVtpXT09aikNCiAgICAgIHtyYW1hbFtpXT0wfQ0KICB9DQp9DQpyYW1hbCA9IHJhbWFsWy1sZW5ndGgocmFtYWwpXQ0KcmFtYWwNCmBgYA0KDQoqKkFkanVzdGVkIGZvcmVjYXN0aW5nIHZhbHVlIChwZXJhbWFsYW4gdGFoYXAga2VkdWEpKioNCg0KYGBge3J9DQphZGp1c3RlZCA9IHJlcCgwLG5yb3coRkxSKSkgDQpzZWxpc2loID0gRkxSWywzXS1GTFJbLDJdIA0KZm9yKGkgaW4gMTpucm93KEZMUikpDQp7DQogIGlmIChGTFJbaSwyXSE9RkxSW2ksM10gJiYgZGlhZ29uYWxbRkxSW2ksMl1dPT0wKQ0KICB7YWRqdXN0ZWRbaV09c2VsaXNpaFtpXSooTC8yKX0gZWxzZSAgICNVbnR1ayB0aWRhayBrb211bmljYXRlDQogICAgaWYgKHNlbGlzaWhbaV09PTEgJiYgZGlhZ29uYWxbRkxSW2ksMl1dPjApDQogICAge2FkanVzdGVkW2ldPShMKX0gZWxzZSAjVW50dWsgIGtvbXVuaWNhdGUNCiAgICAgIGlmIChGTFJbaSwyXSE9RkxSW2ksM10gJiYgZGlhZ29uYWxbRkxSW2ksMl1dPjApDQogICAgICB7YWRqdXN0ZWRbaV09c2VsaXNpaFtpXSpMLzJ9ICNVbnR1ayBrb211bmljYXRlDQp9DQphZGp1c3RlZA0KYGBgDQoNCioqUGVyYWxhbWFuIHRhaGFwIHRlcmFraGlyKioNCg0KYGBge3J9DQpyYW1hbD1yYW1hbFtjKDI6bGVuZ3RoKHJhbWFsKSldDQphZGouZm9yZWNhc3Q9YWRqdXN0ZWQgKyByYW1hbA0KYWRqLmZvcmVjYXN0DQpgYGANCg0KKipUYWJlbCBwZW1iYW5kaW5nIGRlbmdhbiBoYXNpbCBwZW55ZXN1YWlhbiBrZWR1YSoqDQoNCmBgYHtyfQ0KZGF0YXBha2FpID0gZGF0YVtjKDI6bGVuZ3RoKGRhdGEpKV0NCmdhbGF0ID0gYWJzKGRhdGFwYWthaS1hZGouZm9yZWNhc3QpDQp0YWJlbCA9IGNiaW5kKGRhdGFwYWthaSxyYW1hbCxhZGp1c3RlZCxhZGouZm9yZWNhc3QsZ2FsYXQpDQp0YWJlbA0KYGBgDQoNCioqUGVueWVzdWFpYW4gb3ZlcmVzdGltYXRlIHJhbWFsYW4qKg0KDQpgYGB7cn0NCmFkai5mb3JlY2FzdDIgPSByZXAoMCxsZW5ndGgoZGF0YXBha2FpKSkgDQpmb3IoaSBpbiAxOmxlbmd0aChkYXRhcGFrYWkpKXsNCiAgaWYoKHJhbWFsW2ldLWRhdGFwYWthaVtpXSk8KGFkai5mb3JlY2FzdFtpXS1kYXRhcGFrYWlbaV0pKSB7DQogICAgYWRqLmZvcmVjYXN0MltpXT1yYW1hbFtpXSsoTC8yKQ0KICB9IGVsc2Ugew0KICAgIGFkai5mb3JlY2FzdDJbaV09YWRqLmZvcmVjYXN0W2ldfQ0KfQ0KYWRqLmZvcmVjYXN0Mg0KYGBgDQoNCioqVGFiZWwgcGVtYmFuZGluZyBkZW5nYW4gaGFzaWwgcGVueWVzdWFpYW4ga2VkdWEqKg0KDQpgYGB7cn0NCnRhYmVsMiA9IGNiaW5kKGRhdGFwYWthaSxyYW1hbCxhZGouZm9yZWNhc3QsYWRqLmZvcmVjYXN0MikNCnRhYmVsMg0KYGBgDQoNCmBgYHtyfQ0KdGFpbCh0YWJlbDIpDQpgYGANCg0KKipVamkgS2V0ZXBhdGFuKioNCg0KYGBge3J9DQpnYWxhdDIgPSBhYnMoZGF0YXBha2FpLWFkai5mb3JlY2FzdDIpDQpNU0UgPSBtZWFuKGdhbGF0Ml4yLCBuYS5ybSA9IFRSVUUpDQpNQUUgPSBtZWFuKGFicyhnYWxhdDIpLCBuYS5ybSA9IFRSVUUpDQpNQVBFID0gbWVhbihhYnMoZ2FsYXQyL2RhdGFwYWthaSoxMDApLCBuYS5ybT1UUlVFKQ0Ka2V0ZXBhdGFuID0gY2JpbmQoTVNFLE1BRSxNQVBFKQ0Ka2V0ZXBhdGFuDQpgYGANCg0KKipQbG90IGRhdGEgYXNsaSBkYW4gZGF0YSBwcmVkaWtzaSoqDQoNCmBgYHtyfQ0KcGxvdChjKDI6bGVuZ3RoKGRhdGEpKSxkYXRhW2MoMjpsZW5ndGgoZGF0YSkpXSx0eXBlPSJsIix4bGFiPSJQZXJpb2RlIix5bGFiPSJTdWh1IFJhdGEgUmF0YSAowrBDKSIpIA0KbGluZXMoYygyOmxlbmd0aChkYXRhKSkscmFtYWxbYygxOmxlbmd0aChyYW1hbCkpXSxsdHk9MikgDQpsZWdlbmQoMTAsMTIwMDAsYygiYWN0dWFsIiwiZm9yZWNhc3QubWFya292IiksYnR5PSJuIixsdHk9YygxLDIpKQ0KYGBgDQo=