 
 
 
 
 
 
RE: Need a algorithm
- To: mathgroup at smc.vnet.net
- Subject: [mg33894] RE: [mg33857] Need a algorithm
- From: "DrBob" <majort at cox-internet.com>
- Date: Sun, 21 Apr 2002 06:14:36 -0400 (EDT)
- Reply-to: <drbob at bigfoot.com>
- Sender: owner-wri-mathgroup at wolfram.com
Here's code that finds a good (but perhaps not optimal) solution (again,
if I've understood the problem statement).  It's a "greedy" algorithm
that selects tickets in turn.  It looks at all possible lottery draws
and selects one with minimal match with tickets already bought; that
draw is the next ticket bought.
 
q={8,11,13,14,16,22,23,28,31,32,34,35};
s=KSubsets[q,7];
minMatch:=Module[{t,m},
    t=Outer[Intersection,s,tickets,1];
    m=Min[Max[Length/@#]&/@t]
    ]
maxMatch[s_List]:=Max[Length/@(#\[Intersection]s&/@tick)]
buyNext:=Module[{t},
    t=maxMatch/@s;
    Flatten[s[[First[Position[t,Min[t]]]]]]
    ]
k=5;
tickets={Take[q,7]}
While[minMatch<k,
    AppendTo[tickets,buyNext]
    ];
tickets
 
For k=2, the result is {{8,11,13,14,16,22,23}}.
For k=3 and 4, the result is
{{8,11,13,14,16,22,23},{8,11,28,31,32,34,35}}
For k=5, the result is 10 tickets:
{{8,11,13,14,16,22,23},{8,11,28,31,32,34,35},{8,13,14,16,28,31,32},
{8,13,14,22,28,34,35},{8,13,16,23,31,34,35},{8,14,22,23,31,32,34},
{8,16,22,23,28,32,35},{11,13,14,16,32,34,35},{11,13,14,23,28,31,34},
{11,13,16,22,28,31,35}}
For k=6, the result is 63 tickets.
 
On my 2.2 GHz Pentium 4, this code took 28 seconds for k=6, but less
than one second for k=5.
 
A much more efficient code is:
 
ClearAll[maxMatch,minMatch,buyNext]
maxMatch[s_List]:=maxMatch[s]=Max[Length/@(#\[Intersection]s&/@tickets)]
buyNext:=Module[{nxt},
    nxt=Flatten[s[[First[Position[t,Min[t]]]]]];
    t=MapIndexed[Max[#1,Length[First[s[[#2]]]\[Intersection]nxt]]&,t];
    minMatch=Min[t];
    AppendTo[tickets,nxt]
    ]
 
tickets={};
minMatch=0;
s=KSubsets[q,7];
t=0&/@s;
k=6;
Timing[
  While[minMatch<k,
      buyNext
      ];
  ]
tickets//Dimensions
 
This code solved for k=6 in 1 second and k=7 in 13 seconds.  It prevails
because unnecessary Outer products are eliminated, and intersections of
subsets of q with tickets already bought are eliminated.
 
Bobby Treat

