DHOUT Version 22  Peter Lohmander 2010_08_11  1446


News:

This version (below) of the software should be OK for up to 25 time 
periods (years) and up to 8 different areas. It is OK in combination
with the original "Qbasic" software. 

Compare the complete example below!

It is also possible to obtain alternatives to the original "QBasic",
for instance "PowerBASIC". With such alternatives, much larger
problems should be possible to solve with practically the same code
(as the code in this document).

        Peter Lohmander
















-----------------------------------------------------------------------------

"DHIN  Peter Lohmander 2010_08_10  Version 22"
1      "Less"
8      "kmax"
25     "tmax"
.05    "rate"
50     "p"
40     "concos"
100    "z1"
150    "z2"
210    "z3"
160    "z4"
150    "z5"
140    "z6"
220    "z7"
230    "z8"
2000   "c1"
3500   "c2"
4900   "c3"
5500   "c4"
5700   "c5"
5900   "c6"
6200   "c7"
6700   "c8"
0      "cc11"
1800   "cc12"
3700   "cc13"
4100   "cc14"
4200   "cc15"
4300   "cc16"
4400   "cc17"
4800   "cc18"
1800   "cc21"
0      "cc22"
3700   "cc23"
4100   "cc24"
4200   "cc25"
4300   "cc26"
4400   "cc27"
4800   "cc28"
1900   "cc31"
1800   "cc32"
0      "cc33"
4100   "cc34"
4200   "cc35"
4300   "cc36"
4400   "cc37"
4800   "cc38"
2100   "cc41"
1800   "cc42"
3700   "cc43"
0      "cc44"
4200   "cc45"
4300   "cc46"
4400   "cc47"
4800   "cc48"
2200   "cc51"
1800   "cc52"
3700   "cc53"
4100   "cc54"
0      "cc55"
4300   "cc56"
4400   "cc57"
4800   "cc58"
2800   "cc61"
1800   "cc62"
3700   "cc63"
4100   "cc64"
4200   "cc65"
0      "cc66"
4400   "cc67"
4800   "cc68"
3200   "cc71"
1800   "cc72"
3700   "cc73"
4100   "cc74"
4200   "cc75"
4300   "cc76"
0      "cc77"
4800   "cc78"
3400   "cc81"
1800   "cc82"
3700   "cc83"
4100   "cc84"
4200   "cc85"
4300   "cc86"
4400   "cc87"
0      "cc88"




OPTIMAL RESULTS FROM DHINV
Software by 
Peter Lohmander 2010

OPTIMAL TIME AND STATE DEPENDENT DECISIONS AND EXPECTED PRESENT VALUES

 t =   1
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
   1    649538.  33      3    0     0 0 0 0 0 0 0 0

 t =   2
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
  33    662190.  34      8    3     0 0 1 0 0 0 0 0

 t =   3
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
  34    664361.  36      7    3     0 0 1 0 0 0 0 1

 t =   4
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
  36    656185. 100      2    0     0 0 1 0 0 0 1 1

 t =   5
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 100    636945. 116      4    2     0 1 1 0 0 0 1 1

 t =   6
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 116    611789. 124      5    2     0 1 1 1 0 0 1 1

 t =   7
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 124    581638. 128      6    2     0 1 1 1 1 0 1 1

 t =   8
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 128    547390. 256      1    2     0 1 1 1 1 1 1 1

 t =   9
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256    509048. 256                 1 1 1 1 1 1 1 1

 t =  10
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256    465689. 256                 1 1 1 1 1 1 1 1

 t =  11
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256    424445. 256                 1 1 1 1 1 1 1 1

 t =  12
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256    385212. 256                 1 1 1 1 1 1 1 1

 t =  13
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256    347893. 256                 1 1 1 1 1 1 1 1

 t =  14
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256    312394. 256                 1 1 1 1 1 1 1 1

 t =  15
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256    278626. 256                 1 1 1 1 1 1 1 1

 t =  16
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256    246505. 256                 1 1 1 1 1 1 1 1

 t =  17
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256    215951. 256                 1 1 1 1 1 1 1 1

 t =  18
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256    186887. 256                 1 1 1 1 1 1 1 1

 t =  19
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256    159240. 256                 1 1 1 1 1 1 1 1

 t =  20
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256    132942. 256                 1 1 1 1 1 1 1 1

 t =  21
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256    107926. 256                 1 1 1 1 1 1 1 1

 t =  22
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256     84130. 256                 1 1 1 1 1 1 1 1

 t =  23
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256     61495. 256                 1 1 1 1 1 1 1 1

 t =  24
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256     39964. 256                 1 1 1 1 1 1 1 1

 t =  25
 i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States
 --------------------------------------------------------
 256     19482. 256                 1 1 1 1 1 1 1 1



SOFTWARE
********

REM
REM DHInv22
REM Peter Lohmander
REM 2010_08_11_1437
CLS

OPEN "DHOut.txt" FOR OUTPUT AS #1
OPEN "DHIN.txt" FOR INPUT AS #2

DIM W(256, 26), M(8, 256), z(8), c(8, 256)
DIM cc(8, 8), MEX(10)
DIM jopt(256, 26), cvia(8, 256)

INPUT #2, Info$
INPUT #2, Less, a$
INPUT #2, kmax, a$
INPUT #2, tmax, a$
INPUT #2, rate, a$
INPUT #2, p, a$
INPUT #2, concos, a$

imax = 2 ^ kmax
jmax = imax

FOR k = 1 TO kmax
INPUT #2, z(k), a$
NEXT k

REM
REM ***** Connection Costs via the Primary Source *****
REM
FOR k = 1 TO kmax
INPUT #2, c(k, 1), a$
c(k, 1) = c(k, 1) + concos * z(k)
NEXT k


REM
REM ***** Costs of connecting one area via another area *****
REM
FOR k = 1 TO kmax
FOR M = 1 TO kmax
INPUT #2, cc(k, M), a$
NEXT M
NEXT k

FOR k1 = 1 TO kmax
  FOR k2 = 1 TO kmax
    IF k2 = k1 THEN GOTO 444
    cc(k1, k2) = cc(k1, k2) + concos * z(k1)
444 REM
  NEXT k2
NEXT k1


PRINT #1, ""
PRINT #1, "OPTIMAL RESULTS FROM DHINV"
PRINT #1, "Software by "
PRINT #1, "Peter Lohmander 2010"
REM PRINT #1, ""
REM PRINT #1, "tmax = ", tmax, " kmax = ", kmax, " imax = jmax = "; imax


REM
REM ***** Terminal conditions *****
REM
FOR i = 1 TO imax
 W(i, (tmax + 1)) = 0
NEXT i

REM
REM ***** Calculation of the membership function *****
REM
  mnum = 0
  FOR k = kmax TO 1 STEP -1
    value = 0
    mnum = mnum + 1
    mm = 2 ^ (mnum - 1)
    count = 0
     FOR i = 1 TO imax
       count = count + 1
       M(k, i) = value
       change = 0
       IF count = mm THEN change = 1
       IF change = 1 THEN count = 0
       chdown = 0
       IF value = 1 THEN chdown = 1
       chup = 0
       IF value = 0 THEN chup = 1
       IF (change = 1 AND chdown = 1) THEN value = 0
       IF (change = 1 AND chup = 1) THEN value = 1
  NEXT i
NEXT k


REM
REM ***** Calculation of State Dependent Partial *****
REM ***** Investment Cost Functions              *****
REM
FOR i = 2 TO imax
  FOR k = 1 TO kmax
    IF M(k, i) = 1 THEN c(k, i) = 0
    IF M(k, i) = 1 THEN GOTO 222
    c(k, i) = c(k, 1)
      FOR kconect = 1 TO kmax
        IF M(kconect, i) = 0 THEN GOTO 333
        IF kconect = k THEN GOTO 333
        clok = cc(k, kconect)
        IF clok < c(k, i) THEN cvia(k, i) = kconect
        IF clok < c(k, i) THEN c(k, i) = clok
333 REM
       NEXT kconect
222 REM
  NEXT k
NEXT i


REM
REM ***** Dynamic Programming via Backward Recursion *****
REM
FOR t = tmax TO 1 STEP -1
    d = EXP(-rate * t)
  FOR i = 1 TO imax
    optF = -999999
    optJ = 0
      FOR j = 1 TO jmax
        neginv = 0
        numinv = 0
          FOR k = 1 TO kmax
            IF (M(k, j) - M(k, i)) = 1 THEN numinv = numinv + 1
            IF (M(k, j) - M(k, i)) < 0 THEN neginv = neginv + 1
          NEXT k
        IF neginv > 0 THEN GOTO 100
        IF numinv > 1 THEN GOTO 100
          net = 0
          FOR k = 1 TO kmax
            net = net + p * M(k, i) * z(k)
          NEXT k
          FOR k = 1 TO kmax
            IF (M(k, j) - M(k, i)) = 1 THEN net = net - c(k, i)
          NEXT k
        F = d * net + W(j, (t + 1))
        IF F > optF THEN optJ = j
        IF F > optF THEN optF = F
100 REM
      NEXT j
    W(i, t) = optF
REM PRINT #1, "t = "; t; " i = "; i; " optF = "; optF; " optJ = "; optJ
jopt(i, t) = optJ
  NEXT i
NEXT t



PRINT #1, ""
PRINT #1, "OPTIMAL TIME AND STATE DEPENDENT DECISIONS AND EXPECTED PRESENT VALUES"
instate = 1
FOR t = 1 TO tmax
PRINT #1, ""
PRINT #1, " t = ";
PRINT #1, USING "###"; t

PRINT #1, " i(t)  E(PV)   i(t+1)  DEC  CVIA  Entering Partial States"
PRINT #1, " --------------------------------------------------------"
FOR i = 1 TO imax

IF (i < instate OR i > instate) AND (Less = 1) THEN GOTO 888


 FOR k = 1 TO kmax
 MEX(k) = M(k, i)
 NEXT k

PRINT #1, USING "####"; i;

PRINT #1, USING "##########."; W(i, t);


invnumb = 0
FOR k = 1 TO kmax
IF (M(k, jopt(i, t)) - M(k, i)) > 0 THEN invnumb = k
NEXT k
PRINT #1, USING "####"; jopt(i, t);
PRINT #1, "    ";

IF invnumb > 0 THEN PRINT #1, USING "###"; invnumb;
IF invnumb = 0 THEN PRINT #1, "   ";

IF invnumb > 0 THEN PRINT #1, USING "#####"; cvia(invnumb, i);
IF invnumb = 0 THEN PRINT #1, "     ";

PRINT #1, "    ";
FOR k = 1 TO kmax
PRINT #1, USING "##"; MEX(k);
NEXT k
PRINT #1, ""

888 REM

NEXT i
instate = jopt(instate, t)

NEXT t
  

CLOSE #1
CLOSE #2

END