5 COMMON D(), X(), Y(), G(), CQ(), R(), B() 6 COMMON DS(), LB(), DH(), NT(), V(), L(), Q4(), Q5(), Q6() 10 CLS 20 PRINT " STATISTICAL ECOLOGY: A PRIMER ON METHODS AND COMPUTING " 30 PRINT 40 PRINT " I N T E R A C T I V E B A S I C P R O G R A M " 50 PRINT 60 PRINT " N M D S . B A S " 70 PRINT 80 PRINT " ------------------------------------------------------------------ " 90 PRINT " This program computes a NONMETRIC MULTIDIMENSIONAL SCALING as a " 100 PRINT " method of NONLINEAR ORDINATION " 110 PRINT " ------------------------------------------------------------------ " 120 PRINT 130 PRINT " Program NMDS.BAS follows the algorithms of KRUSKAL and SHEPARD, " 140 PRINT " as modified from a program by ORLOCI & KENKEL, but with an OPTION" 150 PRINT " to normalize the CONFIGURATION to UNIT SIZE and ROTATE it to its " 160 PRINT " PRINCIPAL AXIS. The OUTPUT from this program may differ slightly " 170 PRINT " from other NMDS programs because of differences in ROTATION and " 180 PRINT " SCALE and the use of different algorithms to optimize the RANK " 190 PRINT " ORDER of SUs. " 200 PRINT " ------------------------------------------------------------------" 210 PRINT : PRINT "PRESS ANY KEY TO CONTINUE" 220 IF INKEY$ = "" THEN 220 230 CLS : PRINT 240 PRINT " Although this program allows the OPTION of starting with a RANDOM " 250 PRINT " INITIAL CONFIGURATION, we strongly recommend that the user start " 260 PRINT " with an INITIAL CONFIGURATION from an ORDINATION, such as POLAR, " 270 PRINT " PRINCIPAL COMPONENTS or CORRESPONDENCE ANALYSIS. Our experience " 280 PRINT " with SMALL DATASETS (N<30) suggests that starting with a random " 290 PRINT " configuration often leads to a LOCAL, not a GLOBAL SOLUTION." 300 PRINT 310 PRINT "- - - - - - - - - PART I. DATA ENTRY - - - - - - - - - - -": PRINT 320 PRINT "Program NMDS requires input of the NUMBER of SUs, the NUMBER of " 330 PRINT " AXES for the FINAL ORDINATION (dimensionality), a DISTANCE or " 340 PRINT " DISSIMILARITY MATRIX between SUs, and a STARTING or INITIAL " 350 PRINT " CONFIGURATION (by axis), or SEEDS for a RANDOM START. If your " 360 PRINT " RESEMBLANCE MATRIX is one of SIMILARITIES or CORRELATIONS, these " 370 PRINT " MUST be TRANSFORMED to their distance or dissimilarity complement" 380 PRINT " since NMDS.BAS is only designed to work with DISTANCES. " 390 PRINT : GOSUB 4500 400 PRINT "Hit any KEY to Continue" 410 IF INKEY$ = "" THEN 410 420 CLS : PRINT "- PART II. NONMETRIC MULTIDIMENSIONAL SCALING - -": PRINT 430 PRINT "NMDS computes a SOLUTION by ITERATIONS to MINIMISE the KRUSKAL " 440 PRINT " STRESS FUNCTION. Iterations STOP when the value for stress is " 450 PRINT " below a USER SPECIFIED level or when the DIFFERENCE between " 460 PRINT " successive stress values is BELOW a USER-SPECIFIED difference. ": PRINT 470 PRINT "The MINIMUM value for STRESS is often set at 0.01, but a " 480 PRINT " smaller value may be needed (Brambilla and Salzano 1980." 490 INPUT "ENTER a MINIMUM value for STRESS..."; E1: PRINT 500 PRINT "The DECREMENT between SUCCESSIVE stress values is often set at " 510 PRINT " a value of 0.0001, but a smaller value may be needed." 520 INPUT "ENTER a DECREMENT value..."; E2: PRINT 530 PRINT "(Of course, the smaller these values, the more iterations likely to" 540 PRINT " be computed, and, thus the longer the run but more precise the " 550 PRINT " final configuration.) " 560 PRINT " " 570 E3 = 20: E4 = E2 580 PRINT "Finally, set a MAXIMUM number of ITERATIONS to be allowed, so " 590 PRINT " that if MINIMUM and DECREMENT values for STRESS are NOT reached" 600 PRINT " the program will STOP. (If you're not sure, use 100)" 610 INPUT "Enter the MAXIMUM number of ITERATIONS to be ALLOWED "; E5 620 CLS 630 PRINT : PRINT "Sorting Distances" 640 KI = 0: VD = 1: L = NN 650 MD = D(INT(L + VD) / 2, 3): I = VD: J = L 660 IF D(I, 3) >= MD THEN 680 670 I = I + 1: GOTO 660 680 IF D(J, 3) <= MD THEN 700 690 J = J - 1: GOTO 680 700 IF I > J THEN 770 710 IF I = J THEN 750 720 PD = D(J, 1): D(J, 1) = D(I, 1): D(I, 1) = PD 730 PD = D(J, 2): D(J, 2) = D(I, 2): D(I, 2) = PD 740 PD = D(J, 3): D(J, 3) = D(I, 3): D(I, 3) = PD 750 I = I + 1: J = J - 1 760 IF I <= J THEN 660 770 IF I >= L THEN 790 780 V(KI) = I: L(KI) = L: KI = KI + 1 790 L = J 800 IF VD < L THEN 650 810 IF KI = 0 THEN 840 820 KI = KI - 1: VD = V(KI): L = L(KI): GOTO 650 830 REM SUBROUTINE TO FIND THE NUMBER OF TIES IN THE DISTANCES. 840 FOR I = 1 TO NN 850 NT(I) = 1 860 NEXT I 870 I = 1 880 J = I + 1 890 IF D(I, 3) = D(J, 3) THEN 930 900 I = I + 1 910 IF I = NN THEN 960 920 GOTO 880 930 NT(I) = NT(I) + 1: J = J + 1 940 IF J > NN THEN 960 950 GOTO 890 960 IF OPTN = 1 THEN GOTO 1080 970 PRINT "*** Be sure the following RANDOM CONFIGURATION is reasonable ***" 980 PRINT " Coordinates for SUs on AXES should vary from -1 TO +1" 990 RANDOMIZE 1000 FOR I = 1 TO ND 1010 PRINT "Axis "; I; " Random Coordinates for SUs 1, 2, 3, ... N." 1020 FOR J = 1 TO NI 1030 X(I, J) = RND 1040 SIG = RND: IF SIG >= .5 THEN X(I, J) = -1 * X(I, J) 1050 PRINT USING " ##.###"; X(I, J); 1060 NEXT J: PRINT 1070 NEXT I: PRINT 1080 PRINT "NOTE, This program runs SLOWLY, even with small datasets, so " 1090 PRINT " be patient while the program is computing Kruskal's STRESS." 1100 PRINT : PRINT "ITERATION STRESS ": PRINT "--------- ---------" 1110 IT = 1: IZ = 1 1120 GOSUB 1770 1130 GOSUB 1950 1140 GOSUB 2030 1150 U = 0: T = 0 1160 FOR I = 1 TO NN 1170 U = U + (DS(I) - DH(I)) ^ 2: T = T + (DS(I)) ^ 2 1180 NEXT I 1190 U = SQR(U): T = SQR(T): ST = U / T: GOSUB 2570 1200 GN = 0 1210 FOR I = 1 TO ND: FOR J = 1 TO NI 1220 GN = GN + G(I, J) ^ 2 1230 NEXT J, I 1240 GN = SQR(GN) 1250 IZ = IZ + 1: EI = 0 1260 PRINT USING "#####"; IT; : PRINT USING " ###.######"; ST 1270 IF GN <= E2 THEN 1440 1280 GOSUB 2690 1290 REM CHECK STOPPING RULES 1300 IF IW = 0 THEN 1430 1310 CC = ABS(ST - E6): ST = E6 1320 IF ST <= E1 THEN 1370 1330 IF CC <= E4 THEN 1390 1340 IT = IT + 1 1350 IF IT > E5 THEN 1410 1360 GOTO 1130 1370 PRINT : PRINT "Computed STRESS is less than the MINIMUM"; 1380 PRINT USING " ##.######"; E1: GOTO 1460 1390 PRINT : PRINT "The last 2 STRESS values differ by LESS than"; 1400 PRINT USING " ##.########"; E4: GOTO 1460 1410 PRINT : PRINT "Number of ITERATIONS has EXCEEDED the MAXIMUM"; 1420 PRINT USING "####"; E5: GOTO 1460 1430 PRINT : PRINT "The OPTIMAL solution has been reached": GOTO 1460 1440 PRINT : PRINT "LENGTH of the last GRADIENT is less than"; 1450 PRINT USING " ##.######"; E2 1460 PRINT : PRINT " STRESS = "; : PRINT USING "###.######"; ST 1470 PRINT "PRESS ANY KEY TO CONTINUE" 1480 IF INKEY$ = "" THEN 1480 1490 PRINT : PRINT "Unrotated Configuration": PRINT 1500 PRINT " Coordinates for SUs on NMDS AXES (up to 3) ": PRINT 1510 PRINT " SU I II III " 1520 PRINT " ---- --------- --------- ---------" 1530 IF ND > 3 THEN ND = 3 1540 FOR J = 1 TO NI 1550 PRINT USING "######"; J; 1560 FOR I = 1 TO ND 1570 PRINT USING " ####.####"; X(I, J); 1580 NEXT I: PRINT 1590 NEXT J: PRINT 1600 PRINT "PRESS ANY KEY TO CONTINUE" 1610 IF INKEY$ = "" THEN 1610 1620 GOSUB 3200 1630 PRINT : PRINT "Final ROTATED Configuration": PRINT 1640 PRINT " Coordinates for SUs on NMDS AXES (up to 3) ": PRINT 1650 PRINT " SU I II III " 1660 PRINT " ---- --------- --------- ---------" 1670 FOR J = 1 TO NI 1680 PRINT USING "######"; J; 1690 FOR I = 1 TO N1 1700 K = Q4(I) 1710 PRINT USING "#######.###"; CQ(K, J); 1720 NEXT I: PRINT 1730 NEXT J: PRINT 1740 PRINT : PRINT " * * * End of Program * * * ": PRINT 1750 END 1760 REM - - - - - SUBROUTINE NORMALIZE - - - - - 1770 T1 = 0: EI = EI + 1 1780 FOR I = 1 TO ND: T2 = 0 1790 FOR J = 1 TO NI 1800 T2 = T2 + X(I, J) 1810 NEXT J 1820 T2 = T2 / NI 1830 FOR J = 1 TO NI 1840 X(I, J) = X(I, J) - T2 1850 T1 = T1 + X(I, J) ^ 2 1860 NEXT J 1870 NEXT I 1880 T1 = SQR(1 / T1) 1890 FOR I = 1 TO ND 1900 FOR J = 1 TO NI 1910 X(I, J) = T1 * X(I, J) 1920 NEXT J 1930 NEXT I: RETURN 1940 REM - - - - - SUBROUTINE DISTANCE - - - - - 1950 FOR J = 1 TO NN 1960 I1 = D(J, 1): I2 = D(J, 2): SM = 0 1970 FOR I = 1 TO ND 1980 AD = X(I, I1) - X(I, I2): SM = SM + AD ^ 2 1990 NEXT I 2000 SM = SQR(SM): DS(J) = SM 2010 NEXT J: RETURN 2020 REM - - - - - SUBROUTINE FOR MONOTONE REGRESSION - - - - - 2030 MA = 1 2040 KC = NT(MA): MB = MA + KC - 1: LB(MA) = KC: LB(MB) = KC: T1 = 0 2050 FOR I = MA TO MB 2060 T1 = T1 + DS(I) 2070 NEXT I 2080 DH(MA) = T1 2090 IF (KC - 1) = 0 THEN 2110 2100 DH(MB) = MB - MA + 1 2110 MA = MA + KC 2120 IF (MA - NN - 1) < 0 THEN 2040 2130 MA = 1 2140 LU = 2: NZ = 0 2150 KC = LB(MA): MB = MA + KC - 1 2160 IF (KC - 1) > 0 THEN 2180 2170 WT = 1: GOTO 2190 2180 WT = DH(MB) 2190 DV = DH(MA) / WT 2200 IF LU = 2 THEN 2310 2210 IF (MA - 1) = 0 THEN 2300 2220 MY = MA - 1: KD = LB(MY): MZ = MY - KD + 1 2230 IF (KD - 1) > 0 THEN 2250 2240 WE = 1: GOTO 2260 2250 WE = DH(MY) 2260 DX = DH(MZ) / WE 2270 IF (DX - DV) < 0 THEN 2300 2280 KW = KC + KD: LB(MZ) = KW: LB(MB) = KW: DH(MZ) = DH(MZ) + DH(MA) 2290 DH(MB) = WT + WE: NZ = 0: MA = MZ: GOTO 2410 2300 NZ = NZ + 1: GOTO 2410 2310 IF (MB - NN) = 0 THEN 2400 2320 MU = MB + 1: KU = LB(MU): MW = MU + KU - 1 2330 IF (KU - 1) > 0 THEN 2350 2340 WF = 1: GOTO 2360 2350 WF = DH(MW) 2360 DU = DH(MU) / WF 2370 IF (DV - DU) < 0 THEN 2400 2380 KW = KC + KU: LB(MA) = KW: LB(MW) = KW: DH(MA) = DH(MA) + DH(MU) 2390 DH(MW) = WT + WF: NZ = 0: GOTO 2410 2400 NZ = NZ + 1 2410 LU = 3 - LU 2420 IF (NZ - 1) <= 0 THEN 2150 2430 IF (MB - NN) = 0 THEN 2450 2440 MA = MB + 1: GOTO 2140 2450 MA = 1 2460 KC = LB(MA): MB = MA + KC - 1 2470 IF (KC - 1) = 0 THEN 2520 2480 T1 = DH(MA) / DH(MB) 2490 FOR I = MA TO MB 2500 DH(I) = T1 2510 NEXT I: GOTO 2530 2520 DH(MA) = DS(MA) 2530 MA = MB + 1 2540 IF (MA - NN - 1) < 0 THEN 2460 2550 RETURN 2560 REM - - - - - SUBROUTINE TO FIND GRADIENT LENGTH - - - - - 2570 FOR I = 1 TO ND: FOR J = 1 TO NI 2580 G(I, J) = 0 2590 NEXT J, I 2600 T1 = T * T: RU = 1 / (U * T): U3 = U / (T1 * T) 2610 FOR L = 1 TO NN 2620 IF DS(L) = 0 THEN 2680 2630 FR = U3 * DS(L) - RU * (DS(L) - DH(L)): FR = -FR / DS(L) 2640 FOR K = 1 TO ND 2650 I = D(L, 1): J = D(L, 2): XD = X(K, I) - X(K, J): T1 = FR * XD 2660 G(K, I) = G(K, I) + T1: G(K, J) = G(K, J) - T1 2670 NEXT K 2680 NEXT L: RETURN 2690 REM - - - - - SUBROUTINE MINIMIZATION - - - - - 2700 R1 = 1: E8 = 2 * ST: IK = 1 2710 FOR I = 1 TO ND: FOR J = 1 TO NI 2720 Y(I, J) = X(I, J) 2730 NEXT J, I 2740 FOR I = 1 TO ND: FOR J = 1 TO NI 2750 X(I, J) = Y(I, J) - R1 * G(I, J) / GN 2760 NEXT J, I 2770 GOSUB 1770 2780 GOSUB 1950 2790 GOSUB 2030 2800 U = 0: T = 0 2810 FOR I = 1 TO NN 2820 U = U + (DS(I) - DH(I)) ^ 2: T = T + (DS(I)) ^ 2 2830 NEXT I 2840 U = SQR(U): T = SQR(T): E7 = U / T 2850 IF E8 <= ST THEN 2890 2860 IK = IK + 1 2870 IF IK > E3 THEN 3120 2880 R1 = R1 / 2: E8 = E7: GOTO 2740 2890 IF E7 <= E8 THEN 2910 2900 A = 2: TT = E8: E8 = E7: E7 = TT: R1 = R1 * A: GOTO 2920 2910 A = .5 2920 FOR I = 1 TO ND: FOR J = 1 TO NI 2930 X(I, J) = Y(I, J) - A * R1 * G(I, J) / GN 2940 NEXT J, I 2950 GOSUB 1770 2960 GOSUB 1950 2970 GOSUB 2030 2980 U = 0: T = 0 2990 FOR I = 1 TO NN 3000 U = U + (DS(I) - DH(I)) ^ 2: T = T + (DS(I)) ^ 2 3010 NEXT I 3020 U = SQR(U): T = SQR(T): E6 = U / T: PX = (E8 - E7) * (E7 - E6) 3030 IF PX <= 0 THEN 3070 3040 R1 = R1 * A: E8 = E7: E7 = E6: IK = IK + 1 3050 IF (IK - E3) < 0 THEN 2920 3060 GOTO 3120 3070 FOR I = 1 TO ND: FOR J = 1 TO NI 3080 X(I, J) = Y(I, J) - R1 * G(I, J) / GN 3090 NEXT J, I 3100 E6 = E7: IW = 1 3110 GOSUB 1770: RETURN 3120 FOR I = 1 TO ND: FOR J = 1 TO NI 3130 X(I, J) = Y(I, J) 3140 NEXT J, I 3150 IW = 0 3160 PRINT "Value of RHO too SMALL to continue with iteration! RHO = "; 3170 PRINT "###.######"; R1 3180 RETURN 3190 REM - - - - - CENTERING - - - - - 3200 FOR K = 1 TO ND 3210 S1 = 0: S2 = 0 3220 FOR I = 1 TO NI 3230 S1 = S1 + X(K, I) 3240 S2 = S2 + (X(K, I) * X(K, I)) 3250 NEXT I 3260 S3 = S1 / NI 3270 S4 = SQR(S2 - ((S1 * S1) / NI)) 3280 FOR I = 1 TO NI 3290 X(K, I) = (X(K, I) - S3) / S4 3300 NEXT I 3310 NEXT K 3320 PRINT : PRINT "R MATRIX (correlation between NMDS components)": PRINT 3330 Q7 = 0 3340 FOR I = 1 TO ND 3350 FOR J = I TO ND 3360 S0 = 0 3370 FOR K = 1 TO NI 3380 S0 = S0 + (X(I, K) * X(J, K)) 3390 NEXT K 3400 R(I, J) = S0: R(J, I) = S0 3410 NEXT J 3420 Q7 = Q7 + R(I, I) 3430 FOR J = 1 TO ND 3440 PRINT USING "###.###"; R(I, J); 3450 NEXT J: PRINT 3460 NEXT I 3470 PRINT : PRINT "* * * EXAMINE this correlation(s) between the UNROTATED"; 3480 PRINT " NMDS Axes * * * ": PRINT 3490 PRINT " IF the CORRELATION(s) between axes is small (near zero), this" 3500 PRINT " UNROTATED NMDS configuration is adequate for the final SU " 3510 PRINT " ordination. However, if the correlation is LARGE, this " 3520 PRINT " suggests that the configuration needs to be ROTATED to it's" 3530 PRINT " PRINCIPAL axes.": PRINT 3540 INPUT " Do you want to ROTATE the configuration (Y/N) ", ANS$ 3550 IF ANS$ = "N" OR ANS$ = "n" THEN GOTO 1740 3560 PRINT : PRINT "ROTATING configuration to it's PRINCIPAL AXES" 3570 REM - Calculate the PRINCIPAL COMPONENTS of R 3580 N1 = ND 3590 IF N1 > 3 THEN N1 = 3 3600 FOR I = 1 TO ND 3610 B(I, I) = 1 3620 NEXT I 3630 A = 1E-08: C = 0 3640 FOR I = 2 TO ND 3650 FOR J = 1 TO I - 1 3660 C = C + 2 * (R(I, J) ^ 2) 3670 NEXT J, I 3680 Y = SQR(C): O = (A / ND) * Y: T = Y: D = 0 3690 T = T / ND 3700 FOR Q = 2 TO ND: FOR P = 1 TO Q - 1 3710 IF ABS(R(P, Q)) < T THEN 3880 3720 D = 1: V = R(P, P): Z = R(P, Q): E = R(Q, Q): F = .5 * (V - E): IF F = 0 THEN 3740 3730 G = -(SGN(F)): GOTO 3750 3740 G = -1 3750 G = G * Z / SQR(Z ^ 2 + F ^ 2): H = G / SQR(2 * (1 + SQR(1 - G ^ 2))): K = SQR(1 - H ^ 2) 3760 FOR I = 1 TO ND 3770 IF I = P OR I = Q THEN 3810 3780 C = R(I, P): F = R(I, Q) 3790 R(Q, I) = C * H + F * K: R(I, Q) = R(Q, I) 3800 R(P, I) = C * K - F * H: R(I, P) = R(P, I) 3810 C = B(I, P): F = B(I, Q) 3820 B(I, Q) = C * H + F * K: B(I, P) = C * K - F * H 3830 NEXT I 3840 AA = 2 * Z * H * K 3850 R(P, P) = V * K * K + E * H * H - AA 3860 R(Q, Q) = V * H * H + E * K * K + AA 3870 R(P, Q) = (V - E) * H * K + Z * (K * K - H * H): R(Q, P) = R(P, Q) 3880 NEXT P, Q 3890 IF D <> 1 THEN 3910 3900 D = 0: GOTO 3700 3910 IF T > O THEN 3690 3920 FOR I = 1 TO ND 3930 Q4(I) = I: Q3 = Q3 + Q2 * R(I, I) 3940 NEXT I 3950 IF ND > 2 THEN 3980 3960 IF R(1, 1) > R(2, 2) THEN 4130 3970 Q = R(1, 1): R(1, 1) = R(2, 2): R(2, 2) = Q: Q = Q4(1): Q4(1) = Q4(2): Q4(2) = Q: GOTO 4130 3980 K = 0: Q = 1: L = ND 3990 M = INT((L + Q) / 2): M = R(M, M): I = Q: J = L 4000 IF R(I, I) <= M THEN 4020 4010 I = I + 1: GOTO 4000 4020 IF R(J, J) >= M THEN 4040 4030 J = J - 1: GOTO 4020 4040 IF I > J THEN 4080 4050 IF I = J THEN 4070 4060 P = R(J, J): R(J, J) = R(I, I): R(I, I) = P: P = Q4(J): Q4(J) = Q4(I): Q4(I) = P 4070 I = I + 1: J = J - 1: IF I <= J THEN 4000 4080 IF I >= L THEN 4100 4090 Q5(K) = I: Q6(K) = L: K = K + 1 4100 L = J: IF Q < L THEN 3990 4110 IF K = 0 THEN 4130 4120 K = K - 1: Q = Q5(K): L = Q6(K): GOTO 3990 4130 PRINT 4140 PRINT 4150 PRINT " Percent of Accumulated " 4160 PRINT " Eigenvalue Trace % of Trace " 4170 PRINT " ------------ ---------- ----------- " 4180 W = 0 4190 FOR J = 1 TO ND 4200 IF W > 1 THEN 4260 4210 PRINT USING "###"; J; 4220 PRINT " = "; : PRINT USING "###.###"; R(J, J); 4230 PRINT USING "########.#"; 100 * R(J, J) / Q7; : PRINT "% "; 4240 W = W + R(J, J) / Q7 4250 PRINT USING "########.#"; 100 * W; : PRINT "%" 4260 NEXT J: PRINT 4270 FOR J = 1 TO ND 4280 V = O 4290 K = Q4(J) 4300 FOR I = 1 TO ND 4310 V = V + B(I, K) ^ 2 4320 NEXT I 4350 PRINT "Eigenvector "; J; " = "; 4360 FACT = SQR(V) 4370 FOR I = 1 TO ND 4380 B(I, K) = B(I, K) / FACT 4390 PRINT USING "###.###"; B(I, K); 4400 NEXT I: PRINT 4410 NEXT J 4420 FOR I = 1 TO N1 4430 K = Q4(I) 4440 FOR J = 1 TO NI 4450 CQ(K, J) = 0 4460 FOR H = 1 TO ND 4470 CQ(K, J) = CQ(K, J) + B(H, K) * X(H, J) 4480 NEXT H, J, I 4490 RETURN 4500 REM - - - - - SUBROUTINE FOR DATA ENTRY - - - - - 4510 PRINT "Data INPUT options:" 4520 PRINT " Option 1 - Data already exists in a STORED data file" 4530 PRINT " Option 2 - Data is to be manually entered from keyboard" 4540 PRINT " (and subsequently STORED, if desired)": PRINT 4550 INPUT "Choose OPTION: Input 1 or 2 "; OPT 4560 IF OPT < 1 OR OPT > 2 THEN PRINT "value out-of-range, try again ": GOTO 4550 4570 PRINT 4580 INPUT "INPUT the NUMBER of SAMPLING UNITS (SUs) or INDIVIDUALS "; NI 4590 INPUT "INPUT the NUMBER of DIMENSIONS for the FINAL ORDINATION "; ND 4600 NN = NI * (NI - 1) / 2 4610 DIM D(NN, 3), X(ND, NI), Y(ND, NI), G(ND, NI), CQ(ND, NI), R(ND, ND), B(ND, ND) 4620 DIM DS(NN), LB(NN), DH(NN), NT(NN), V(NN), L(NN), Q4(ND), Q5(ND), Q6(ND) 4630 PRINT : PRINT "STARTING CONFIGURATION option:" 4640 PRINT " Option 1 - USER specified configuration." 4650 PRINT " Option 2 - RANDOM initial configuration.": PRINT 4660 INPUT "INPUT your CHOICE of these OPTIONS (1 or 2):"; OPTN 4670 IF OPTN < 1 OR OPTN > 2 THEN PRINT "value out-of-range, try again": GOTO 4660 4680 IF OPT = 1 THEN GOTO 5150 4690 PRINT 4700 PRINT "The DISTANCE or DISSIMILARITY matrix is created by entering the " 4710 PRINT " PAIRWISE distances between SUs, starting with the distances " 4720 PRINT " between SU 1 and SUs 2, 3, to N as ROW 1, then the distances " 4730 PRINT " between SU 2 and SUs 3, 4, to N as ROW 2, and so on for N ROWS" 4740 PRINT : K = 0 4750 FOR I = 1 TO NI: FOR J = I + 1 TO NI 4760 K = K + 1 4770 PRINT "Distance for SU "; I; " to SU "; J; 4780 INPUT " = "; D(K, 3) 4790 D(K, 1) = I: D(K, 2) = J 4800 NEXT J, I: PRINT 4810 IF OPTN = 2 THEN GOTO 4940 4820 PRINT "The STARTING CONFIGURATIONS data is entered in the form of a " 4830 PRINT " matrix with component coordinates in ROWS across the SUs in " 4840 PRINT " COLUMNS. For example:" 4850 PRINT " SUs" 4860 PRINT " 1 2 3 4 5 " 4870 PRINT " Components ----- ----- ----- ----- -----" 4880 PRINT " PC I -0.62 +0.55 +0.78 0.00 -0.72" 4890 PRINT " PC II -0.28 -0.11 +0.12 -0.50 +0.28": PRINT 4900 FOR I = 1 TO ND: FOR J = 1 TO NI 4910 PRINT "Coordinate for SU "; J; " on component "; I; 4920 INPUT " = "; X(I, J) 4930 NEXT J, I: PRINT 4940 INPUT "STORE The DISTANCE DATASET on DISK ? (Y/N) "; A$ 4950 IF A$ = "N" OR A$ = "n" THEN GOTO 5340 4960 INPUT "Specify a name for this DATASET (e.g., NMDSDIST.DAT) "; OUTDAT$ 4970 INPUT "Specify a DISK drive for this DATASET (A, B, C, etc.) "; DD$ 4980 OUTDAT$ = DD$ + ":" + OUTDAT$ 4990 OPEN OUTDAT$ FOR OUTPUT AS #1 5000 K = 0 5010 FOR I = 1 TO NI: FOR J = I + 1 TO NI 5020 K = K + 1: PRINT #1, D(K, 3); 5030 NEXT J, I: PRINT 5040 IF OPTN = 2 THEN GOTO 5340 5050 INPUT "STORE the Starting Configuration FILE on DISK ? (Y/N) "; A$ 5060 IF A$ = "N" OR A$ = "n" THEN GOTO 5340 5070 INPUT " Specify a name for this Starting Configuration FILE "; CONFIL$ 5080 INPUT " Specify a DISK drive for this DATASET (A, B, C, etc.) "; DD$ 5090 CONFIL$ = DD$ + ":" + CONFIL$ 5100 OPEN CONFIL$ FOR OUTPUT AS #2 5110 FOR I = 1 TO ND: FOR J = 1 TO NI 5120 PRINT #2, X(I, J) 5130 NEXT J, I: PRINT 5140 GOTO 5340 5150 PRINT : PRINT "INPUT the DISTANCE (DISSIMILARITY) DATA FILE" 5160 INPUT " Specify the NAME of this DATA File (e.g., NMDSDIST.DAT)"; DATAFIL$ 5170 INPUT " Specify the DISK DRIVE where this FILE is located (A, B, C) "; DD$ 5180 FILENAM$ = DD$ + ":" + DATAFIL$ 5190 OPEN "I", #1, FILENAM$ 5200 K = 0 5210 FOR I = 1 TO NI: FOR J = I + 1 TO NI 5220 K = K + 1: INPUT #1, D(K, 3) 5230 D(K, 1) = I: D(K, 2) = J 5240 NEXT J, I: PRINT 5250 IF OPTN = 2 THEN GOTO 5340 5260 PRINT "INPUT the Starting Configuration FILE " 5270 INPUT " Specify the name of the Starting Configuration FILE "; CONFIL$ 5280 INPUT " Specify the DISK DRIVE where this FILE is located (A, B, C) "; DD$ 5290 CONFIL$ = DD$ + ":" + CONFIL$ 5300 OPEN "I", #2, CONFIL$ 5310 FOR I = 1 TO ND: FOR J = 1 TO NI 5320 INPUT #2, X(I, J) 5330 NEXT J, I: PRINT 5340 CLS : INPUT "Would you like to list the DISTANCE DATA ? (Y/N) "; A$ 5350 IF A$ = "N" OR A$ = "n" THEN GOTO 5630 5360 PRINT "LISTING of the DISTANCE DATA matrix:": PRINT 5370 K = 0 5380 FOR I = 1 TO NI 5390 FOR J = I + 1 TO NI 5400 K = K + 1: PRINT USING "####.###"; D(K, 3); 5410 NEXT J: PRINT : FOR L = 1 TO I: PRINT " "; : NEXT L 5420 NEXT I: 5430 PRINT "*** BE SURE this DISTANCE MATRIX is CORRECT ***" 5440 PRINT " Check that the FORMAT of your INPUT FILE is:" 5450 PRINT " ROW 1 = DISTANCE between SU 1 and SUs 2, 3, ..., N " 5460 PRINT " ROW 2 = DISTANCE between SU 2 and SUs 3, 4, ..., N " 5470 PRINT " . " 5480 PRINT " and so on.": 5490 IF OPTN = 2 THEN GOTO 5630 5500 INPUT "Would you like to list the Starting Configuration FILE ? (Y/N) "; A$ 5510 IF A$ = "N" OR A$ = "n" THEN GOTO 5630 5520 PRINT " LIST of the Starting Configuration FILE ": PRINT 5530 FOR I = 1 TO ND: FOR J = 1 TO NI 5540 PRINT USING "####.###"; X(I, J); 5550 NEXT J: PRINT 5560 NEXT I 5570 PRINT "*** BE SURE this INITIAL CONFIGURATION is CORRECT? ***" 5580 PRINT " Check that the FORMAT of this FILE is:" 5590 PRINT " ROW 1 = Component 1 coordinates for SUs 1, 2, 3,..., N " 5600 PRINT " ROW 2 = Component 2 coordinates for SUs 1, 2, 3,..., N ": PRINT 5610 PRINT "PRESS ANY KEY TO CONTINUE" 5620 IF INKEY$ = "" THEN 5620 5630 CLOSE #1 5640 RETURN