Download - Solving Sudoku Using Monte Carlo Marching
-
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.