Yes so well for example the rankings can be defined in this way [{:name "P1" :skills {:control 3 :speed 3 :tackle 4 :dribbling 10 :shoot 4} :position :attack}
{:name "P2" :skills {:control 3 :speed 3 :tackle 4 :dribbling 10 :shoot 4} :position :attack}] and the list of players ["P1" "P2"] Assuming they are in two different files then calling lein run -r sample_rankings.edn -l sample_players.edn would produce the desired result. Well the input gets too big already for 12 players (I didn't wait it to finish but 12! is 39916800), while it still works in around 2 minutes for 2 players. The real alternative would be to do some dynamic programming but I was just hacking something together now and I'm sure even the brute force can still work quite well in theory.. 2015-10-05 13:30 GMT+01:00 Mark Engelberg <mark.engelb...@gmail.com>: > Sample input data would also be useful, including some examples that are too > large for you to currently solve with your existing approach. > > On Mon, Oct 5, 2015 at 4:36 AM, 'Alan Forrester' via Clojure > <clojure@googlegroups.com> wrote: >> >> On 5 Oct 2015, at 11:45, andrea crotti <andrea.crott...@gmail.com> wrote: >> >> > Hi everyone, >> > >> > I was trying for fun to solve the following problem: >> > >> > given a list of football players with some defined skills, find out >> > which >> > team selection would be balanced. >> > >> > For example given just 4 players A, B, C, D there would be the following >> > team selections: >> > >> > - (A, B) vs (C, D) >> > - (A, C) vs (B, D) >> > - (A, D) vs (B, C) >> > >> > So it's a combinatorial problem however both inside teams and inside the >> > selection the order does not count, so the number of possible teams >> > is a lot smaller than the actual all possible permutations. >> > >> > I came up with a brute force solution here: >> > >> > >> > https://github.com/AndreaCrotti/football/blob/master/src/cljc/football/engine.cljc#L75 >> > >> > which however explodes already for 12 players because: >> > >> > - it does all the possible permutations of teams (12! in that case) >> > - partition accordingly (using sets to remove duplicates) and evaluate >> > every single one of them >> > >> > Any idea how to make this faster? >> > Other advices on the code are welcome as well.. >> >> I find your code unclear. I can’t tell what problem you’re trying to solve >> by reading the code or the comments. Do you have a specification of what >> problem you’re trying to solve? If not, you should write one before you do >> anything else. >> >> Having said that, there is one way I can see that you might make the code >> slightly less bad. You define a field for your players called “:position” >> and then never use it. I know almost nothing about football, but I should >> think you might want the team to have at least one player in each position. >> So I might do something like (group-by :position players) >> >> https://clojuredocs.org/clojure.core/group-by. >> >> Then I might generate teams by picking one player in each position or >> something like that. This would reduce the number of combinations by some >> unknown amount. More generally, if you have too many combinations, introduce >> constraints in how you generate them. >> >> Alan >> >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clojure@googlegroups.com >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+unsubscr...@googlegroups.com >> 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 clojure+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. > > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with your > first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > 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 clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com 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 clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.