Anyway, the thing works fine. In the abbreviated example here with 18 lines, to find the sum of 26978865,the answer is lines 1,9 and 18. This is still 262,000-odd combinations, and I chose it so that it finishes in just a short while. But beyond 22 lines, LC stalls and the handler quits. I wrote on the use-list:
Houston, we have an issue with LC.
I used the "combinatorial" function in the "MasterLibrary" for the 26 lines in the list, but the process was too slow. I made a kluge, so that a shorter call to that function was then processed by an even more brute-force routine. It works fine, but it also does not work.
LC stalls if the number of elements is greater than 22. I assume this is some sort of memory issue, unless LC just gets bored with the whole thing.
The following handlers pull an arbitrary value to test, and the gadget does indeed find the appropriate components.
Code: Select all
on mouseUp --FIELD 1 HAS THE LIST OF POPULATIONS --1,9,18 ARE AN ARBITRARY TARGET SUM -- THIS IS A SHORTER TEST FOR 18 LINES TO PROVE CONCEPT, AND FINISH IN A SHORT TIME get line 1 of fld 1 & "," & line 9 of fld 1 & "," & line 18 of fld 1 put sum(it) into magicNumber --29335150 put fld 1 into tList put combinatorial(12) into accum repeat with y = 13 to 18 --FAILS WITH A VALUE OF 26, THE ACTUAL NUMBER OF LINES IN THE LIST put accum into tempAccum repeat for each line tLine in tempAccum put tLine & comma & y & return after finalAccum end repeat put accum & return & finalAccum into accum put y after accum put "" into finalAccum end repeat repeat for each line tLine in accum repeat for each item tItem in tLine put line tItem of tList & "," after temp end repeat if sum(temp) = magicNumber then answer tLine exit to top else put "" into temp end if end repeat end mouseUp function combinatorial n put the cursor into tCursor put 1 into tCursorCtr if n >= 15 then -- make sure you know what you're in for! answer n && "objects will result in" && (2^15 -1) && "subsets" with "Continue" or "Cancel" if it is "Cancel" then exit to top end if put 1 into subsetsVar -- initialize variable repeat until x = n -- this repeats (2^n - 2) times, which is one less than the numer of possible subsets Add 1 to tCursorCtr if tCursorCtr > 5000 then set the cursor to busy put 0 into tCursorCtr end if put the last line in subsetsVar into x -- each subset is used as input to compute the next subset put the number of items in x into noItems if item noItems of x = n then add 1 to item (noItems -1) of x -- increment 2nd to last item if last item = n delete the last item of x -- get rid of last item if it = n put return & x after subsetsVar -- add another subset to list of subsets else put ((item noItems of x) + 1) into item (noItems + 1) of x -- increment last item put return & x after subsetsVar -- add another subset to list of subsets end if end repeat set the cursor to tCursor return subsetsVar -- return the list of all possible subsets end combinatorial
I did not try this with an array, first to see if it is faster, but also to see if it can handle the larger list. Anyone have any insight?