Jsun Yui Wong
The following computer program tries to solve a location-allocation problem based on a problem in an article by Cheung, Langevin, and Delmaire [1]. Optimization is the goal. In the present paper it is a problem of searching for locations for five oil platforms and allocating 200 oil wells to these five platforms or to less-than-five platforms. Direct distances are used in line 1371 of the following nonlinear discrete/continuous programming code. Platform costs are shown in line 1591 through line 1595; platform-5's cost as shown in line 1595 is different from the cost of each of the other four platforms.
The locations of the 200 wells given in line 23 through line 34 are from Table 2 of Cheung, Langevin, and Delmaire [1].
0 DEFSNG A-Z
3 DEFINT I,J,K,H
4 DIM X(1111),A(1111),L(1111),K(1111),PNEM(1111),ILO(1111),J(1111)
18 FOR IL=1 TO 400
19 READ L(IL)
20 NEXT IL
23 DATA 5,0,43,24,24,36,2,8,32,91,3,86,72,70,75,95,64,63,21,58,30,35,68,76,40,0,8,45,8,61
24 DATA 7,6,74,99,4,59,41,11,55,64,28,69,23,25,75,2,86,42,86,36,59,90,50,66,44,87,6,5,2,97
25 DATA 94,53,44,92,91,91,36,31,56,52,19,29,3,66,59,100,40,41,83,10,89,41,39,14,24,53,25,27,42,21,94,92,5,89,51,60,59,5,89,38
27 DATA 26,72,67,90,100,65,95,36,45,33,32,3,35,22,13,60,24,9,33,40,42,96,23,41,95,36,59,56,40,72
28 DATA 54,64,55,26,47,4,22,25,1,62,23,87,21,11,46,14,61,32,39,18
29 DATA 56,72,98,98,85,11,49,27,69,0,44,31,20,86,1,40,41,90,89,2,71,51,40,69,5,55,53,86,46,72,3,59,94,93,90,39,92,46,75,89,28,74,0,42,10,0,99,35,79,72
30 DATA 18,66,81,22,39,93,75,26,49,12,1,70,73,45,6,14,39,11,13,49,73,14,56,27,56,22,50,32,34,1,64,94,16,71,66,28,11,75,2,79,92,4,43,83,64,39,86,79,77,95,32,86,63,14,65,61
31 DATA 47,75,16,76,32,63,62,92,89,31,18,76,36,91,9,10,11,42,11,4,46,83,17,44,79,6,64,48,1,90,39,30,1,54,17,3,99,84,1,11,56,37,95,50
32 DATA 41,91,6,2,69,87,53,39,6,97,82,44,11,10,98,41,43,4,3,19,18,24,45,18,76,75,31,12,1,79,54,71,27,31,58,42,15,94,14,28
33 DATA 43,98,38,46,47,57,1,25,4,69,46,41,69,45,71,71,48,29,98,1,5,15,92,45,27,31,24,4,4,93,89,80,60,90,49,76,86,3,54,86
34 DATA 68,26,34,1,81,57,6,11,63,12,75,55,26,53,19,55,26,81,22,29
75 FOR JJJJ=-32000 TO 32000
76 RANDOMIZE JJJJ
77 M=-1.7E+38
88 FOR IAA=1 TO 10
89 A(IAA)=RND*100
90 NEXT IAA
111 FOR IBB= 11 TO 1010 STEP 1
112 A(IBB)=1
113 NEXT IBB
121 FOR IBB= 15 TO 1010 STEP 5
122 A(IBB)=0
123 NEXT IBB
126 REM IMAR=10+FIX(RND*32700)
128 FOR I=1 TO 3270
129 FOR K=1 TO 1010
131 X(K)=A(K)
132 NEXT K
141 IF RND<.5 THEN 181 ELSE 244
181 J=1+FIX(RND*10)
183 R=RND*(1-RND*2)*A(J)
191 IF RND<.14 THEN X(J)=A(J)+RND^5*R ELSE IF RND<.17 THEN X(J)=A(J)+R ELSE IF RND<.2 THEN X(J)=A(J)+RND*R ELSE IF RND<.25 THEN X(J)=A(J)+RND^2*R ELSE IF RND<.33 THEN X(J)=A(J)+RND^3*R ELSE IF RND<.5 THEN X(J)=A(J)+RND^4*R ELSE X(J)=A(J)+RND^6*R
192 GOTO 1333
244 IF RND<1/200 THEN JJ=11 ELSE IF RND<1/199 THEN JJ=16 ELSE IF RND<1/198 THEN JJ=21 ELSE IF RND<1/197 THEN JJ=26 ELSE IF RND<1/196 THEN JJ=31 ELSE IF RND<1/195 THEN JJ=36 ELSE IF RND<1/194 THEN JJ=41 ELSE 246
245 GOTO 705
246 IF RND<1/193 THEN JJ=46 ELSE IF RND<1/192 THEN JJ=51 ELSE IF RND<1/191 THEN JJ=56 ELSE IF RND<1/190 THEN JJ=61 ELSE IF RND<1/189 THEN JJ=66 ELSE IF RND<1/188 THEN JJ=71 ELSE IF RND<1/187 THEN JJ=76 ELSE 248
247 GOTO 705
248 IF RND<1/186 THEN JJ=81 ELSE IF RND<1/185 THEN JJ=86 ELSE IF RND<1/184 THEN JJ=91 ELSE IF RND<1/183 THEN JJ=96 ELSE IF RND<1/182 THEN JJ=101 ELSE IF RND<1/181 THEN JJ=106 ELSE IF RND<1/180 THEN JJ=111 ELSE 250
249 GOTO 705
250 IF RND<1/179 THEN JJ=116 ELSE IF RND<1/178 THEN JJ=121 ELSE IF RND<1/177 THEN JJ=126 ELSE IF RND<1/176 THEN JJ=131 ELSE IF RND<1/175 THEN JJ=136 ELSE IF RND<1/174 THEN JJ=141 ELSE IF RND<1/173 THEN JJ=146 ELSE 252
251 GOTO 705
252 IF RND<1/172 THEN JJ=151 ELSE IF RND<1/171 THEN JJ=156 ELSE IF RND<1/170 THEN JJ=161 ELSE IF RND<1/169 THEN JJ=166 ELSE IF RND<1/168 THEN JJ=171 ELSE IF RND<1/167 THEN JJ=176 ELSE IF RND<1/166 THEN JJ=181 ELSE 254
253 GOTO 705
254 IF RND<1/165 THEN JJ=186 ELSE IF RND<1/164 THEN JJ=191 ELSE IF RND<1/163 THEN JJ=196 ELSE IF RND<1/162 THEN JJ=201 ELSE IF RND<1/161 THEN JJ=206 ELSE IF RND<1/160 THEN JJ=211 ELSE IF RND<1/159 THEN JJ=216 ELSE 256
255 GOTO 705
256 IF RND<1/158 THEN JJ=221 ELSE IF RND<1/157 THEN JJ=226 ELSE IF RND<1/156 THEN JJ=231 ELSE IF RND<1/155 THEN JJ=236 ELSE IF RND<1/154 THEN JJ=241 ELSE IF RND<1/153 THEN JJ=246 ELSE IF RND<1/152 THEN JJ=251 ELSE 258
257 GOTO 705
258 IF RND<1/151 THEN JJ=256 ELSE IF RND<1/150 THEN JJ=261 ELSE IF RND<1/149 THEN JJ=266 ELSE IF RND<1/148 THEN JJ=271 ELSE IF RND<1/147 THEN JJ=276 ELSE IF RND<1/146 THEN JJ=281 ELSE IF RND<1/145 THEN JJ=286 ELSE 260
259 GOTO 705
260 IF RND<1/144 THEN JJ=291 ELSE IF RND<1/143 THEN JJ=296 ELSE IF RND<1/142 THEN JJ=301 ELSE IF RND<1/141 THEN JJ=306 ELSE IF RND<1/140 THEN JJ=311 ELSE IF RND<1/139 THEN JJ=316 ELSE IF RND<1/138 THEN JJ=321 ELSE 262
261 GOTO 705
262 IF RND<1/137 THEN JJ=326 ELSE IF RND<1/136 THEN JJ=331 ELSE IF RND<1/135 THEN JJ=336 ELSE IF RND<1/134 THEN JJ=341 ELSE IF RND<1/133 THEN JJ=346 ELSE IF RND<1/132 THEN JJ=351 ELSE IF RND<1/131 THEN JJ=356 ELSE 264
263 GOTO 705
264 IF RND<1/130 THEN JJ=361 ELSE IF RND<1/129 THEN JJ=366 ELSE IF RND<1/128 THEN JJ=371 ELSE IF RND<1/127 THEN JJ=376 ELSE IF RND<1/126 THEN JJ=381 ELSE IF RND<1/125 THEN JJ=386 ELSE IF RND<1/124 THEN JJ=391 ELSE 266
265 GOTO 705
266 IF RND<1/123 THEN JJ=396 ELSE IF RND<1/122 THEN JJ=401 ELSE IF RND<1/121 THEN JJ=406 ELSE IF RND<1/120 THEN JJ=411 ELSE IF RND<1/119 THEN JJ=416 ELSE IF RND<1/118 THEN JJ=421 ELSE IF RND<1/117 THEN JJ=426 ELSE 268
267 GOTO 705
268 IF RND<1/116 THEN JJ=431 ELSE IF RND<1/115 THEN JJ=436 ELSE IF RND<1/114 THEN JJ=441 ELSE IF RND<1/113 THEN JJ=446 ELSE IF RND<1/112 THEN JJ=451 ELSE IF RND<1/111 THEN JJ=456 ELSE IF RND<1/110 THEN JJ=461 ELSE 270
269 GOTO 705
270 IF RND<1/109 THEN JJ=466 ELSE IF RND<1/108 THEN JJ=471 ELSE IF RND<1/107 THEN JJ=476 ELSE IF RND<1/106 THEN JJ=481 ELSE IF RND<1/105 THEN JJ=486 ELSE IF RND<1/104 THEN JJ=491 ELSE IF RND<1/103 THEN JJ=496 ELSE 272
271 GOTO 705
272 REM
274 IF RND<1/102 THEN JJ=501 ELSE IF RND<1/101 THEN JJ=506 ELSE 292
275 GOTO 705
292 IF RND<1/100 THEN JJ=511 ELSE IF RND<1/99 THEN JJ=516 ELSE IF RND<1/98 THEN JJ=521 ELSE IF RND<1/97 THEN JJ=526 ELSE IF RND<1/96 THEN JJ=531 ELSE IF RND<1/95 THEN JJ=536 ELSE IF RND<1/94 THEN JJ=541 ELSE 296
294 REM original IF RND<1/100 THEN JJ=11 ELSE IF RND<1/99 THEN JJ=16 ELSE IF RND<1/98 THEN JJ=21 ELSE IF RND<1/97 THEN JJ=26 ELSE IF RND<1/96 THEN JJ=31 ELSE IF RND<1/95 THEN JJ=36 ELSE IF RND<1/94 THEN JJ=41 ELSE 296
295 GOTO 705
296 IF RND<1/93 THEN JJ=546 ELSE IF RND<1/92 THEN JJ=551 ELSE IF RND<1/91 THEN JJ=556 ELSE IF RND<1/90 THEN JJ=561 ELSE IF RND<1/89 THEN JJ=566 ELSE IF RND<1/88 THEN JJ=571 ELSE IF RND<1/87 THEN JJ=576 ELSE 298
297 GOTO 705
298 IF RND<1/86 THEN JJ=581 ELSE IF RND<1/85 THEN JJ=586 ELSE IF RND<1/84 THEN JJ=591 ELSE IF RND<1/83 THEN JJ=596 ELSE IF RND<1/82 THEN JJ=601 ELSE IF RND<1/81 THEN JJ=606 ELSE IF RND<1/80 THEN JJ=611 ELSE 300
299 GOTO 705
300 IF RND<1/79 THEN JJ=616 ELSE IF RND<1/78 THEN JJ=621 ELSE IF RND<1/77 THEN JJ=626 ELSE IF RND<1/76 THEN JJ=631 ELSE IF RND<1/75 THEN JJ=636 ELSE IF RND<1/74 THEN JJ=641 ELSE IF RND<1/73 THEN JJ=646 ELSE 302
301 GOTO 705
302 IF RND<1/72 THEN JJ=651 ELSE IF RND<1/71 THEN JJ=656 ELSE IF RND<1/70 THEN JJ=661 ELSE IF RND<1/69 THEN JJ=666 ELSE IF RND<1/68 THEN JJ=671 ELSE IF RND<1/67 THEN JJ=676 ELSE IF RND<1/66 THEN JJ=681 ELSE 304
303 GOTO 705
304 IF RND<1/65 THEN JJ=686 ELSE IF RND<1/64 THEN JJ=691 ELSE IF RND<1/63 THEN JJ=696 ELSE IF RND<1/62 THEN JJ=701 ELSE IF RND<1/61 THEN JJ=706 ELSE IF RND<1/60 THEN JJ=711 ELSE IF RND<1/59 THEN JJ=716 ELSE 306
305 GOTO 705
306 IF RND<1/58 THEN JJ=721 ELSE IF RND<1/57 THEN JJ=726 ELSE IF RND<1/56 THEN JJ=731 ELSE IF RND<1/55 THEN JJ=736 ELSE IF RND<1/54 THEN JJ=741 ELSE IF RND<1/53 THEN JJ=746 ELSE IF RND<1/52 THEN JJ=751 ELSE 308
307 GOTO 705
308 IF RND<1/51 THEN JJ=756 ELSE IF RND<1/50 THEN JJ=761 ELSE IF RND<1/49 THEN JJ=766 ELSE IF RND<1/48 THEN JJ=771 ELSE IF RND<1/47 THEN JJ=776 ELSE IF RND<1/46 THEN JJ=781 ELSE IF RND<1/45 THEN JJ=786 ELSE 310
309 GOTO 705
310 IF RND<1/44 THEN JJ=791 ELSE IF RND<1/43 THEN JJ=796 ELSE IF RND<1/42 THEN JJ=801 ELSE IF RND<1/41 THEN JJ=806 ELSE IF RND<1/40 THEN JJ=811 ELSE IF RND<1/39 THEN JJ=816 ELSE IF RND<1/38 THEN JJ=821 ELSE 312
311 GOTO 705
312 IF RND<1/37 THEN JJ=826 ELSE IF RND<1/36 THEN JJ=831 ELSE IF RND<1/35 THEN JJ=836 ELSE IF RND<1/34 THEN JJ=841 ELSE IF RND<1/33 THEN JJ=846 ELSE IF RND<1/32 THEN JJ=851 ELSE IF RND<1/31 THEN JJ=856 ELSE 314
313 GOTO 705
314 IF RND<1/30 THEN JJ=861 ELSE IF RND<1/29 THEN JJ=866 ELSE IF RND<1/28 THEN JJ=871 ELSE IF RND<1/27 THEN JJ=876 ELSE IF RND<1/26 THEN JJ=881 ELSE IF RND<1/25 THEN JJ=886 ELSE IF RND<1/24 THEN JJ=891 ELSE 316
315 GOTO 705
316 IF RND<1/23 THEN JJ=896 ELSE IF RND<1/22 THEN JJ=901 ELSE IF RND<1/21 THEN JJ=906 ELSE IF RND<1/20 THEN JJ=911 ELSE IF RND<1/19 THEN JJ=916 ELSE IF RND<1/18 THEN JJ=921 ELSE IF RND<1/17 THEN JJ=926 ELSE 318
317 GOTO 705
318 IF RND<1/16 THEN JJ=931 ELSE IF RND<1/15 THEN JJ=936 ELSE IF RND<1/14 THEN JJ=941 ELSE IF RND<1/13 THEN JJ=946 ELSE IF RND<1/12 THEN JJ=951 ELSE IF RND<1/11 THEN JJ=956 ELSE IF RND<1/10 THEN JJ=961 ELSE 320
319 GOTO 705
320 IF RND<1/9 THEN JJ=966 ELSE IF RND<1/8 THEN JJ=971 ELSE IF RND<1/7 THEN JJ=976 ELSE IF RND<1/6 THEN JJ=981 ELSE IF RND<1/5 THEN JJ=986 ELSE IF RND<1/4 THEN JJ=991 ELSE IF RND<1/3 THEN JJ=996 ELSE 322
321 GOTO 705
322 REM
323 REM
324 IF RND<1/2 THEN JJ=1001 ELSE JJ=1006
705 IF RND<.2 THEN X(JJ)=0:X(JJ+1)=0:X(JJ+2)=0:X(JJ+3)=0:X(JJ+4)=1 ELSE IF RND<.4 THEN X(JJ)=0:X(JJ+1)=0:X(JJ+2)=0:X(JJ+3)=1:X(JJ+4)=0 ELSE IF RND<.6 THEN X(JJ)=0:X(JJ+1)=0:X(JJ+2)=1:X(JJ+3)=0:X(JJ+4)=0 ELSE 711
708 GOTO 1333
711 IF RND<.5 THEN X(JJ)=0:X(JJ+1)=1:X(JJ+2)=0:X(JJ+3)=0:X(JJ+4)=0 ELSE X(JJ)=1:X(JJ+1)=0:X(JJ+2)=0:X(JJ+3)=0:X(JJ+4)=0
1333 GOTO 1367
1367 FOR H=1 TO 200
1371 PNEM(H)=-((L(H*2-1)-X(1))^2+(L(H*2)-X(6))^2)^.5*X(5*H+6)-((L(H*2-1)-X(2))^2+(L(H*2)-X(7))^2)^.5*X(5*H+7)-((L(H*2-1)-X(3))^2+(L(H*2)-X(8))^2)^.5*X(5*H+8)-((L(H*2-1)-X(4))^2+(L(H*2)-X(9))^2)^.5*X(5*H+9)-((L(H*2-1)-X(5))^2+(L(H*2)-X(10))^2)^.5*X(5*H+10)
1379 NEXT H
1389 PSUM=0
1391 FOR HH=1 TO 200
1393 PSUM=PSUM+PNEM(HH)
1396 NEXT HH
1511 S1=0
1513 FOR H1=1 TO 996 STEP 5
1515 S1=S1+X(10+H1)
1518 NEXT H1
1521 S2=0
1523 FOR H2=2 TO 997 STEP 5
1525 S2=S2+X(10+H2)
1528 NEXT H2
1531 S3=0
1533 FOR H3=3 TO 998 STEP 5
1535 S3=S3+X(10+H3)
1538 NEXT H3
1541 S4=0
1543 FOR H4=4 TO 999 STEP 5
1545 S4=S4+X(10+H4)
1548 NEXT H4
1551 S5=0
1553 FOR H5=5 TO 1000 STEP 5
1555 S5=S5+X(10+H5)
1558 NEXT H5
1591 IF S1>.1 THEN PLCOST1=50+25*S1^.5 ELSE PLCOST1=0
1592 IF S2>.1 THEN PLCOST2=50+25*S2^.5 ELSE PLCOST2=0
1593 IF S3>.1 THEN PLCOST3=50+25*S3^.5 ELSE PLCOST3=0
1594 IF S4>.1 THEN PLCOST4=50+25*S4^.5 ELSE PLCOST4=0
1595 IF S5>.1 THEN PLCOST5=5598+2*S5^.5 ELSE PLCOST5=0
1599 PLCOSTT=PLCOST1+PLCOST2+PLCOST3+PLCOST4+PLCOST5
1601 P=PSUM-PLCOSTT
1651 IF P<=M THEN 1670
1657 FOR KEW=1 TO 1010
1658 A(KEW)=X(KEW)
1659 NEXT KEW
1661 M=P
1663 SS1=S1:SS2=S2:SS3=S3:SS4=S4:SS5=S5
1666 GOTO 128
1670 NEXT I
1890 IF M>-5000 THEN 1931 ELSE 2999
1931 FOR IPR=11 TO 1006 STEP 5
1933 PRINT A(IPR),A(IPR+1),A(IPR+2),A(IPR+3),A(IPR+4)
1938 NEXT IPR
1952 PRINT A(1),A(2),A(3),A(4),A(5),A(6),A(7),A(8),A(9),A(10),M,JJJJ
1955 PRINT SS1,SS2,SS3,SS4,SS5
2999 NEXT JJJJ
The BASIC computer program above was run with Microsoft's GW BASIC 3.11 interpreter, which is not a compiler. The computer screen with the best objective function value produced in one hour of running is presented below; only a very few of the 200 allocations of wells to platforms are shown below. What immediately follows is a hand copy of the computer screen.
00010
10000
10000
00100
01000
01000
01000
00010
01000
00010
10000
00010
10000
00010
00010
00100
00100
00100
10000
27.78726 57.63528 11.91309 79.10868 44.36499
19.53275 82.1704 67.72325 32.41572 39.03644
-4792.709 -31998
59 52 41 48 0
Interpreted in accordance with line 1931 through line 1955, the screen (picture) above came in one hour of running on a personal computer with an Intel Pentium 4 CPU 3.00GHz. chip and the IBM basica/D interpreter.
Incidentally, with this one-hour run only one other candidate solution occurred; it has an objective function value of 4996.424 at JJJJ=-31999.
With the present algorithm, a usable solution may come early, late, or worse. To alleviate this shortcoming, one can simultaneously run independent computers with different line 128s. Here is one example: 128 FOR I=1 TO 1000, 128 FOR I=1 TO 2000, 128 FOR I=1 TO 3000, 128 FOR I=1 TO 4000, and 128 FOR I=1 TO 5000.
References
[1] B. K.-S. Cheung, A. Langevin and H. Delmaire, Coupling Genetic Algorithm with a Grid Search Method To Solve Mixed Integer Nonlinear Programming Problems, Computers Math. Applic. Vol. 34, No. 12, pp.13-23, 1997.
[2] Microsoft Corp. BASIC, second edition (May 1982), Version 1.10. Boca Raton, Florida: IBM Corp., Personal Computer, P. O. Box 1328-C, Boca Raton, Florida 33432, 1981.