Reading the thread: generate al possible teams
<https://groups.google.com/forum/#!searchin/clojure/generate$20all$20possible$20teams/clojure/DeCBCD_dwRo/OyjJPgHXCAAJ>,
I realized I was facing a slightly similar problem. Although many valuable
suggestions were made, I'm very interested in one made
<https://groups.google.com/d/msg/clojure/DeCBCD_dwRo/nw4aW4zwCAAJ> by puzzler,
i.e. using loco (unless another method/library is more useful, suggestions
are welcome).
Now, the problem description:
1/ I have a set of players which must be divided in teams of two. If only
teams of two is not possible, teams of three are allowed as well.
2/ Every player has a set of characteristics. Based on these
characteristics, some teams are not allowed, some are, and some are
prefered.
There are quite a few characteristics, so I'll build up the first few:
1/ The main characteristic is 'level', ranging from 0-7. Only teams of two
with total level of 5 or more are allowed.
For teams of three, there are separate rules: there must be at least one
level 3. If the highest level is 3, than no two levels 1 or less are
allowed.
2/ There is a characteristic 'experience' as well. Taking into account the
exprience, there are more exceptions:
A level 3 and a level 1 is allowed (in contrast to rule 1: total should be
at least 5), if the experience of level 1 is high enough
A level 4 and a level 1 are not allowed together, if the experience of
level 1 is not high enough
Two levels 2 are allowed, if both are experienced enough
So far, it's still pretty easy to find a solution: rank according to level
and experience, and take each time the top and bottom from the list. That
should be pretty close to the most optimal solution. But there are more
characteristics for each player:
3/ There are preferences to put some players together, scored from 1 (avoid
teaming them) to 7 (high preference to team them). Based on these
preferences, 'team preferences' might be calculated. If no 'preference' is
given, a value of 4 is assumed. In this example, I scored them per player,
but it might be done per team as well.
4/ Some players might have a 'handicap', so they need another levels to
team with. If possible, the handicaps should be used, but they may be
omitted if there is no other solution. In an extended version, a preference
level for a handicap for a certain player may be set as well.
There are quite a few of handicaps (like 4) and rules (like 1 and 2, which
are just a small subset of all handicaps and rules.
The number of players will not be very high, up to max 100, so max 50
teams, which might be important, since I don't think heuristics will have a
high benefit in this case (but I might be wrong).
An example:
The players:
P1 {:level 0 :experience 0}
P2 {:level 2 :experience 17}
P3 {:level 3 :experience 23 :handicap :cl }
P4 {:level 3 :experience 27 :preference {P2 2, P3 6}}
P5 {:level 6 :experience 50}
P6 {:level 5 :experience 55 :preference {P2 1}}
The handicap description: {:cl :needs-level 5}
The solution?
(solve [P1 P2 P3 P4 P5 P6])
results in a set with possible solutions (possibly with some timeout or
after the first x solutions are found):
#{
{ [ [P6 P1] [P5 P2] [P4 P3] ]
:unmatched-handicaps 1
:team-preferences [4 4] [4 4] [4 6] }
{ [ [P5 P1] [P6 P2] [P4 P3] ]
:unmatched-handicaps 1
:team-preferences [4 4] [1 4] [4 6] }
{ [ [P5 P3] [P6 P1] [P4 P2] ]
:unmatched-handicaps 0
:team-preferences [4 4] [4 4] [2 4] }
... }
Since puzzler said 'I can provide an example of that if you are interested'
(for generating 'balanced teams' with restrictions with loco)... I'm
interested :).
Thanks.
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.