solving sudoku using monte carlo marching

Upload: jacob-h-jack-lashover

Post on 07-Jan-2016

70 views

Category:

Documents


0 download

DESCRIPTION

Abstract: As noted in an earlier paper titled Monte Carlo Marching, the author had previously solved Sudoku puzzles using Monte Carlo Marching (MCM). (Lashover, 2012) In this paper, details of that MCM solution are reported. The MCM algorithm is shown to provide exact, integer solutions to 6 X 6 Sudoku puzzles. A math model is constructed: a convex objective function is developed from linear constraints, non-linear constraints, and non-smooth constraints. The linearized objective function is then minimized to zero using MCM which determines the values of the unknown variables (as many as 19). This MCM method is unique in that no other analytical solution has been found in the literature.Key Words: Algorithm, analytical solution, constraints, mathematical method, optimization, mathematical modeling, Sudoku, QB64 computer language, convergence, non-linear equations, convex objective function, chemical engineering, and horse racing wagers.

TRANSCRIPT

  • 1

    Mathematical Solution to Sudoku Using Monte Carlo

    Marching

    Jacob H Lashover

    September 17, 2015

    Baton Rouge, Louisiana

    Abstract: As noted in an earlier paper titled Monte Carlo Marching, the author

    had previously solved Sudoku puzzles using Monte Carlo Marching (MCM).

    (Lashover, 2012) In this paper, details of that MCM solution are reported. The

    MCM algorithm is shown to provide exact, integer solutions to 6 X 6 Sudoku

    puzzles. A math model is constructed: a convex objective function is developed

    from linear constraints, non-linear constraints, and non-smooth constraints. The

    linearized objective function is then minimized to zero using MCM which

    determines the values of the unknown variables (as many as 19). This MCM

    method is unique in that no other analytical solution has been found in the

    literature.

    The MCM analytical method has now been shown to solve chemical

    engineering problems such as calculation of dew points and calculation of fractions

    of vapor flashed in chemical streams. These calculations required solution of non-

    linear, simultaneous equations. Rufus Isaacs' non-linear model for optimizing

    horse racing wagers was also solved in "A Chemical Engineer Goes to the Horse

    Races". (Lashover J. H., 2014) These algorithms demonstrate that whether the

    equations are linear, non-linear, or non-smooth, MCM, which does not require

    derivatives, is a very powerful solution method.

    Key Words: Algorithm, analytical solution, constraints, mathematical method,

    optimization, mathematical modeling, Sudoku, QB64 computer language,

    convergence, non-linear equations, convex objective function, chemical

    engineering, and horse racing wagers.

  • 2

    Table of Contents

    Page No. Content

    1 Abstract and Key Words

    2 - 4 Table of Contents

    5 Introduction

    6 Discussion

    A. Development of Math Model

    7 Figure 1. Puzzle No. 1

    (Used as demonstration of method.)

    Summation equations for rows

    Summation equations for columns

    8 Summation equations for grids

    Product equations for rows

    Product equations for columns

    9 Product equations for grids

    Constraint #3-Equations

    Constraint #4-Equation

    10 B. Development of Constraint Equations

    >Convert row values to strings and concatenate

    >Define contents of rows

    11 >Count duplicates in rows and convert to convex form

    12 Figure 2. Computer output for all rows with details of

    Row #1

    C. Solution of Model

    13 D. Computer Code for Iterative Procedure

  • 3

    14 >Convex objective function for minimization to zero

    16 End of main body of report

    17 Appendix A. Development of Constraint Equations

    (Complete Section B.)

    >Convert grid values to strings and concatenate

    >Define grid contents

    18 >Count duplicates in grids

    >Put into convex form

    19 >Convert column values to strings and concatenate

    >Define column contents

    20 >Count duplicates in columns and put in convex form

    >Constraint equations for sums and products of units

    >Equations for rows 1 to 6

    21 >Constraint equations for columns and grids

    >Equations for columns 1 to 6

    >Equations for grids 1 to 6

    22 >Count total digits of each kind in rows, columns

    and grids. Convert to convex form.

    23 End of Appendix A.

    24 Appendix B. Puzzles No. 2 and No. 3

    >Figure 3. Puzzle No. 2

    >Figure 4. Puzzle No. 3

    25 Appendix C. Puzzle No. 1 Computer Solution

    25 32 >Complete Puzzle No. 1 Solution

    33 Figure 5. Puzzle No. 1 Objective function values, S,

  • 4

    33 continued vs. Number of Iterations, J and I

    34 Figure 6. Puzzle No. 2 Objective function values, S,

    Vs. Number of Iterations, J and I

    35 Figure 7. Puzzle No. 3 Objective function values, S,

    Vs. Number of Iterations, J and I

    36 63 Appendix D. QB64 Computer Code

    64 Bibliography

  • 5

    Introduction:

    Sudoku is played on a square matrix, in this case, 6 x 6 or 36 total squares. The

    same single integer cannot appear twice in the same row, column or in any of the

    six 2 x 3 sub-matrices (called grids in this work). Clues which consist of at least 8

    permanent numbers located throughout the total matrix are provided. For a puzzle

    to be a true Sudoku puzzle, it can only have one solution. The puzzles are

    traditionally solved using logic, and the difficulty of a puzzle is determined by the

    depth of logic required.

    Sudokus origins lie in a Chinese game called Magic Squares which was first

    documented 2000 years ago. All of the rows, columns, and diagonals had to add

    to the same number. Numbers could only be used once. In 1514, Albrecht Durer,

    a German artist, produced a 4 X 4 game called Melancholia where the sum of all

    rows, columns, and diagonals had to total 34. Again, numbers could only be used

    once. In 1783, the Swiss mathematician, Leonhard Euler, wrote about a game he

    called Latin Squares where he removed the diagonal requirements and made the

    game a puzzle of permutations. There are 6! = 720 different ways that 6

    numbers can be arranged. Between 1890 and 1920, a game called Magic

    Squares appeared in a French newspaper. The game first appeared in 1978 in the

    U.S., and in 1984 in Japan where it was given the name Sudoku which is short for a longer expression which means the digits are limited to one occurrence.

    There are many variations of Sudoku including matrices of 4 X 4, 6 X 6, 9 X 9,

    etc. and sometimes adding additional constraint(s) by including the diagonal(s) of

    the matrix (X-Sudoku). This paper presents an analytical solution for 6 X 6

    puzzles with six 2 X 3 grids. Three example puzzles with 12, 16, and 13

    permanent clues, respectively, are solved. See page 4 for puzzle No. 1. See

    Appendix B for puzzles No. 2 and No. 3. While fewer clues generally make a

    puzzle more difficult to solve, the ultimate difficulty is presently agreed upon by

    most experts to be the number and complexity of the solving techniques required

    to find a solution. These techniques include, hidden singles, hidden pairs, hidden

    triples, hidden quads, naked singles, naked pairs, naked triples, naked quads, X-

    Wing, Swordfish, XY-Wing, etc.

    A naked single occurs when only one number can fit the constraints of one

    number per row, column, and grid for a square. That naked single is an obvious

    solution. A hidden single occurs when only one of many possible solution numbers appears in the list of possible solutions for a row, column, or grid.

  • 6

    Naked and Hidden Singles are initially searched. Finding these solutions

    permits rechecking for newly uncovered singles after each find. This is called

    propagation of solutions which may significantly reduce the number of

    unknowns and hence computing time. This procedure found 8, 4, and 4 additional

    clues for Puzzles 1, 2, and 3, respectively. This left 16, 16, and 19 unidentified

    squares in Puzzles 1, 2, and 3, respectively.

    The computer used to solve these puzzles was a Dell Inspiron 546 Desktop

    with 6 GB of RAM, and an AMD Phenom 9650 Quad-Core Processor operating

    at 2.30 GHz and using QB64. Times in seconds required for solution of the three

    puzzles were 30, 94, and 108, respectively.

    Discussion

    A. Development of Math Model

    Puzzle No. 1 shown below in Figure 1 was randomly selected from those found in

    an internet search. It has 12 clues or known squares out of 36 total squares. These

    clues are highlighted in yellow. Solution by MCM makes use of constraints which

    insure that the solution will only have one of each of the six possible digits in each

    row, column, and grid; and no duplicates. The sum and product of the six digits in

    each row, column, and grid must be 21 and 720, respectively. These two

    constraints form simultaneous linear and non-linear equations which model the

    system being studied. These equations have associative solutions as the sums and

    products can equal 21 and 720 regardless of their positions in the square. Third

    and fourth constraints limit the total number of each digit to six in each set of rows,

    columns, and grids; and insure that there are no duplicates. The MCM objective

    function is formed by designing the constraints to be convex and adding them. The

    justification for the addition of these constraints is similar to that used in

    Maximum Likelihood methods. (Banbura, 2010) The objective function

    becomes convex by being built of convex functions and can thus be minimized.

    The feasible solutions are bounded from 1 to 6. Further proof of the linearity

    (ability to add constraints) of the simultaneous marching schema used in this

    work can be found in Analysis of the n-dimensional quadtree decomposition for

    arbitrary hyper-rectangles by Cristos Faloutsos et.al.at

    http://drum.lib.umd.edu/bitstream/1903/678/2/CS-TR-3381.pdf.

  • 7

    The model is described by assigning X(k) sequentially to the squares from X(1) to

    X(36). The squares are also described in two dimensions by A(Row, Col) where

    A(1, 1) = X(1) on down to A(6, 6) = X(36). Having these two nomenclatures

    facilitates referring to the grid variables. Short subroutines can be called to convert

    k to (Row, Col) and (Row, Col) to k. Grids 1 to 6 are 2 rows and 3 columns

    numbered from left to right and top to bottom.

    FIGURE 1.

    1 2 5 4 6 3 1

    2 6 1 3 5 2 4

    3 4 2 6 1 5 3

    4 1 3 5 2 4 6

    5 5 4 1 3 6 2

    6 3 6 2 4 1 5

    1 2 3 4 5 6

    Summation equations for rows:

    Row #1. X(1) + X(2) + X(3) + X(4) + X(5) + X(6) = 21 or i=1 to 6 Xi = 21

    Row #2. i=7 to 12 Xi = 21

    Row #3 i=13 to 18 Xi = 21

    Row #4. i=19 to 24 Xi = 21

    Row #5. i=25 to 30 Xi = 21

    Row #6. i=31 to 36 Xi = 21

    Summation equations for columns:

    Column #1. X(1) + X(7) + X(13) + X(19) + X(25) + X(31) = 21

    Column #2. X(2) + X(8) + X(14) + X(20) + X(26) + X(32) = 21

    Column #3. X(3) + X(9) + X(15) + X(21) + X(27) + X(33) = 21

  • 8

    Column #4. X(4) + X(10) + X(16) + X(22) + X(28) + X(34) = 21

    Column #5. X(5) + X(11) + X(17) + X(23) + X(29) + X(35) = 21

    Column #6. X(6) + X(12) + X(18) + X(24) + X(30) + X(36) = 21

    Summation equations for grids:

    Grid #1. X(1) + X(2) + X(3) + X(7) + X(8) + X(9) = 21

    Grid #2. X(4) + X(5) + X(6) + X(10) + X(11) + X(12) = 21

    Grid #3. X(13) + X(14) + X(15) + X(19) + X(20) + X(21) = 21

    Grid #4. X(16) + X(17) + X(18) + X(22) + X(23) + X(24) = 21

    Grid #5. X(25) + X(26) + X(27) + X(31) + X(32) + X(33) = 21

    Grid #6. X(28) + X(29) + X(30) + X(34) + X(35) + X(36) = 21

    Product equations for rows:

    Row #1. X(1) x X(2) x X(3) x X(4) x X(5) x X(6) = 720 or i = 1 to 6 Xi =720

    Row #2. i = 7 to 12 Xi =720

    Row #3. i = 13 to 18 Xi =720

    Row #4. i = 19 to 24 Xi =720

    Row #5. i = 25 to 30 Xi =720

    Row #6. i = 31 to 36 Xi =720

    Product equations for columns:

    Column #1. X(1) x X(7) x X(13) x X(19) x X(25) x X(31) = 720

    Column #2. X(2) x X(8) x X(14) x X(20) x X(26) x X(32) = 720

    Column #3. X(3) x X(9) x X(15) x X(21) x X(27) x X(33) = 720

    Column #4. X(4) x X(10) x X(16) x X(22) x X(28) x X(34) = 720

    Column #5. X(5) x X(11) x X(17) x X(23) x X(29) x X(35) = 720

    Column #6. X(6) x X(12) x X(18) x X(24) x X(30) x X(36) = 720

  • 9

    Product equations for grids:

    Grid #1. X(1) x X(2) x X(3) x X(7) x X(8) x X(9) = 720

    Grid #2. X(4) x X(5) x X(6) x X(10) x X(11) x X(12) = 720

    Grid #3. X(13) x X(14) x X(15) x X(19) x X(20) x X(21) = 720

    Grid #4. X(16) x X(17) x X(18) x X(22) x X(23) x X(24) = 720

    Grid #5. X(25) x X(26) x X(27) x X(31) x X(32) x X(33) = 720

    Grid #6. X(28) x X(29) x X(30) x X(34) x X(35) x X(36) = 720

    Constraint #3: Total of each digit equal to 6 in each grid, row, and column where TGD(Grids,

    Digit), TRD(Rows, Digits), TCD(Columns, Digits) represent the total count of each digit in

    grids, rows, and columns, respectively. Details of how these values are obtained follow in

    Section A. TOTONES% = total number of ones, TOTTWOS% = total number of twos etc.

    TOTONES% = 0: TOTTWOS% = 0: TOTTHREES% = 0: TOTFOURS% = 0:

    TOTFIVES% = 0: TOTSIXES% = 0

    FOR II = 1 TO 6: JJ = 1: TOTONES% = TOTONES% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T1 = ABS(TOTONES% - 18)

    FOR II = 1 TO 6: JJ = 2: TOTTWOS% = TOTTWOS% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T2 = ABS(TOTTWOS% - 18)

    FOR II = 1 TO 6: JJ = 3: TOTTHREES% = TOTTHREES% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T3 = ABS(TOTTHREES% - 18)

    FOR II = 1 TO 6: JJ = 4: TOTFOURS% = TOTFOURS% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T4 = ABS(TOTFOURS% - 18)

    FOR II = 1 TO 6: JJ = 5: TOTFIVES% = TOTFIVES% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T5 = ABS(TOTFIVES% - 18)

    FOR II = 1 TO 6: JJ = 6: TOTSIXES% = TOTSIXES% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T6 = ABS(TOTSIXES% - 18)

    Constraint #4. Total duplicates in the grids, TOTSUMGD, rows, TOTSUMRD, and columns,

    TOTSUMCD, are added to determine the total duplicates. Details are in Section B below, and

    Appendix A.

    Total Duplicates = TOTSUMGD + TOTSUMRD + TOTSUMCD

  • 10

    B. Development of Constraint Equations

    Details of how the third and fourth constraints are developed are presented here. When the

    proposed solution values for the squares are converted to strings using the QB64 STR$

    function they can be concatenated into a new string containing all of the proposed values in a

    row, column or grid unit. The INSTR function can then be used to determine the quantity and

    location of each of the six possible digits in the unit. This code is, no doubt, similar to that used

    by Microsoft EXCEL in its COUNTIF function. The code below demonstrates this operation:

    REM CONVERT ROW VALUES TO STRINGS AND CONCATENATE

    FOR ROW% = 1 TO 6: XX$(ROW%) = "": NEXT ROW%

    FOR ROW% = 1 TO 6

    FOR COL% = 1 TO 6

    GOSUB 40 'CONVERT ROW% AND COL% TO K

    XL$ = STR$(X(K)): XL$ = LTRIM$(XL$)

    XX$(ROW%) = XX$(ROW%) + XL$

    NEXT COL%

    PRINT " ROW%= "; ROW%; " ROW STRING= "; XX$(ROW%)

    NEXT ROW%

    REM DEFINE CONTENTS OF ROWS

    FOR ROW% = 1 TO 6: FOR II = 1 TO 6: CTR(ROW%, II) = 0: NEXT II: NEXT ROW%

    FOR ROW% = 1 TO 6

    FOR II = 1 TO 6

    DIG$ = STR$(II): DIG$ = LTRIM$(DIG$) LTRIM$ insures no blank spaces to the left or

    beginning of the string

    POSITION% = INSTR(XX$(ROW%), DIG$)

    DO WHILE POSITION% 0

    PRINT " ROW= "; ROW%; " DIGIT= "; II; " POSITION= "; POSITION%

    CTR(ROW%, II) = CTR(ROW%, II) + 1

    POSITION% = INSTR(POSITION% + 1, XX$(ROW%), DIG$)

    LOOP

  • 11

    IF CTR(ROW%, II) >= 1 THEN

    PRINT " COUNT= "; CTR(ROW%, II); " FOR DIGIT= "; II

    ELSE

    PRINT " ROW= "; ROW%; " CONTAINS NO "; II

    END IF

    NEXT II

    NEXT ROW%

    REM COUNT DUPLICATES IN ROWS

    FOR II = 1 TO 6: SUMRD(II) = 0: NEXT II

    FOR II = 1 TO 6

    FOR DIGITS = 1 TO 6

    SUMRD(II) = SUMRD(II) + ABS(TRD(II, JJ) - 1) Convert to convex form

    NEXT JJ

    NEXT II

    TOTSUMRD = 0

    FOR II = 1 TO 6

    TOTSUMRD = TOTSUMRD + SUMRD(II)

    NEXT II

    PRINT: PRINT " TOTSUMRD= "; TOTSUMRD

  • 12

    Figure 2. Computer output for all rows with details for Row #1

    The count of the number of digits, 1 to 6, plus the number of duplicates can be

    determined from the above results. The code for columns and grids is similar and

    can be found in Appendix A.

    C. Solution of the model

    Lower (LL) and Upper (UL) limits or bounds are set for the puzzle variables at 1

    and 6. The differences between these limits are called the ranges of the variables

    for each square and can be different for each square. A Crosshatch subroutine

    (eliminates digits which are already in use) is used to check for the set of feasible

    values for each unknown square. In the inner loop, I, values of X(k) for each

    iteration are chosen randomly from these sets of feasible variables for each square.

    The convex constraint equations are evaluated for the set of X(k)s selected and

    inserted into the objective function. If the values chosen provide the minimum

    value of the objective function so far, they are retained as the best solution to date.

    If not, another similar iteration is performed.

    A predetermined number of iterations is executed before the second loop, J, is

    entered. This loop raises the lower bounds, LL, of the hyper-rectangles for each

    X(k) toward the upper bounds, UL, based on the best solution of each so far. The

    range, R, of each hyper-rectangle is individually reduced to center its limits around

    the best solution. A focus factor, H, is used in the calculations to reduce the

  • 13

    rectangle widths by a power. When the power is two (2) the range is bisected each

    time. The equation describing the rectangle area is f(x) = R/(HJ) where R is the

    range of solutions and H=1.3 with J = 1, 2, 3,.n, the number of the outer loop

    iteration. In the case of bisection, where H =2, the first iteration when J = 1 splits

    the range in half. In the second iteration where J = 2, the remaining range is

    reduced by 2^2 or one fourth. The limit of this function as J approaches infinity is

    0 where the entire range of solutions has been examined.

    The three puzzles chosen for this report are Easy, Medium Hard and Hard.

    The focus factors for each puzzle were chosen from experience to be 1.3. The

    number of iterations in the inner loop, I, was increased as the difficulty of the

    puzzle increased. Values of 5000, 30,000, and 40,000 iterations of I were used,

    respectively, as the puzzle difficulty increased. Completion times for the three

    puzzles were 30, 94, and 108 seconds, respectively, with no pauses. Removing the

    comment code () on the Input Press ENTER to continue, Yes will permit the user to watch the algorithm move the objective function values to zero.

    D. Computer code for iterative procedure

    MM = 1E+30: H = 1.3

    RANDOMIZE (-1111)

    COUNTI& = 0: COUNT& = 0

    TS# = TIMER

    FOR J = 1 TO 20

    FOR I& = 1 TO ZZZ

    FOR K = 1 TO 36

    COUNT& = COUNT& + 1: COUNT1% = 0

    GOSUB 35 convert k to row and column

    IF Z(K) >= 1 THEN X(K) = Z(K): GOTO 292

    IF AA(K) - UL(K) / H ^ J < LL(K) THEN GOTO 250

    GOTO 260

    250 L(K) = LL(K)

    255 GOTO 265

  • 14

    260 L(K) = AA(K) - UL(K) / H ^ J

    265 IF (AA(K) + UL(K) / H ^ J > UL(K)) THEN GOTO 280

    270 GOTO 290

    280 R = UL(K) - L(K)

    285 GOTO 295

    290 R = AA(K) + UL(K) / H ^ J - L(K)

    295 X(K) = INT(L(K) + (RND * R) + 0.5): COUNT1% = COUNT1% + 1

    IF COUNT1% > 50 THEN INPUT " PRESS ENTER TO CONTINUE", YES: GOTO

    292 ' OUT OF DIGITS AT K= "; K

    FLAG5 = 1: GOSUB 700 'CHECK FOR FEASIBILITY

    IF FLAG5 = 0 THEN GOTO 295

    292 PRINT " K= "; K; " Z= "; Z(K); " X= "; X(K); " COUNT= "; COUNT1%

    300 NEXT K

    REM CONVEX OBJECTIVE FUNCTION FOR MINIMIZATION TO ZERO

    See Appendix A for the calculation of the following values:

    PT = Total sum of the rows, CT = the total sum of the columns, and GT = the total

    sum of the grids. PMT = the product of all of the rows, CMT = the product of all of

    the columns, and GMT = the product of all of the grids. T1 through T6 = the sum

    of the six digits for all rows, columns, and grids. TOTSUMs are the total duplicates for the rows, columns, and grids. All of these values are in convex form.

    S = PT + CT + GT + PMT + CMT + GMT + T1 + T2 + T3 + T4 + T5 + T6 + TOTSUMRD

    + TOTSUMCD + TOTSUMGD

    PRINT: PRINT " S= "; S; "MM= "; MM; "J= "; J; " I= "; I&

    IF S = 0 THEN GOTO 556 Found solution!

    IF S < MM THEN GOTO 660

    GOTO 670

    660 MM = S new minimum

    FOR K = 1 TO 36

    AA(K) = X(K)

    GOSUB 35

  • 15

    A(ROW%, COL%) = X(K)

    333 'PRINT " K= "; K; " X= "; X(K); " ROW= "; ROW%; " COL= "; COL%; " AA= ";

    AA(K)

    NEXT K

    670 COUNTI& = COUNTI& + 1 ': PRINT: PRINT " COUNTI= "; COUNTI&

    'INPUT "PRESS ENTER TO CONTINUE", YES

    444 NEXT I&

    CLS

    'PRINT: PRINT " PTT= "; PTT; " CTT= "; CTT; " GT= "; GT

    'PRINT: PRINT " PMTT= "; PMTT; " CMTT= "; CMTT; " GMT= "; GMT

    'PRINT: PRINT " TOTSUMGD= "; TOTSUMGD; " TOTSUMRD= "; TOTSUMRD; "

    TOTSUMCD= "; TOTSUMCD

    'PRINT: PRINT " T1= "; T1; " T2= "; T2; " T3= "; T3; " T4= "; T4; " T5= "; T5; " T6= "; T6

    'PRINT: PRINT " S= "; S; "MM= "; MM

    'PRINT: PRINT " J= "; J; " I= "; I&; " S= "; S; "MM= "; MM

    COUNTI& = 0

    COUNTJ& = COUNTJ& + 1: PRINT: PRINT " COUNTJ= "; COUNTJ&

    'INPUT " PRESS ENTER TO CONTINUE", YES

    555 NEXT J

    556 CLS: PRINT: PRINT " FINAL RESULTS!"

    PRINT: PRINT " S= "; S; " MM= "; MM

    PRINT: PRINT " J= "; J; " I= "; I&; " S= "; S; " MM= "; MM

    PRINT: PRINT " COUNTJ = "; COUNTJ&; " COUNTI= "; COUNTI&

    BEEP: BEEP

    TF# = TIMER

  • 16

    PRINT: PRINT " START TIME= "; TS#; " FINISH TIME= "; TF#

    ELAPSE# = (TF# - TS#): PRINT " ELAPSED TIME= "; ELAPSE#; " SECONDS"

    INPUT "PRESS ENTER TO CONTINUE", YES

    GOSUB 190 Print solution to computer screen

    GOSUB 200 Print solution to hard drive

    INPUT "PRESS ENTER TO CONTINUE", YES

    GOTO 999 END

  • 17

    Appendix A: Development of Constraint Equations

    REM CONVERT GRID VALUES TO STRINGS AND CONCATENATE

    FOR GRID%% = 1 TO 6: XY$(GRID%%) = "": NEXT GRID%%

    XY$(1) = LTRIM$(STR$(X(1))) + LTRIM$(STR$(X(2))) + LTRIM$(STR$(X(3))) +

    LTRIM$(STR$(X(7))) + LTRIM$(STR$(X(8))) + LTRIM$(STR$(X(9)))

    XY$(2) = LTRIM$(STR$(X(4))) + LTRIM$(STR$(X(5))) + LTRIM$(STR$(X(6))) +

    LTRIM$(STR$(X(10))) + LTRIM$(STR$(X(11))) + LTRIM$(STR$(X(12)))

    XY$(3) = LTRIM$(STR$(X(13))) + LTRIM$(STR$(X(14))) + LTRIM$(STR$(X(15))) +

    LTRIM$(STR$(X(19))) + LTRIM$(STR$(X(20))) + LTRIM$(STR$(X(21)))

    XY$(4) = LTRIM$(STR$(X(16))) + LTRIM$(STR$(X(17))) + LTRIM$(STR$(X(18))) +

    LTRIM$(STR$(X(22))) + LTRIM$(STR$(X(23))) + LTRIM$(STR$(X(24)))

    XY$(5) = LTRIM$(STR$(X(25))) + LTRIM$(STR$(X(26))) + LTRIM$(STR$(X(27))) +

    LTRIM$(STR$(X(31))) + LTRIM$(STR$(X(32))) + LTRIM$(STR$(X(33)))

    XY$(6) = LTRIM$(STR$(X(28))) + LTRIM$(STR$(X(29))) + LTRIM$(STR$(X(30))) +

    LTRIM$(STR$(X(34))) + LTRIM$(STR$(X(35))) + LTRIM$(STR$(X(36)))

    REM DEFINE GRID CONTENTS

    FOR GRID% = 1 TO 6: FOR II = 1 TO 6: CTG(GRID%, II) = 0: NEXT II: NEXT GRID%

    FOR GRID% = 1 TO 6

    FOR II = 1 TO 6

    DIG$ = STR$(II): DIG$ = LTRIM$(DIG$)

    POSITION% = INSTR(XY$(GRID%), DIG$)

    DO WHILE POSITION% 0

    PRINT " GRID= "; GRID%; " DIGIT= "; II; " POSITION= "; POSITION%

    CTG(GRID%, II) = CTG(GRID%, II) + 1

    POSITION% = INSTR(POSITION% + 1, XY$(GRID%), DIG$)

    LOOP

    IF CTG(GRID%, II) >= 1 THEN

    PRINT " COUNT= "; CTG(GRID%, II); " FOR DIGIT= "; II

    ELSE

    PRINT " GRID= "; GRID%; " CONTAINS NO "; II

  • 18

    END IF

    NEXT II

    NEXT GRID%

    REM COUNT DUPLICATES INGRIDS

    FOR GRID% = 1 TO 6: FOR II = 1 TO 6: TGD(GRID%, II) = 0: NEXT II: NEXT GRID%

    FOR GRID% = 1 TO 6

    FOR II = 1 TO 6

    TGD(GRID%, II) = TGD(GRID%, II) + CTG(GRID%, II)

    PRINT: PRINT " GRID= "; GRID%; " DIGIT= "; II; " CTG= "; CTG(GRID%, II)

    NEXT II

    PRINT " GRID= "; GRID%; " TGD(GRID%, II)= "; TGD(GRID%, 1); TGD(GRID%,

    2); TGD(GRID%, 3); TGD(GRID%, 4); TGD(GRID%, 5); TGD(GRID%, 6)

    NEXT GRID%

    REM PUT INTO CONVEX FORM

    FOR II = 1 TO 6: SUMGD(II) = 0: NEXT II

    FOR II = 1 TO 6

    FOR JJ = 1 TO 6

    SUMGD(II) = SUMGD(II) + ABS(TGD(II, JJ) - 1)convert to convex form

    NEXT JJ

    NEXT II

    TOTSUMGD = 0

    FOR II = 1 TO 6

    TOTSUMGD = TOTSUMGD + SUMGD(II)

    NEXT II

    PRINT: PRINT " TOTSUMGD= "; TOTSUMGD

  • 19

    REM CONVERT COLUMN VALUES TO STRINGS AND CONCATENATE

    FOR COL% = 1 TO 6: YY$(COL%) = "": NEXT COL%

    FOR COL% = 1 TO 6

    FOR ROW% = 1 TO 6

    GOSUB 40

    XL$ = STR$(X(K)): XL$ = LTRIM$(XL$)

    YY$(COL%) = YY$(COL%) + XL$

    NEXT ROW%

    PRINT " COL%= "; COL%; " COLUMN STRING= "; YY$(COL%)

    NEXT COL%

    REM DEFINE CONTENTS OF COLUMNS

    FOR COL% = 1 TO 6: FOR II = 1 TO 6: CTC(COL%, II) = 0: NEXT II: NEXT COL%

    FOR COL% = 1 TO 6

    FOR II = 1 TO 6

    DIG$ = STR$(II): DIG$ = LTRIM$(DIG$)

    POSITION% = INSTR(YY$(COL%), DIG$)

    DO WHILE POSITION% 0

    PRINT " COL= "; COL%; " DIGIT= "; II; " POSITION= "; POSITION%

    CTC(COL%, II) = CTC(COL%, II) + 1

    POSITION% = INSTR(POSITION% + 1, YY$(COL%), DIG$)

    LOOP

    IF CTC(COL%, II) >= 1 THEN

    PRINT " COUNT= "; CTC(COL%, II); " FOR DIGIT= "; II

    ELSE

    PRINT " COL= "; COL%; " CONTAINS NO "; II

    END IF

    NEXT II

    NEXT COL%

  • 20

    REM COUNT DUPLICATES IN COLUMNS

    FOR II = 1 TO 6: SUMCD(II) = 0: NEXT II

    FOR II = 1 TO 6

    FOR JJ = 1 TO 6

    SUMCD(II) = SUMCD(II) + ABS(TCD(II, JJ) - 1) convert to convex

    NEXT JJ

    NEXT II

    TOTSUMCD = 0

    FOR II = 1 TO 6

    TOTSUMCD = TOTSUMCD + SUMCD(II)

    NEXT II

    PRINT: PRINT " TOTSUMCD= "; TOTSUMCD

    REM CONSTRAINT EQUATIONS FOR SUMS AND PRODUCTS OF UNITS

    REM EQUATIONS FOR ROWS 1.6

    REM ROW #1

    P1 = X(1) + X(2) + X(3) + X(4) + X(5) + X(6) sums of variables

    PM1 = X(1) * X(2) * X(3) * X(4) * X(5) * X(6) products of variables

    PRINT " PM1= "; PM1

    PM1 = ABS(PM1 - 720) convert to convex form

    P1 = ABS(P1 - 21) convert to convex form

    PRINT: PRINT " PM1= "; PM1; " P1= "; P1

    REM ROW #6

    P6 = X(31) + X(32) + X(33) + X(34) + X(35) + X(36)

    PM6 = X(31) * X(32) * X(33) * X(34) * X(35) * X(36)

    PRINT " PM6= "; PM6

    PM6 = ABS(PM6 - 720)

  • 21

    P6 = ABS(P6 - 21)

    PRINT: PRINT " PM6= "; PM6; " P6= "; P6

    PT = P1 + P2 + P3 + P4 + P5 + P6

    PMT = PM1 + PM2 + PM3 + PM4 + PM5 + PM6

    PRINT: PRINT " PT= "; PT; " PMT= "; PMT

    REM EQUATIONS FOR COLUMNS 1.6

    REM COLUMN #1

    C1 = X(1) + X(7) + X(13) + X(19) + X(25) + X(31)

    CM1 = X(1) * X(7) * X(13) * X(19) * X(25) * X(31)

    PRINT " CM1= "; CM1

    CM1 = ABS(CM1 - 720)

    C1 = ABS(C1 - 21)

    PRINT: PRINT " CM1= "; CM1; " C1= "; C1

    REM COLUMN #6

    C6 = X(6) + X(12) + X(18) + X(24) + X(30) + X(36)

    CM6 = X(6) * X(12) * X(18) * X(24) * X(30) * X(36)

    PRINT " CM6= "; CM6

    CM6 = ABS(CM6 - 720)

    C6 = ABS(C6 - 21)

    PRINT: PRINT " CM6= "; CM6; " C6= "; C6

    CT = C1 + C2 + C3 + C4 + C5 + C6

    CMT = CM1 + CM2 + CM3 + CM4 + CM5 + CM6

    PRINT: PRINT " CT= "; CT; " CMT= "; CMT

    REM EQUATIONS FOR GRIDS 16

    REM GRID% #1

    G1 = X(1) + X(2) + X(3) + X(7) + X(8) + X(9)

  • 22

    GM1 = X(1) * X(2) * X(3) * X(7) * X(8) * X(9)

    PRINT " GM1= "; GM1

    GM1 = ABS(GM1 - 720)

    G1 = ABS(G1 - 21)

    PRINT: PRINT " GM1= "; GM1; " G1= "; G1

    REM GRID% #6

    G6 = X(28) + X(29) + X(30) + X(34) + X(35) + X(36)

    GM6 = X(28) * X(29) * X(30) * X(34) * X(35) * X(36)

    PRINT " GM6= "; GM6

    GM6 = ABS(GM6 - 720)

    G6 = ABS(G6 - 21)

    PRINT: PRINT " GM6= "; GM6; " G6= "; G6

    GT = G1 + G2 + G3 + G4 + G5 + G6

    GMT = GM1 + GM2 + GM3 + GM4 + GM5 + GM6

    PRINT: PRINT " GT= "; GT; " GMT= "; GMT

    REM COUNT TOTAL DIGITS OF EACH KIND IN GRIDS, ROWS AND COLUMNS AND

    CONVERT TO CONVEX FORM

    TOTONES% = 0: TOTTWOS% = 0: TOTTHREES% = 0: TOTFOURS% = 0:

    TOTFIVES% = 0: TOTSIXES% = 0

    FOR II = 1 TO 6: JJ = 1: TOTONES% = TOTONES% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T1 = ABS(TOTONES% - 18) The same six digits appear in each unit

    FOR II = 1 TO 6: JJ = 2: TOTTWOS% = TOTTWOS% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T2 = ABS(TOTTWOS% - 18)

    FOR II = 1 TO 6: JJ = 3: TOTTHREES% = TOTTHREES% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T3 = ABS(TOTTHREES% - 18)

    FOR II = 1 TO 6: JJ = 4: TOTFOURS% = TOTFOURS% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T4 = ABS(TOTFOURS% - 18)

    FOR II = 1 TO 6: JJ = 5: TOTFIVES% = TOTFIVES% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T5 = ABS(TOTFIVES% - 18)

  • 23

    FOR II = 1 TO 6: JJ = 6: TOTSIXES% = TOTSIXES% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T6 = ABS(TOTSIXES% - 18)

    PRINT: PRINT " PT= "; PT; " CT= "; CT; " GT= "; GT

    PRINT: PRINT " PMT= "; PMT; " CMT= "; CMT; " GMT= "; GMT

    PRINT: PRINT " TOTSUMGD= "; TOTSUMGD; " TOTSUMRD= "; TOTSUMRD; "

    TOTSUMCD= "; TOTSUMCD

    PRINT: PRINT " T1= "; T1; " T2= "; T2; " T3= "; T3; " T4= "; T4; " T5= "; T5; " T6= "; T6

  • 24

    Appendix B: Puzzles No. 2 and No. 3

    FIGURE 3

    1 6 2 3 4 5 1

    2 1 5 4 3 6 2

    3 3 6 2 5 1 4

    4 4 1 5 6 2 3

    5 2 3 6 1 4 5

    6 5 4 1 2 3 6

    1 2 3 4 5 6

    FIGURE 4.

    1 3 4 2 5 1 6

    2 1 5 6 4 2 3

    3 6 2 1 3 4 5

    4 5 3 4 2 6 1

    5 4 6 3 1 5 2

    6 2 1 5 6 3 4

    1 2 3 4 5 6

  • 25

    Appendix C: Puzzle No. 1 Computer Solution

    QMCMSU28.BAS

    PUZZLE#1

    09-17-2015 20:47:22

    2 3 4 4 4 1

    5 1 4 4 2 4

    4 2 6 1 3 3

    1 3 5 2 3 3

    5 4 1 3 6 2

    3 2 2 4 1 5

    PTT= 14 CTT= 16 GT= 14

    PMTT= 1634 CMTT= 1920 GMT= 1486

    TOTSUMGD= 16 TOTSUMRD= 16 TOTSUMCD= 16

    T1= 0 T2= 3 T3= 6 T4= 9 T5= 6 T6= 12

    S= 5168 MM= 5168

    J= 1 I= 1 S= 5168 MM= 5168

    2 5 3 5 5 1

    6 1 3 4 2 6

    4 2 6 1 4 4

    1 3 5 2 4 4

    5 4 2 3 6 2

    3 6 1 4 1 5

    PTT= 5 CTT= 5 GT= 5

    PMTT= 1542 CMTT= 900 GMT= 868

    TOTSUMGD= 10 TOTSUMRD= 16 TOTSUMCD= 8

    T1= 0 T2= 0 T3= 3 T4= 6 T5= 0 T6= 3

  • 26

    S= 3371 MM= 3371

    J= 1 I= 2 S= 3371 MM= 3371

    2 5 4 5 3 1

    6 1 3 5 2 4

    4 2 6 1 5 4

    1 3 5 2 3 4

    5 4 1 3 6 2

    3 2 2 4 1 5

    PTT= 9 CTT= 7 GT= 7

    PMTT= 1200 CMTT= 860 GMT= 840

    TOTSUMGD= 6 TOTSUMRD= 8 TOTSUMCD= 10

    T1= 0 T2= 3 T3= 0 T4= 3 T5= 3 T6= 9

    S= 2965 MM= 2965

    J= 1 I= 10 S= 2965 MM= 2965

    2 6 4 6 4 1

    6 1 3 5 2 4

    4 2 6 1 4 4

    1 3 5 2 4 4

    5 4 2 3 6 2

    3 6 1 4 1 5

    PTT= 6 CTT= 2 GT= 4

    PMTT= 1800 CMTT= 272 GMT= 592

    TOTSUMGD= 10 TOTSUMRD= 14 TOTSUMCD= 10

    T1= 0 T2= 0 T3= 6 T4= 12 T5= 6 T6= 0

    S= 2734 MM= 2734

    J= 1 I= 47 S= 2734 MM= 2734

  • 27

    2 6 3 5 5 1

    5 1 4 4 2 4

    4 2 6 1 4 4

    1 3 5 2 4 3

    5 4 1 3 6 2

    3 6 2 4 1 5

    PTT= 5 CTT= 7 GT= 3

    PMTT= 668 CMTT= 984 GMT= 416

    TOTSUMGD= 8 TOTSUMRD= 12 TOTSUMCD= 10

    T1= 0 T2= 0 T3= 3 T4= 9 T5= 0 T6= 6

    S= 2131 MM= 2131

    J= 1 I= 93 S= 2131 MM= 2131

    2 3 4 5 5 1

    6 1 3 4 2 3

    4 2 6 1 4 4

    1 3 5 2 3 6

    5 4 1 3 6 2

    3 6 2 4 1 5

    PTT= 4 CTT= 4 GT= 4

    PMTT= 636 CMTT= 528 GMT= 552

    TOTSUMGD= 6 TOTSUMRD= 10 TOTSUMCD= 4

    T1= 0 T2= 0 T3= 3 T4= 3 T5= 3 T6= 3

    S= 1760 MM= 1760

    J= 1 I= 221 S= 1760 MM= 1760

    2 5 4 5 4 1

    6 1 4 4 2 3

  • 28

    4 2 6 1 4 4

    1 3 5 2 3 6

    5 4 1 3 6 2

    3 6 2 4 1 5

    PTT= 2 CTT= 4 GT= 4

    PMTT= 452 CMTT= 624 GMT= 624

    TOTSUMGD= 6 TOTSUMRD= 12 TOTSUMCD= 6

    T1= 0 T2= 0 T3= 3 T4= 9 T5= 3 T6= 3

    S= 1752 MM= 1752

    J= 1 I= 474 S= 1752 MM= 1752

    2 5 4 4 5 1

    5 1 3 4 2 4

    4 2 6 1 5 3

    1 3 5 2 3 6

    5 4 1 3 6 2

    3 6 2 4 1 5

    PTT= 3 CTT= 5 GT= 3

    PMTT= 500 CMTT= 636 GMT= 380

    TOTSUMGD= 8 TOTSUMRD= 8 TOTSUMCD= 8

    T1= 0 T2= 0 T3= 0 T4= 3 T5= 3 T6= 6

    S= 1563 MM= 1563

    J= 1 I= 2548 S= 1563 MM= 1563

    2 3 4 6 5 1

    5 1 3 5 2 3

    4 2 6 1 3 4

    1 3 5 2 4 6

  • 29

    5 4 1 3 6 2

    3 6 2 4 1 5

    PTT= 3 CTT= 3 GT= 5

    PMTT= 414 CMTT= 408 GMT= 684

    TOTSUMGD= 6 TOTSUMRD= 6 TOTSUMCD= 4

    T1= 0 T2= 0 T3= 3 T4= 0 T5= 0 T6= 3

    S= 1539 MM= 1539

    J= 1 I= 3647 S= 1539 MM= 1539

    2 6 3 4 4 1

    4 1 4 5 2 4

    4 2 6 1 4 4

    1 3 5 2 4 6

    5 4 1 3 6 2

    3 6 2 4 1 5

    PTT= 2 CTT= 6 GT= 2

    PMTT= 272 CMTT= 912 GMT= 272

    TOTSUMGD= 10 TOTSUMRD= 10 TOTSUMCD= 12

    T1= 0 T2= 0 T3= 6 T4= 15 T5= 6 T6= 3

    S= 1528 MM= 1528

    J= 2 I= 194 S= 1528 MM= 1528

    2 5 4 6 3 1

    4 1 3 5 2 4

    4 2 6 1 5 3

    1 3 5 2 4 4

    5 4 1 3 6 2

    3 6 2 4 1 5

  • 30

    PTT= 4 CTT= 4 GT= 4

    PMTT= 480 CMTT= 480 GMT= 480

    TOTSUMGD= 4 TOTSUMRD= 4 TOTSUMCD= 4

    T1= 0 T2= 0 T3= 0 T4= 6 T5= 0 T6= 6

    S= 1476 MM= 1476

    J= 2 I= 281 S= 1476 MM= 1476

    2 5 3 6 5 1

    6 1 4 4 2 3

    4 2 6 1 5 4

    1 3 5 2 4 6

    5 4 1 3 6 2

    3 6 2 4 1 5

    PTT= 3 CTT= 3 GT= 1

    PMTT= 564 CMTT= 624 GMT= 240

    TOTSUMGD= 2 TOTSUMRD= 6 TOTSUMCD= 4

    T1= 0 T2= 0 T3= 3 T4= 3 T5= 0 T6= 0

    S= 1453 MM= 1453

    J= 2 I= 680 S= 1453 MM= 1453

    2 5 3 6 4 1

    5 1 4 5 2 4

    4 2 6 1 4 4

    1 3 5 2 4 4

    5 4 1 3 6 2

    3 6 2 4 1 5

    PTT= 2 CTT= 2 GT= 4

    PMTT= 368 CMTT= 248 GMT= 568

  • 31

    TOTSUMGD= 10 TOTSUMRD= 10 TOTSUMCD= 10

    T1= 0 T2= 0 T3= 6 T4= 12 T5= 0 T6= 6

    S= 1246 MM= 1246

    J= 2 I= 1068 S= 1246 MM= 1246

    2 5 4 5 3 1

    6 1 3 6 2 4

    4 2 6 1 4 3

    1 3 5 2 3 6

    5 4 1 3 6 2

    3 6 2 4 1 5

    PTT= 4 CTT= 2 GT= 2

    PMTT= 588 CMTT= 288 GMT= 288

    TOTSUMGD= 2 TOTSUMRD= 8 TOTSUMCD= 2

    T1= 0 T2= 0 T3= 3 T4= 0 T5= 3 T6= 0

    S= 1190 MM= 1190

    J= 2 I= 1672 S= 1190 MM= 1190

    2 5 4 5 4 1

    6 1 3 5 2 3

    4 2 6 1 4 4

    1 3 5 2 4 6

    5 4 1 3 6 2

    3 6 2 4 1 5

    PTT= 1 CTT= 1 GT= 1

    PMTT= 308 CMTT= 168 GMT= 168

    TOTSUMGD= 6 TOTSUMRD= 10 TOTSUMCD= 6

    T1= 0 T2= 0 T3= 3 T4= 6 T5= 0 T6= 3

  • 32

    S= 681 MM= 681

    J= 3 I= 1827 S= 681 MM= 681

    2 5 4 5 3 1

    6 1 3 6 2 4

    4 2 6 1 5 3

    1 3 5 2 4 6

    5 4 1 3 6 2

    3 6 2 4 1 5

    PTT= 2 CTT= 0 GT= 0

    PMTT= 264 CMTT= 0 GMT= 0

    TOTSUMGD= 0 TOTSUMRD= 4 TOTSUMCD= 0

    T1= 0 T2= 0 T3= 0 T4= 0 T5= 0 T6= 0

    S= 270 MM= 270

    J= 3 I= 2801 S= 270 MM= 270

    SOLUTION ACHIEVED! I= 124 J= 5

    QMCMSU27.BAS

    PUZZLE#1

    09-17-2015 20:48:23

    2 5 4 6 3 1

    6 1 3 5 2 4

    4 2 6 1 5 3

    1 3 5 2 4 6

    5 4 1 3 6 2

    3 6 2 4 1 5

    ELAPSED TIME= 14.5 SECONDS

  • 33

    S J I

    5168 1 1

    3371 1 2

    2965 1 10

    2734 1 47

    2131 1 93

    1760 1 221

    1752 1 474 S-Blue

    1563 1 2548

    1539 1 3647

    1528 2 194

    1476 2 281

    1453 2 680

    1246 2 1068

    1190 2 1672

    681 3 1827

    J-

    Orange I-Gray

    270 3 2801

    0 5 124

    Figure 5. Puzzle #1 Objective Function Value, S vs. No. of

    Iterations, J and I

  • 34

    S J I

    14191 1 1

    13127 1 3

    8225 1 4

    6920 1 10

    4570 1 14

    4452 1 20

    4172 1 21 S-Blue

    3263 1 75

    3084 1 103

    2775 1 271

    1534 1 1090

    1154 1 2765

    1101 1 16581

    920 2 7242

    658 2 17211

    J-

    Orange I-Gray

    555 3 2621

    540 3 18244

    375 4 1939

    270 4 22302

    0 4 24458

    Figure 6. Puzzle #2 Objective Function Value, S vs. No. of

    Iterations, J and I

    0

    5000

    10000

    15000

    20000

    25000

    30000

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

    S vs J & I

    Series1 Series2 Series3

  • 35

    S J I

    44122 1 1

    8819 1 2

    5111 1 7

    4829 1 338

    3507 1 653

    2749 1 2200 S-Blue

    2626 1 3140

    2196 1 6211

    2081 2 2597

    1902 2 26269

    1854 3 588

    1818 3 2062

    J-

    Orange I-Gray

    1587 3 3422

    1526 3 5514

    1519 3 6102

    1458 3 17536

    1378 3 18486

    1309 3 19265

    1110 3 21610

    1094 3 25745

    790 3 37194

    447 4 1995

    0 4 2587

    Figure 7. Puzzle #3 Objective Function Value, S vs. No. of

    Iterations, J and I

    0

    10000

    20000

    30000

    40000

    50000

    1 3 5 7 9 11 13 15 17 19 21 23

    S vs J & I

    Series1 Series2 Series3

  • 36

    Appendix D: QB64 Computer Code

    REM SOLVE SUDOKU USING MCM

    REM 01/17/13 J H LASHOVER REV. 10/08/2013 & 08/09/2015 & 09/17/2015

    REM FOR 6 X 6 PUZZLES

    CLS

    PRINT: PRINT " WELCOME TO QMCMSU28.BAS"

    DEFDBL A, Z

    DEFINT I, J, K

    DIM X(36), L(36), Y(36), A(6, 6), Z(36), AA(36), LL(36), UL(36), CTG(6, 6), CTC(6, 6),

    CTR(6, 6) AS LONG

    DIM ZX(6, 6), SUMGD(6), SUMRD(6), SUMCD(6), TGD(6, 6), TRD(6, 6), TCD(6, 6), P(6),

    PM(6), C(6), CM(6) AS LONG

    DIM YY$(6), XY$(6), XX$(6), YYY$(6, 6)

    DIM XXY(6, 6), YYX(6, 6) AS LONG

    DIM CT(6, 6), NF(6, 6) AS LONG

    REM SELECT A SAMPLE PUZZLE OR ENTER YOUR OWN

    10 OP1 = 0: INPUT " PRESS ENTER TO SELECT A SAMPLE PUZZLE, OR ENTER '1' TO

    INPUT YOUR OWN. OP1= ", OP1

    IF OP1 = 0 THEN GOTO 11

    IF OP1 = 1 THEN GOTO 30

    PRINT " PLEASE ENTER A ZERO OR '1': GOTO 10"

    REM INPUT PERMANENT PUZZLE NUMBERS FOR FOUR SAMPLE PUZZLES

    11 OP2 = 0: INPUT " NUMBER OF PUZZLE TO SOLVE: 1, 2, OR 3: NO.= ", OP2

    IF OP2 5 THEN PRINT " PLEASE ENTER NUMBER BETWEEN 1 AND 3.": GOTO 11

  • 37

    ON OP2 GOTO 1, 2, 3

    1 REM SAMPLE PUZZLE NO 1

    ZZZ = 5000

    ZX(1, 1) = 2: ZX(1, 6) = 1

    ZX(2, 2) = 1: ZX(2, 5) = 2

    ZX(3, 3) = 6: ZX(3, 4) = 1

    ZX(4, 3) = 5: ZX(4, 4) = 2

    ZX(5, 2) = 4: ZX(5, 5) = 6

    ZX(6, 1) = 3: ZX(6, 6) = 5

    GOTO 36

    2 REM SAMPLE PUZZLE NO 2

    ZZZ = 30000

    ZX(1, 1) = 6: ZX(1, 4) = 4: ZX(1, 6) = 1

    ZX(2, 2) = 5: ZX(2, 3) = 4: ZX(2, 4) = 3: ZX(2, 5) = 6: ZX(2, 6) = 2

    ZX(3, 3) = 2: ZX(3, 6) = 4

    ZX(4, 5) = 2

    ZX(5, 1) = 2: ZX(5, 4) = 1: ZX(5, 5) = 4

    ZX(6, 3) = 1: ZX(6, 6) = 6

    GOTO 36

    3 REM SAMPLE PUZZLE NO 3

    ZZZ = 40000

    ZX(1, 2) = 4

    ZX(2, 1) = 1: ZX(2, 3) = 6: ZX(2, 4) = 4: ZX(2, 6) = 3

  • 38

    ZX(3, 1) = 6: ZX(3, 3) = 1: ZX(3, 4) = 3

    ZX(4, 5) = 6

    ZX(5, 4) = 1: ZX(5, 6) = 2

    ZX(6, 1) = 2: ZX(6, 3) = 5

    GOTO 36

    30 REM INPUT PUZZLE DATA

    132 INPUT " ROW#= ", I

    IF I = 7 THEN GOTO 36

    INPUT " COLUMN#= ", J

    INPUT " NUMBER IN CELL= ", ZX(I, J)

    GOTO 132

    36 REM START MAIN PROGRAM

    INPUT " NAME OF FILE TO STORE OUTPUT= ", FI$

    INPUT " COMMENTS= "; FII$

    OPEN "C:\QB64\" + FI$ + ".TXT" FOR OUTPUT AS #1

    PRINT #1,: PRINT #1, "QMCMSU28.BAS"

    PRINT #1, FII$

    PRINT #1, DATE$, TIME$

    REM INITIALIZE VARIABLES

    46 GOSUB 5000

    47 GOSUB 10000

    IF FLAG = 1 THEN GOTO 47

    FOR ROW% = 1 TO 6

  • 39

    FOR COL% = 1 TO 6

    GOSUB 40 'CONVERT ROW% AND COL% TO K

    UL(K) = 6: LL(K) = 1: AA(K) = 3

    IF ZX(ROW%, COL%) 0 THEN X(K) = ZX(ROW%, COL%): GOTO 71

    GOTO 68

    71 AA(K) = X(K): Z(K) = X(K): A(ROW%, COL%) = X(K)

    68 NEXT COL%

    70 NEXT ROW%

    MM = 1E+30: H = 1.3

    RANDOMIZE (-1111)

    COUNTI& = 0: COUNT& = 0

    TS# = TIMER

    FOR J = 1 TO 20

    FOR I& = 1 TO ZZZ

    FOR K = 1 TO 36

    COUNT& = COUNT& + 1: COUNT1% = 0

    GOSUB 35

    IF Z(K) >= 1 THEN X(K) = Z(K): GOTO 292

    IF AA(K) - UL(K) / H ^ J < LL(K) THEN GOTO 250

    GOTO 260

    250 L(K) = LL(K)

    255 GOTO 265

    260 L(K) = AA(K) - UL(K) / H ^ J

  • 40

    265 IF (AA(K) + UL(K) / H ^ J > UL(K)) THEN GOTO 280

    270 GOTO 290

    280 R = UL(K) - L(K)

    285 GOTO 295

    290 R = AA(K) + UL(K) / H ^ J - L(K)

    295 X(K) = INT(L(K) + (RND * R) + 0.5): COUNT1% = COUNT1% + 1

    IF COUNT1% > 50 THEN INPUT " PRESS ENTER TO CONTINUE", YES: GOTO

    292 'PRINT: PRINT " OUT OF DIGITS AT K= "; K

    FLAG5 = 1: GOSUB 700 'CHECK FOR FEASIBILITY

    IF FLAG5 = 0 THEN GOTO 295

    292 'PRINT " K= "; K; " Z= "; Z(K); " X= "; X(K); " COUNT= "; COUNT1%

    'INPUT " PRESS ENTER TO CONTINUE", YES

    300 NEXT K

    REM EQUATIONS FOR ROWS

    CLS: PTT = 0: PMTT = 0

    FOR JJ = 1 TO 6: P(JJ) = 0: PM(JJ) = 1: NEXT JJ

    KK = 0: LLL = 1

    FOR II = 1 TO 6

    KK = KK + 6

    FOR JJ = LLL TO KK

    LLL = LLL + 1

    P(II) = P(II) + X(JJ)

    PM(II) = PM(II) * X(JJ)

    NEXT JJ

    P(II) = ABS(P(II) - 21)

    PM(II) = ABS(PM(II) - 720)

    'PRINT: PRINT II, P(II), PM(II)

    PTT = PTT + P(II)

  • 41

    PMTT = PMTT + PM(II)

    NEXT II

    'PRINT: PRINT " PTT= "; PTT; " PMTT= "; PMTT

    'INPUT " PRESS ENTER TO CONTINUE", YES

    REM EQUATIONS FOR COLUMNS

    CLS: CTT = 0: CMTT = 0

    FOR JJ = 1 TO 6: C(JJ) = 0: CM(JJ) = 1: NEXT JJ

    KK = 30: LLL = 1

    FOR II = 1 TO 6

    KK = KK + 1

    FOR JJ = LLL TO KK STEP 6

    C(II) = C(II) + X(JJ)

    CM(II) = CM(II) * X(JJ)

    NEXT JJ

    LLL = LLL + 1

    C(II) = ABS(C(II) - 21)

    CM(II) = ABS(CM(II) - 720)

    'PRINT: PRINT II, C(II), CM(II)

    CTT = CTT + C(II)

    CMTT = CMTT + CM(II)

    NEXT II

    'PRINT: PRINT " CTT= "; CTT; " CMTT= "; CMTT

    'INPUT " PRESS ENTER TO CONTINUE", YES

  • 42

    REM EQUATIONS FOR SUB GRIDS

    CLS

    103 REM GRID% #1

    G1 = X(1) + X(2) + X(3) + X(7) + X(8) + X(9)

    GM1 = X(1) * X(2) * X(3) * X(7) * X(8) * X(9)

    'PRINT " GM1= "; GM1

    GM1 = ABS(GM1 - 720)

    G1 = ABS(G1 - 21)

    'PRINT: PRINT " GM1= "; GM1; " G1= "; G1

    104 REM GRID% #2

    G2 = X(4) + X(5) + X(6) + X(10) + X(11) + X(12)

    GM2 = X(4) * X(5) * X(6) * X(10) * X(11) * X(12)

    'PRINT " GM2= "; GM2

    GM2 = ABS(GM2 - 720)

    G2 = ABS(G2 - 21)

    'PRINT: PRINT " GM2= "; GM2; " G2= "; G2

    105 REM GRID% #3

    G3 = X(13) + X(14) + X(15) + X(19) + X(20) + X(21)

    GM3 = X(13) * X(14) * X(15) * X(19) * X(20) * X(21)

    'PRINT " GM3= "; GM3

    GM3 = ABS(GM3 - 720)

    G3 = ABS(G3 - 21)

    'PRINT: PRINT " GM3= "; GM3; " G3= "; G3

  • 43

    106 REM GRID% #4

    G4 = X(16) + X(17) + X(18) + X(22) + X(23) + X(24)

    GM4 = X(16) * X(17) * X(18) * X(22) * X(23) * X(24)

    'PRINT " GM4= "; GM4

    GM4 = ABS(GM4 - 720)

    G4 = ABS(G4 - 21)

    'PRINT: PRINT " GM4= "; GM4; " G4= "; G4

    107 REM GRID% #5

    G5 = X(25) + X(26) + X(27) + X(31) + X(32) + X(33)

    GM5 = X(25) * X(26) * X(27) * X(31) * X(32) * X(33)

    'PRINT " GM5= "; GM5

    GM5 = ABS(GM5 - 720)

    G5 = ABS(G5 - 21)

    'PRINT: PRINT " GM5= "; GM5; " G5= "; G5

    108 REM GRID% #6

    G6 = X(28) + X(29) + X(30) + X(34) + X(35) + X(36)

    GM6 = X(28) * X(29) * X(30) * X(34) * X(35) * X(36)

    'PRINT " GM6= "; GM6

    GM6 = ABS(GM6 - 720)

    G6 = ABS(G6 - 21)

    'PRINT: PRINT " GM6= "; GM6; " G6= "; G6

    GT = G1 + G2 + G3 + G4 + G5 + G6

    GMT = GM1 + GM2 + GM3 + GM4 + GM5 + GM6

    'PRINT: PRINT " GT= "; GT; " GMT= "; GMT

    'INPUT " PRESS ENTER TO CONTINUE", YES

  • 44

    REM ALGORITHM FOR DETERMINING NUMBER OF DUPLICATES IN A UNIT

    REM GRIDS

    CLS

    FOR GRID%% = 1 TO 6: XY$(GRID%%) = "": NEXT GRID%%

    XY$(1) = LTRIM$(STR$(X(1))) + LTRIM$(STR$(X(2))) + LTRIM$(STR$(X(3))) +

    LTRIM$(STR$(X(7))) + LTRIM$(STR$(X(8))) + LTRIM$(STR$(X(9)))

    XY$(2) = LTRIM$(STR$(X(4))) + LTRIM$(STR$(X(5))) + LTRIM$(STR$(X(6))) +

    LTRIM$(STR$(X(10))) + LTRIM$(STR$(X(11))) + LTRIM$(STR$(X(12)))

    XY$(3) = LTRIM$(STR$(X(13))) + LTRIM$(STR$(X(14))) + LTRIM$(STR$(X(15))) +

    LTRIM$(STR$(X(19))) + LTRIM$(STR$(X(20))) + LTRIM$(STR$(X(21)))

    XY$(4) = LTRIM$(STR$(X(16))) + LTRIM$(STR$(X(17))) + LTRIM$(STR$(X(18))) +

    LTRIM$(STR$(X(22))) + LTRIM$(STR$(X(23))) + LTRIM$(STR$(X(24)))

    XY$(5) = LTRIM$(STR$(X(25))) + LTRIM$(STR$(X(26))) + LTRIM$(STR$(X(27))) +

    LTRIM$(STR$(X(31))) + LTRIM$(STR$(X(32))) + LTRIM$(STR$(X(33)))

    XY$(6) = LTRIM$(STR$(X(28))) + LTRIM$(STR$(X(29))) + LTRIM$(STR$(X(30))) +

    LTRIM$(STR$(X(34))) + LTRIM$(STR$(X(35))) + LTRIM$(STR$(X(36)))

    FOR GRID% = 1 TO 6

    'PRINT " GRID#= "; GRID%; " GRID STRING= "; XY$(GRID%)

    'INPUT " PRESS ENTER TO CONTINUE", YES

    NEXT GRID%

    GOSUB 100 'COUNT DUPLICATES IN GRIDS

    REM ROWS

    CLS

    FOR ROW% = 1 TO 6: XX$(ROW%) = "": NEXT ROW%

    FOR ROW% = 1 TO 6

  • 45

    FOR COL% = 1 TO 6

    GOSUB 40 'CONVERT ROW% AND COL% TO K

    XL$ = STR$(X(K)): XL$ = LTRIM$(XL$)

    XX$(ROW%) = XX$(ROW%) + XL$

    NEXT COL%

    'PRINT " ROW%= "; ROW%; " ROW STRING= "; XX$(ROW%)

    'INPUT " PRESS ENTER TO CONTINUE", YES

    NEXT ROW%

    GOSUB 500 'COUNT DUPLICATES IN ROWS

    REM COLUMNS

    CLS

    FOR COL% = 1 TO 6: YY$(COL%) = "": NEXT COL%

    FOR COL% = 1 TO 6

    FOR ROW% = 1 TO 6

    GOSUB 40

    XL$ = STR$(X(K)): XL$ = LTRIM$(XL$)

    YY$(COL%) = YY$(COL%) + XL$

    NEXT ROW%

    'PRINT " COL%= "; COL%; " COLUMN STRING= "; YY$(COL%)

    'INPUT " PRESS ENTER TO CONTINUE", YES

    NEXT COL%

    GOSUB 600 'COUNT DUPLICATES IN COLUMNS

    REM SET UP CONVEX EQUATIONS FOR UNITS

    REM GRIDS

  • 46

    CLS: CCG = 0: FOR GRID% = 1 TO 6: FOR II = 1 TO 6: TGD(GRID%, II) = 0: NEXT II:

    NEXT GRID%

    FOR GRID% = 1 TO 6

    FOR II = 1 TO 6

    TGD(GRID%, II) = TGD(GRID%, II) + CTG(GRID%, II)

    'PRINT: PRINT " GRID= "; GRID%; " DIGIT= "; II; " CTG= "; CTG(GRID%, II)

    NEXT II

    'PRINT " GRID= "; GRID%; " TGD(GRID%, II)= "; TGD(GRID%, 1); TGD(GRID%,

    2); TGD(GRID%, 3); TGD(GRID%, 4); TGD(GRID%, 5); TGD(GRID%, 6)

    'INPUT " PRESS ENTER TO CONTINUE", YES

    NEXT GRID%

    REM ROWS

    CLS: CCR = 0: FOR ROW% = 1 TO 6: FOR II = 1 TO 6: TRD(ROW%, II) = 0: NEXT II:

    NEXT ROW%

    FOR ROW% = 1 TO 6

    FOR II = 1 TO 6

    TRD(ROW%, II) = TRD(ROW%, II) + CTR(ROW%, II)

    'PRINT: PRINT " ROW= "; ROW%; " DIGIT= "; II; " CTR= "; CTR(ROW%, II)

    NEXT II

    'PRINT " ROW= "; ROW%; " TRD(ROW%, II)= "; TRD(ROW%, 1); TRD(ROW%, 2);

    TRD(ROW%, 3); TRD(ROW%, 4); TRD(ROW%, 5); TRD(ROW%, 6)

    'INPUT " PRESS ENTER TO CONTINUE", YES

    NEXT ROW%

    REM COLUMNS

    CLS: CCC = 0: FOR COL% = 1 TO 6: FOR II = 1 TO 6: TCD(COL%, II) = 0: NEXT II:

    NEXT COL%

    FOR COL% = 1 TO 6

    FOR II = 1 TO 6

  • 47

    TCD(COL%, II) = TCD(COL%, II) + CTC(COL%, II)

    'PRINT: PRINT " COL= "; COL%; " DIGIT= "; II; " CTC= "; CTC(COL%, II)

    NEXT II

    'PRINT " COL= "; COL%; " TCD(COL%, II)= "; TCD(COL%, 1); TCD(COL%, 2);

    TCD(COL%, 3); TCD(COL%, 4); TCD(COL%, 5); TCD(COL%, 6)

    'INPUT " PRESS ENTER TO CONTINUE", YES

    NEXT COL%

    REM PUT INTO CONVEX FORM

    FOR II = 1 TO 6: SUMGD(II) = 0: NEXT II

    FOR II = 1 TO 6

    FOR JJ = 1 TO 6

    SUMGD(II) = SUMGD(II) + ABS(TGD(II, JJ) - 1)

    NEXT JJ

    NEXT II

    TOTSUMGD = 0

    FOR II = 1 TO 6

    TOTSUMGD = TOTSUMGD + SUMGD(II)

    NEXT II

    'PRINT: PRINT " TOTSUMGD= "; TOTSUMGD

    'INPUT " PRESS ENTER TO CONTINUE", YES

    FOR II = 1 TO 6: SUMRD(II) = 0: NEXT II

    FOR II = 1 TO 6

    FOR JJ = 1 TO 6

    SUMRD(II) = SUMRD(II) + ABS(TRD(II, JJ) - 1)

    NEXT JJ

  • 48

    NEXT II

    TOTSUMRD = 0

    FOR II = 1 TO 6

    TOTSUMRD = TOTSUMRD + SUMRD(II)

    NEXT II

    'PRINT: PRINT " TOTSUMRD= "; TOTSUMRD

    'INPUT " PRESS ENTER TO CONTINUE", YES

    FOR II = 1 TO 6: SUMCD(II) = 0: NEXT II

    FOR II = 1 TO 6

    FOR JJ = 1 TO 6

    SUMCD(II) = SUMCD(II) + ABS(TCD(II, JJ) - 1)

    NEXT JJ

    NEXT II

    TOTSUMCD = 0

    FOR II = 1 TO 6

    TOTSUMCD = TOTSUMCD + SUMCD(II)

    NEXT II

    'PRINT: PRINT " TOTSUMCD= "; TOTSUMCD

    'INPUT " PRESS ENTER TO CONTINUE", YES

    TOTONES% = 0: TOTTWOS% = 0: TOTTHREES% = 0: TOTFOURS% = 0:

    TOTFIVES% = 0: TOTSIXES% = 0

    FOR II = 1 TO 6: JJ = 1: TOTONES% = TOTONES% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T1 = ABS(TOTONES% - 18)

    FOR II = 1 TO 6: JJ = 2: TOTTWOS% = TOTTWOS% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T2 = ABS(TOTTWOS% - 18)

  • 49

    FOR II = 1 TO 6: JJ = 3: TOTTHREES% = TOTTHREES% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T3 = ABS(TOTTHREES% - 18)

    FOR II = 1 TO 6: JJ = 4: TOTFOURS% = TOTFOURS% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T4 = ABS(TOTFOURS% - 18)

    FOR II = 1 TO 6: JJ = 5: TOTFIVES% = TOTFIVES% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T5 = ABS(TOTFIVES% - 18)

    FOR II = 1 TO 6: JJ = 6: TOTSIXES% = TOTSIXES% + TGD(II, JJ) + TRD(II, JJ) +

    TCD(II, JJ): NEXT II: T6 = ABS(TOTSIXES% - 18)

    CLS

    'PRINT: PRINT " PTT= "; PTT; " CTT= "; CTT; " GT= "; GT

    'PRINT: PRINT " PMTT= "; PMTT; " CMTT= "; CMTT; " GMT= "; GMT

    'PRINT: PRINT " TOTSUMGD= "; TOTSUMGD; " TOTSUMRD= "; TOTSUMRD; "

    TOTSUMCD= "; TOTSUMCD

    'PRINT: PRINT " T1= "; T1; " T2= "; T2; " T3= "; T3; " T4= "; T4; " T5= "; T5; " T6= ";

    T6

    REM CALCULATE OBJECTIVE FUNCTION

    732 S = PTT + CTT + GT + PMTT + CMTT + GMT + T1 + T2 + T3 + T4 + T5 + T6 +

    TOTSUMGD + TOTSUMRD + TOTSUMCD:

    PRINT: PRINT " S= "; S; " MM= "; MM; " J= "; J; " I= "; I&

    734 'INPUT " PRESS ENTER TO CONTINUE", YES

    IF S = 0 THEN PRINT #1,: PRINT #1, " SOLUTION ACHIEVED!"; " I= "; I&; " J= "; J:

    GOTO 556

    IF S < MM THEN GOTO 660

    GOTO 670

    660 MM = S

    FOR ROW% = 1 TO 6

    FOR COL% = 1 TO 6

  • 50

    GOSUB 40

    IF COL% 6 THEN GOTO 1905

    PRINT #1, X(K): GOTO 1911

    1905 PRINT #1, X(K);

    1911 NEXT COL%

    PRINT #1,

    NEXT ROW%

    PRINT #1,: PRINT #1, " PTT= "; PTT; " CTT= "; CTT; " GT= "; GT

    PRINT #1,: PRINT #1, " PMTT= "; PMTT; " CMTT= "; CMTT; " GMT= "; GMT

    PRINT #1,: PRINT #1, " TOTSUMGD= "; TOTSUMGD; " TOTSUMRD= ";

    TOTSUMRD; " TOTSUMCD= "; TOTSUMCD

    PRINT #1,: PRINT #1, " T1= "; T1; " T2= "; T2; " T3= "; T3; " T4= "; T4; " T5= "; T5; "

    T6= "; T6

    PRINT #1,: PRINT #1, " S= "; S; " MM= "; MM

    PRINT #1,: PRINT #1, " J= "; J; " I= "; I&; " S= "; S; " MM= "; MM

    FOR K = 1 TO 36

    AA(K) = X(K)

    GOSUB 35

    A(ROW%, COL%) = X(K)

    333 'PRINT #1, " K= "; K; " X= "; X(K)

    NEXT K

    670 COUNTI& = COUNTI& + 1 ': PRINT: PRINT " COUNTI= "; COUNTI&

    'INPUT " PRESS ENTER TO CONTINUE", YES

  • 51

    444 NEXT I&

    CLS

    'PRINT: PRINT " PTT= "; PTT; " CTT= "; CTT; " GT= "; GT

    'PRINT: PRINT " PMTT= "; PMTT; " CMTT= "; CMTT; " GMT= "; GMT

    'PRINT: PRINT " TOTSUMGD= "; TOTSUMGD; " TOTSUMRD= "; TOTSUMRD; "

    TOTSUMCD= "; TOTSUMCD

    'PRINT: PRINT " T1= "; T1; " T2= "; T2; " T3= "; T3; " T4= "; T4; " T5= "; T5; " T6= "; T6

    'PRINT: PRINT " S= "; S; " MM= "; MM

    'PRINT: PRINT " J= "; J; " I= "; I&; " S= "; S; " MM= "; MM

    COUNTI& = 0

    COUNTJ& = COUNTJ& + 1: PRINT: PRINT " COUNTJ= "; COUNTJ&

    'INPUT " PRESS ENTER TO CONTINUE", YES

    'OP1 = 0: INPUT " ENTER '1' TO QUIT AND DUMP PRESENT SOLUTION. OP1= ", OP1

    'IF OP1 = 1 THEN GOSUB 1000: GOTO 999

    555 NEXT J

    556 CLS: PRINT: PRINT " FINAL RESULTS!"

    PRINT: PRINT " S= "; S; " MM= "; MM

    PRINT: PRINT " J= "; J; " I= "; I&; " S= "; S; " MM= "; MM

    PRINT: PRINT " COUNTJ = "; COUNTJ&; " COUNTI= "; COUNTI&

    BEEP: BEEP

  • 52

    TF# = TIMER

    PRINT: PRINT " START TIME= "; TS#; " FINISH TIME= "; TF#

    ELAPSE# = (TF# - TS#): PRINT " ELAPSED TIME= "; ELAPSE#; " SECONDS"

    PRINT " ELAPSED TIME= "; ELAPSE#; " SECONDS"

    INPUT " PRESS ENTER TO CONTINUE", YES

    GOSUB 190

    GOSUB 200

    INPUT " PRESS ENTER TO CONTINUE", YES

    GOTO 999

    190 REM SUB TO PRINT OUTPUT

    CLS

    PRINT: PRINT " QMCMSU28.AS"

    FOR K = 1 TO 36

    GOSUB 35

    777 IF K = 18 THEN PRINT " PRESS ENTER TO CONTINUE", YES

    PRINT " K= "; K; " X= "; X(K); " ROW= "; ROW%; " COL= "; COL%; " AA= "; AA(K)

    NEXT K

    INPUT " PRESS ENTER TO CONTINUE", YES

    FOR ROW% = 1 TO 6

    FOR COL% = 1 TO 6

    GOSUB 40

    IF COL% 6 THEN GOTO 905

    PRINT USING "###"; X(K): GOTO 910

    905 PRINT USING "###"; X(K);

    910 NEXT COL%

  • 53

    PRINT

    NEXT ROW%

    INPUT " PRESS ENTER TO CONTINUE", YES

    RETURN

    200 REM SUB TO PRINT OUTPUT

    'INPUT " NAME OF FILE TO STORE OUTPUT= ", FI$

    'INPUT " COMMENTS= "; FII$

    'OPEN "C:\QB64\" + FI$ + ".TXT" FOR OUTPUT AS #1

    PRINT #1,: PRINT #1, "QMCMSU28.BAS"

    PRINT #1, FII$

    PRINT #1, DATE$, TIME$

    FOR ROW% = 1 TO 6

    FOR COL% = 1 TO 6

    GOSUB 40

    IF COL% 6 THEN GOTO 205

    PRINT #1, X(K): GOTO 210

    205 PRINT #1, X(K);

    210 NEXT COL%

    PRINT #1,

    NEXT ROW%

    PRINT #1,: PRINT #1, "ELAPSED TIME= "; ELAPSE#; " SECONDS"

    CLOSE #1

    INPUT " PRESS ENTER TO CONTINUE", YES

    RETURN

    35 REM CONVERT K TO ROW AND COLUMN--ALTERNATIVE CONVERSION OF K TO

    ROW AND COLUMN

    IF K > 6 THEN GOTO 69

  • 54

    ROW% = 1: COL% = K

    GOTO 63

    69 ROW% = K / 6 + 0.49999: ROW% = CINT(ROW%)

    COL% = K - ((ROW% - 1) * 6)

    63 'PRINT " K= "; K; " ROW= "; ROW%; " COL= "; COL%

    'INPUT " PRESS ENTER TO CONTINUE", YES

    RETURN

    40 REM CONVERT ROW AND COLUMN TO K

    K = ((ROW% - 1) * 6) + COL% 'CONVERT I,J TO SINGLE NUMBER

    'PRINT " K= "; K; " ROW= "; ROW%; "COL= "; COL%

    'INPUT " PRESS ENTER TO CONTINUE", YES

    RETURN

    1000 REM SUB TO DUMP MEMORY

    CLS

    PRINT: PRINT " DUMP X'S"

    FOR ROW% = 1 TO 6

    FOR COL% = 1 TO 6

    GOSUB 40

    IF COL% 6 THEN GOTO 1010

    PRINT USING "##"; X(K): GOTO 1005

    1010 PRINT USING "##"; X(K);

    1005 NEXT COL%

    PRINT

    NEXT ROW%

    INPUT " PRESS ENTER TO CONTINUE", YES

  • 55

    PRINT: PRINT " DUMP UL'S"

    FOR II = 1 TO 6

    FOR JJ = 1 TO 6

    KK = ((II - 1) * 6) + JJ 'CONVERT II,JJ TO SINGLE NUMBER

    IF JJ 6 THEN GOTO 5010

    PRINT UL(KK): GOTO 5005

    5010 PRINT UL(KK);

    5005 NEXT JJ

    PRINT

    NEXT II

    INPUT " PRESS ENTER TO CONTINUE", YES

    PRINT: PRINT " DUMP LL'S"

    FOR II = 1 TO 6

    FOR JJ = 1 TO 6

    KK = ((II - 1) * 6) + JJ 'CONVERT II,JJ TO SINGLE NUMBER

    IF JJ 6 THEN GOTO 6010

    PRINT L(KK): GOTO 6005

    6010 PRINT L(KK);

    6005 NEXT JJ

    PRINT

    NEXT II

    INPUT " PRESS ENTER TO CONTINUE", YES

    RETURN

  • 56

    100 REM SUB TO COUNT DUPLICATES IN A GRID

    FOR GRID% = 1 TO 6: FOR II = 1 TO 6: CTG(GRID%, II) = 0: NEXT II: NEXT GRID%

    FOR GRID% = 1 TO 6

    FOR II = 1 TO 6

    DIG$ = STR$(II): DIG$ = LTRIM$(DIG$)

    POSITION% = INSTR(XY$(GRID%), DIG$)

    DO WHILE POSITION% 0

    'PRINT " GRID= "; GRID%; " DIGIT= "; II; " POSITION= "; POSITION%

    CTG(GRID%, II) = CTG(GRID%, II) + 1

    POSITION% = INSTR(POSITION% + 1, XY$(GRID%), DIG$)

    LOOP

    IF CTG(GRID%, II) >= 1 THEN

    'PRINT " COUNT= "; CTG(GRID%, II); " FOR DIGIT= "; II

    ELSE

    'PRINT " GRID= "; GRID%; " CONTAINS NO "; II

    END IF

    NEXT II

    'INPUT " PRESS ENTER TO CONTINUE", YES

    NEXT GRID%

    RETURN

    500 REM SUB TO COUNT DUPLICATES IN A ROW

    FOR ROW% = 1 TO 6: FOR II = 1 TO 6: CTR(ROW%, II) = 0: NEXT II: NEXT ROW%

    FOR ROW% = 1 TO 6

    FOR II = 1 TO 6

    DIG$ = STR$(II): DIG$ = LTRIM$(DIG$)

    POSITION% = INSTR(XX$(ROW%), DIG$)

    DO WHILE POSITION% 0

  • 57

    'PRINT " ROW= "; ROW%; " DIGIT= "; II; " POSITION= "; POSITION%

    CTR(ROW%, II) = CTR(ROW%, II) + 1

    POSITION% = INSTR(POSITION% + 1, XX$(ROW%), DIG$)

    LOOP

    IF CTR(ROW%, II) >= 1 THEN

    'PRINT " COUNT= "; CTR(ROW%, II); " FOR DIGIT= "; II

    ELSE

    'PRINT " ROW= "; ROW%; " CONTAINS NO "; II

    END IF

    NEXT II

    'INPUT " PRESS ENTER TO CONTINUE", YES

    NEXT ROW%

    RETURN

    600 REM SUB TO COUNT DUPLICATES IN A COLUMN

    FOR COL% = 1 TO 6: FOR II = 1 TO 6: CTC(COL%, II) = 0: NEXT II: NEXT COL%

    FOR COL% = 1 TO 6

    FOR II = 1 TO 6

    DIG$ = STR$(II): DIG$ = LTRIM$(DIG$)

    POSITION% = INSTR(YY$(COL%), DIG$)

    DO WHILE POSITION% 0

    'PRINT " COL= "; COL%; " DIGIT= "; II; " POSITION= "; POSITION%

    CTC(COL%, II) = CTC(COL%, II) + 1

    POSITION% = INSTR(POSITION% + 1, YY$(COL%), DIG$)

    LOOP

    IF CTC(COL%, II) >= 1 THEN

    'PRINT " COUNT= "; CTC(COL%, II); " FOR DIGIT= "; II

    ELSE

  • 58

    'PRINT " COL= "; COL%; " CONTAINS NO "; II

    END IF

    NEXT II

    'INPUT " PRESS ENTER TO CONTINUE", YES

    NEXT COL%

    RETURN

    5000 REM SUB TO ASSIGN SEQUENTIAL VALUES TO ARRAY XXY() AND YYX()

    FROM 1 TO 6 AND ZERO YYY$ ARRAY

    FOR II = 1 TO 6

    KK = 0

    FOR JJ = 1 TO 6

    KK = KK + 1

    XXY(II, JJ) = KK: YYX(JJ, II) = KK: YYY$(II, JJ) = ""

    'PRINT " XXY= "; XXY(II, JJ); " YYX= "; YYX(II, JJ); " II= "; II; " JJ= "; JJ

    'INPUT " PRESS ENTER TO CONTINUE", YES

    NEXT JJ

    NEXT II

    REM CHECK FOR GIVEN VALUES AND ASSIGN THEM TO 'A' ARRAY WHILE

    SETTING THEIR XXY()'S AND YYX()S TO ZERO

    REM THE ZERO VALUES OF XXY() AND YYX()SHOW THAT THE DIGIT HAS

    ALREADY BEEN USED

    FOR ROW% = 1 TO 6

    FOR COL% = 1 TO 6

    GOSUB 40 'CONVERT ROW, COL TO K

    X(K) = 0

    IF ZX(ROW%, COL%) = 0 THEN GOTO 67

  • 59

    X(K) = ZX(ROW%, COL%): XXY(ROW%, ZX(ROW%, COL%)) = 0: YYX(COL%,

    ZX(ROW%, COL%)) = 0

    67 NEXT COL%

    NEXT ROW%

    RETURN

    700 REM SUB TO CHECK FEASIBILITY OF X(K)

    GOSUB 35 'CONVERT K TO ROW%, COL%

    'PRINT: PRINT " K= "; K; " YYY$= "; YYY$(ROW%, COL%); " X(K)= "; X(K): INPUT "

    PRESS ENTER TO CONTINUE", YES

    UNIT$ = STR$(X(K)): UNIT$ = LTRIM$(UNIT$)

    IF INSTR(YYY$(ROW%, COL%), UNIT$) 0 THEN GOTO 799

    FLAG5 = 0

    799 RETURN

    10000 REM X(K) FEASIBILITY CHECK

    CLS: FLAG = 0

    FOR GRID% = 1 TO 6: XY$(GRID%) = "": YY$(GRID%) = "": XX$(GRID%) = "": NEXT

    GRID%

    XY$(1) = LTRIM$(STR$(X(1))) + LTRIM$(STR$(X(2))) + LTRIM$(STR$(X(3))) +

    LTRIM$(STR$(X(7))) + LTRIM$(STR$(X(8))) + LTRIM$(STR$(X(9)))

    XY$(2) = LTRIM$(STR$(X(4))) + LTRIM$(STR$(X(5))) + LTRIM$(STR$(X(6))) +

    LTRIM$(STR$(X(10))) + LTRIM$(STR$(X(11))) + LTRIM$(STR$(X(12)))

    XY$(3) = LTRIM$(STR$(X(13))) + LTRIM$(STR$(X(14))) + LTRIM$(STR$(X(15))) +

    LTRIM$(STR$(X(19))) + LTRIM$(STR$(X(20))) + LTRIM$(STR$(X(21)))

    XY$(4) = LTRIM$(STR$(X(16))) + LTRIM$(STR$(X(17))) + LTRIM$(STR$(X(18))) +

    LTRIM$(STR$(X(22))) + LTRIM$(STR$(X(23))) + LTRIM$(STR$(X(24)))

    XY$(5) = LTRIM$(STR$(X(25))) + LTRIM$(STR$(X(26))) + LTRIM$(STR$(X(27))) +

    LTRIM$(STR$(X(31))) + LTRIM$(STR$(X(32))) + LTRIM$(STR$(X(33)))

  • 60

    XY$(6) = LTRIM$(STR$(X(28))) + LTRIM$(STR$(X(29))) + LTRIM$(STR$(X(30))) +

    LTRIM$(STR$(X(34))) + LTRIM$(STR$(X(35))) + LTRIM$(STR$(X(36)))

    'FOR I = 1 TO 6

    'PRINT: 'PRINT " GRID= "; I; " XY$(I)= "; XY$(I)

    'NEXT I

    'INPUT " PRESS ENTER TO CONTINUE", YES

    FOR ROW% = 1 TO 6: XX$(ROW%) = "": NEXT ROW%

    FOR ROW% = 1 TO 6

    FOR COL% = 1 TO 6

    GOSUB 40 'CONVERT ROW% AND COL% TO K

    XL$ = STR$(X(K)): XL$ = LTRIM$(XL$)

    XX$(ROW%) = XX$(ROW%) + XL$

    NEXT COL%

    'PRINT " ROW%= "; ROW%; " ROW STRING= "; XX$(ROW%)

    NEXT ROW%

    'INPUT " PRESS ENTER TO CONTINUE", YES

    FOR COL% = 1 TO 6: YY$(COL%) = "": NEXT COL%

    FOR COL% = 1 TO 6

    FOR ROW% = 1 TO 6

    GOSUB 40

    XL$ = STR$(X(K)): XL$ = LTRIM$(XL$)

    YY$(COL%) = YY$(COL%) + XL$

    NEXT ROW%

    'PRINT " COL%= "; COL%; " COLUMN STRING= "; YY$(COL%)

    NEXT COL%

    'INPUT " PRESS ENTER TO CONTINUE", YES

  • 61

    REM X(K) FEASIBILITY CHECK

    FOR ROW% = 1 TO 6: FOR COL% = 1 TO 6: CT(ROW%, COL%) = 0: YYY$(ROW%,

    COL%) = "": NEXT COL%: NEXT ROW%

    FOR ROW% = 1 TO 6

    FOR COL% = 1 TO 6

    GOSUB 40 'CONVERT ROW, COL TO K

    IF ZX(ROW%, COL%) 0 THEN GOTO 3401

    FOR XL = 1 TO 6

    IF XXY(ROW%, XL) = 0 THEN GOTO 3400

    IF YYX(COL%, XL) = 0 THEN GOTO 3400

    302 IF ROW% = 1 OR ROW% = 2 THEN GOTO 303

    IF ROW% = 3 OR ROW% = 4 THEN GOTO 304

    IF ROW% = 5 OR ROW% = 6 THEN GOTO 305

    303 IF COL% >= 1 AND COL% = 4 AND COL% = 1 AND COL% = 4 AND COL%

  • 62

    305 IF COL% >= 1 AND COL% = 4 AND COL%

  • 63

    38 d = VAL(YYY$(ROW%, COL%)): ZX(ROW%, COL%) = d: XY(ROW%, d) = 0

    YX(COL%, d) = 0: FLAG = 1

    'PRINT: PRINT " NEW VAL FOR ROW= "; ROW%; " COL= "; COL%; " VAL= "; D

    'INPUT " PRESS ENTER TO CONTINUE", YES

    37 NEXT COL%

    NEXT ROW%

    3500 RETURN

    999 END

  • 64

    Bibliography

    Banbura, M. A. (2010, May). Maximum Likelihood Estimation of Factor Models on Data Sets

    with Arbitrary Pattern of Missing Data. Social Science Research Network , Retrieved

    Sept. 1, 2012 from SSRN Electronic Library (Working Paper Series No. 1189/May

    2010:http://ssrn.com/abstract_id=1598302. Retrieved from

    http://ssrn.com/abstract_id=1598302.

    Isaacs, R. (1953). Optimal Horse Race Bets. American Math Monthly, 60, No. 5, 310-315.

    Lashover, J. H. (2012, November 12). Monte Carlo Marching. Academia.edu and

    ResearchGate.net.

    Lashover, J. H. (2014, August 28). A Chemical Engineer Goes to the Horse Races. Retrieved

    from www.academia.edu and www.ResearchGate.com.