[#303658] Remove Parts of a String — Dan __ <major_general_joe@...>

Alright, this is probably a really simple question to answer, but I just

15 messages 2008/06/01

[#303876] deleting first line from a file — suresh <suresh.amritapuri@...>

Hi

16 messages 2008/06/03

[#303934] Module philosophy — "Leslie Viljoen" <leslieviljoen@...>

Sorry to beat a dead horse, but to confirm: the only way to mix a

12 messages 2008/06/04

[#303941] A complete guide for Ruby Progammers — Mc Mohd <mcmohd@...>

This tutorial gives you complete knowledge starting from basic to

23 messages 2008/06/04
[#303943] Re: A complete guide for Ruby Progammers — Davi Vidal <davividal@...> 2008/06/04

Em Wednesday 04 June 2008, Mc Mohd escreveu:

[#303945] Re: A complete guide for Ruby Progammers — Mc Mohd <mcmohd@...> 2008/06/04

Sorry pal missed to send URL. Its here:

[#303947] Re: A complete guide for Ruby Progammers — "Oscar Del Ben" <thehcdreamer@...> 2008/06/04

Thanks for your work ;)

[#303948] Re: A complete guide for Ruby Progammers — "Leslie Viljoen" <leslieviljoen@...> 2008/06/04

This tutorial looks strangely familiar!

[#303957] A crosspost from the Perl Community — Star Cross <starx@...>

All,

55 messages 2008/06/04
[#303983] Re: A crosspost from the Perl Community — David Masover <ninja@...> 2008/06/04

On Wednesday 04 June 2008 12:20:37 Star Cross wrote:

[#304212] Re: A crosspost from the Perl Community — Jenda Krynicky <jenda@...> 2008/06/06

David Masover wrote:

[#304303] Re: A crosspost from the Perl Community — David Masover <ninja@...> 2008/06/07

On Friday 06 June 2008 12:02:19 Jenda Krynicky wrote:

[#305043] Re: A crosspost from the Perl Community — Jenda Krynicky <jenda@...> 2008/06/13

David Masover wrote:

[#304075] Re: A crosspost from the Perl Community — Dave Bass <davebass@...> 2008/06/05

Coming to Ruby recently from Perl, these are my comments.

[#304084] Re: A crosspost from the Perl Community — "Eric Mahurin" <eric.mahurin@...> 2008/06/05

On Thu, Jun 5, 2008 at 10:00 AM, Dave Bass <davebass@musician.org> wrote:

[#304175] Re: A crosspost from the Perl Community — Dave Bass <davebass@...> 2008/06/06

Eric Mahurin wrote:

[#304217] Preferable Pairs (#165) — "Matthew Moss" <matthew.moss@...>

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

17 messages 2008/06/06

[#304230] Desktop multi-plataform ruby app — "Israel Guerra" <israel.guerra@...>

Hail everyone!

60 messages 2008/06/06
[#304237] Re: Desktop multi-plataform ruby app — Charles Oliver Nutter <charles.nutter@...> 2008/06/06

Israel Guerra wrote:

[#304241] Re: Desktop multi-plataform ruby app — James Britt <james.britt@...> 2008/06/06

Charles Oliver Nutter wrote:

[#304242] Re: Desktop multi-plataform ruby app — "Israel Guerra" <israel.guerra@...> 2008/06/06

But guys, maybe im wrong about jruby, but its a ruby interpreter running in

[#304271] Re: Desktop multi-plataform ruby app — "Victor Reyes" <victor.reyes@...> 2008/06/07

On Fri, Jun 6, 2008 at 4:15 PM, Charles Oliver Nutter <

[#304240] Re: Desktop multi-plataform ruby app — James Britt <james.britt@...> 2008/06/06

Israel Guerra wrote:

[#304309] Re: Desktop multi-plataform ruby app — Tom Cloyd <tomcloyd@...> 2008/06/07

James Britt wrote:

[#304284] using portions of other methods in a new method — Jason Lillywhite <jason.lillywhite@...>

How do you take a piece of a method and use it in another? Here is my

10 messages 2008/06/07

[#304353] Ruby wishlist — jzakiya <jzakiya@...>

You can do this:

23 messages 2008/06/08

[#304443] my first program just shuttin' down — Ruby Noob <john_@...>

Why? I tryin' to open the "hello.rb" program, but it just shuttin' down

12 messages 2008/06/08

[#304541] Ruby vs JRuby Performance — "Victor Reyes" <victor.reyes@...>

I knew that there was a penalty to be paid when running JRuby, but I did not

20 messages 2008/06/09

[#304623] Random Number Stuff — David Stanislaus <stanislaus_d@...>

How would you create a random number generator thats limited to a

17 messages 2008/06/10

[#304640] accessing class variables from the outside (beginner question) — progcat@...

I am still learning Ruby and I am trying to get something

12 messages 2008/06/10

[#304662] webby, ubuntu and gems — "Martin DeMello" <martindemello@...>

I've recently switched distributions to ubuntu, and I'm having

15 messages 2008/06/10

[#304728] Basic Tree Data Structure — Justin To <tekmc@...>

class Tree

14 messages 2008/06/10
[#304738] Re: Basic Tree Data Structure — Justin To <tekmc@...> 2008/06/10

class Tree

[#304790] Trie data structure — Justin To <tekmc@...>

I'm trying to implement a trie data structure for my parsing program

17 messages 2008/06/10
[#304826] Re: Trie data structure — Dave Bass <davebass@...> 2008/06/11

Justin To wrote:

[#304825] each with else — Thorsten Mler <thorsten@80beans.com>

Hi all,

11 messages 2008/06/11

[#304875] write byte array to file — "Rajesh Olafson" <rolafson@...>

Helo

16 messages 2008/06/11

[#304960] Help with Ruby under cygwin — James Byrne <byrnejb@...>

In order to use git on my laptop (MS XPproSP3) I ended up installing the

23 messages 2008/06/12

[#304992] a simple patch for the ri utility — Daniel Choi <dhchoi@...>

Hi everyone

15 messages 2008/06/12

[#305021] array to string conversion — Clement Ow <clement.ow@...>

Hi, I have 2 arrays(which is part of the hash):

13 messages 2008/06/13

[#305058] Circle Drawing (#166) — "Matthew Moss" <matthew.moss@...>

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

19 messages 2008/06/13

[#305100] Documenting Networking in Ruby. Any volunteer — "Victor Reyes" <victor.reyes@...>

Team,

10 messages 2008/06/13

[#305104] raise and rescue — Misiek Sz <nicpon@...>

Is is possible to raise an exception then rescue it and then go back to

13 messages 2008/06/13

[#305160] What was YOUR first Ruby Project — Eric Hegwer <ehegwer@...>

I though it be cool to hear what your first experience with Ruby was.

26 messages 2008/06/14

[#305227] why can't an instance instantiated within a class method access a protected instance method? — "Greg Hauptmann" <greg.hauptmann.ruby@...>

Hi,

10 messages 2008/06/15
[#305228] Re: why can't an instance instantiated within a class method access a protected instance method? — "Greg Hauptmann" <greg.hauptmann.ruby@...> 2008/06/15

(complete email)Hi,

[#305230] How !isset in Ruby — Alexey Tafintsev <alexey@...>

Hello people!

21 messages 2008/06/15
[#305238] Re: How !isset in Ruby — Martin Boese <boesemar@...> 2008/06/15

[#305241] Re: How !isset in Ruby — Robert Klemme <shortcutter@...> 2008/06/15

On 15.06.2008 14:37, Martin Boese wrote:

[#305268] little problem (google hiring puzzle) — ex <exeQtor@...>

Hi guys, I wonder if someone can find a pure ruby solution instead of

43 messages 2008/06/15

[#305334] How to Authenticate against the Windows NT Domain via Ruby — ChessMess <chessmess@...>

We are running a Rails application on Linux RedHat with a requirement

12 messages 2008/06/16

[#305377] print(true and true) #=> the parenthesis issue — hakunin <madfancier@...>

The parenthesis have been discussed before, but maybe this is another

31 messages 2008/06/17

[#305398] Can I find out the memory used by an object? — "Robert Hulme" <robert.hulme@...>

I'm 99% sure the answer to that question is no, but I thought I'd ask anyway :-)

15 messages 2008/06/17

[#305446] parsing text into usablle numerical data — Cthulhu __ <weedmasterp@...>

Hey total ruby n00b here...

13 messages 2008/06/17

[#305467] quick question about how array objects are handled — Chance Dinkins <chanceusc@...>

Btw, thanks in advance for any help - this community seems great!

11 messages 2008/06/17

[#305557] Rather validate values or use exceptions? — Joshua Muheim <forum@...>

Hi all

12 messages 2008/06/18

[#305605] Presentation on Ruby, require suggestions — "Srijayanth Sridhar" <srijayanth@...>

Hello,

14 messages 2008/06/19

[#305635] Why metaclasses? — "James Coglan" <jcoglan@...>

Hello all,

15 messages 2008/06/19

[#305727] Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — Urabe Shyouhei <shyouhei@...>

Hi all.

91 messages 2008/06/20
[#305893] Re: Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — Igal Koshevoy <igal@...> 2008/06/23

All versions of MRI Ruby that claim to fix the vulnerabilities are

[#305934] Re: Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — Hongli Lai <hongli@...> 2008/06/23

Hi guys. Igal invited me to join this discussion.

[#305936] Re: Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — Igal Koshevoy <igal@...> 2008/06/23

Hongli Lai wrote:

[#305943] Re: Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — Hongli Lai <hongli@...> 2008/06/23

Igal Koshevoy wrote:

[#305956] Re: Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — Igal Koshevoy <igal@...> 2008/06/23

Hongli Lai wrote:

[#306045] Re: Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — Igal Koshevoy <igal@...> 2008/06/24

We have another potential winning solution!

[#306072] Re: Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — Robert Thau <rst@...> 2008/06/24

Igal Koshevoy wrote:

[#306135] Re: Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — Igal Koshevoy <igal@...> 2008/06/24

Robert Thau wrote:

[#306137] Re: Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — "Dominic Sisneros" <dsisnero@...> 2008/06/25

Maybe you should try posting a issue on the new redmine bug tracker

[#306139] Re: Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — Igal Koshevoy <igal@...> 2008/06/25

Dominic Sisneros wrote:

[#306214] Re: Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — Jason Crystal <jcrystal@...> 2008/06/25

Just wanted to say that we all appreciate those fixes you guys have been

[#306516] Re: Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — Cheri Anaclerio <canaclerio@...> 2008/06/29

Could somebody please explain how to apply the Smartleaf Stanislav and

[#307002] Re: Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — Doug Alcorn <dougalcorn@...> 2008/07/02

Igal Koshevoy wrote:

[#305751] Regular expressions and long text — Guillermo.Acilu@...

Hello guys,

15 messages 2008/06/20

[#305810] Where does ruby excel? — Dolazy <francis.rammeloo@...>

I have only used ruby for writing little scripts. Things that are

14 messages 2008/06/21

[#305844] Initial release of amalgalite - v0.1.0 — Jeremy Hinegardner <jeremy@...>

Amalgalite embeds the SQLite database engine in a ruby extension.

13 messages 2008/06/21

[#305854] KABLAME! 0.2.1 Released — "Jacob Dunphy" <jacob.dunphy@...>

This is the first "announced release" of KABLAME!

13 messages 2008/06/22

[#305855] RubyGems 1.2.0 — Eric Hodel <drbrain@...7.net>

= Announce: RubyGems Release 1.2.0

49 messages 2008/06/22

[#305882] Is it ellegant to use a global variable to store a Logger object? — Iñaki Baz Castillo <ibc@...>

Hi, I use Logger class in a programm and since I need to log in lot of=20

49 messages 2008/06/22
[#305884] Re: Is it ellegant to use a global variable to store a Logger object? — Suraj Kurapati <snk@...> 2008/06/22

I単aki Baz Castillo wrote:

[#305885] Re: Is it ellegant to use a global variable to store a Logger object? — Iñaki Baz Castillo <ibc@...> 2008/06/22

El Lunes, 23 de Junio de 2008, Suraj Kurapati escribi=C3=B3:

[#305886] Re: Is it ellegant to use a global variable to store a Logger object? — Suraj Kurapati <snk@...> 2008/06/23

I単aki Baz Castillo wrote:

[#305888] Re: Is it ellegant to use a global variable to store a Logger object? — Iñaki Baz Castillo <ibc@...> 2008/06/23

El Lunes, 23 de Junio de 2008, Suraj Kurapati escribi=C3=B3:

[#306058] Re: Is it ellegant to use a global variable to store a Logger object? — Andrea Fazzi <andrea.fazzi@...> 2008/06/24

I単aki Baz Castillo ha scritto:

[#306066] Re: Is it ellegant to use a global variable to store a Logger object? — Iñaki Baz Castillo <ibc@...> 2008/06/24

El Martes, 24 de Junio de 2008, Andrea Fazzi escribi=C3=B3:

[#306161] Re: Is it ellegant to use a global variable to store a Logger object? — "Robert Klemme" <shortcutter@...> 2008/06/25

2008/6/24 I=F1aki Baz Castillo <ibc@aliax.net>:

[#306168] Re: Is it ellegant to use a global variable to store a Logger object? — "Robert Dober" <robert.dober@...> 2008/06/25

On Wed, Jun 25, 2008 at 11:22 AM, Robert Klemme

[#306176] Re: Is it ellegant to use a global variable to store a Logger object? — Andrea Fazzi <andrea.fazzi@...> 2008/06/25

Robert Dober ha scritto:

[#306180] Re: Is it ellegant to use a global variable to store a Logger object? — "Robert Dober" <robert.dober@...> 2008/06/25

On Wed, Jun 25, 2008 at 3:36 PM, Andrea Fazzi <andrea.fazzi@alca.le.it> wro=

[#306288] Re: Is it ellegant to use a global variable to store a Logger object? — "Shot (Piotr Szotkowski)" <shot@...> 2008/06/26

I=C3=B1aki Baz Castillo:

[#306351] Re: Is it ellegant to use a global variable to store a Logger object? — Iñaki Baz Castillo <ibc@...> 2008/06/26

El Jueves, 26 de Junio de 2008, Shot (Piotr Szotkowski) escribi=C3=B3:

[#306387] Re: Is it ellegant to use a global variable to store a Logger object? — "Shot (Piotr Szotkowski)" <shot@...> 2008/06/27

I=C3=B1aki Baz Castillo:

[#306416] Re: Is it ellegant to use a global variable to store a Logger object? — Iñaki Baz Castillo <ibc@...> 2008/06/27

El Viernes, 27 de Junio de 2008, Shot (Piotr Szotkowski) escribi=C3=B3:

[#306499] Re: Is it ellegant to use a global variable to store a Logger object? — "Shot (Piotr Szotkowski)" <shot@...> 2008/06/28

I=C3=B1aki Baz Castillo:

[#306501] Re: Is it ellegant to use a global variable to store a Logger object? — "ara.t.howard" <ara.t.howard@...> 2008/06/28

[#306085] Sequel primary keys — "Glen Holcomb" <damnbigman@...>

I posted to the Sequel Google Group but it's horribly slow, assuming it took

16 messages 2008/06/24

[#306088] Performance improvement possible? — Philip Rhoades <phil@...>

People,

35 messages 2008/06/24
[#306095] Re: Performance improvement possible? — Rob Biedenharn <Rob@...> 2008/06/24

On Jun 24, 2008, at 12:23 PM, Philip Rhoades wrote:

[#306225] Re: Performance improvement possible? — Philip Rhoades <phil@...> 2008/06/25

Rob,

[#306237] Re: Performance improvement possible? — Chuck Remes <cremes.devlist@...> 2008/06/26

[#306243] Re: Performance improvement possible? — Philip Rhoades <phil@...> 2008/06/26

Chuck,

[#306255] Re: Performance improvement possible? — Rob Biedenharn <Rob@...> 2008/06/26

On Jun 25, 2008, at 8:44 PM, Philip Rhoades wrote:

[#306333] Re: Performance improvement possible? — Eleanor McHugh <eleanor@...> 2008/06/26

On 26 Jun 2008, at 04:24, Rob Biedenharn wrote:

[#306345] Re: Performance improvement possible? — Philip Rhoades <phil@...> 2008/06/26

Eleanor,

[#306350] Re: Performance improvement possible? — Eleanor McHugh <eleanor@...> 2008/06/26

On 26 Jun 2008, at 20:47, Philip Rhoades wrote:

[#306357] Re: Performance improvement possible? — Philip Rhoades <phil@...> 2008/06/26

Ellie,

[#306368] Re: Performance improvement possible? — Eleanor McHugh <eleanor@...> 2008/06/27

On 26 Jun 2008, at 22:51, Philip Rhoades wrote:

[#306234] A cleaner way to pass a block or proc — "Tristin Davis" <tristin.colby@...>

Is there a cleaner way to implement my add_notifier method?

15 messages 2008/06/25
[#306236] Re: A cleaner way to pass a block or proc — Ben Bleything <ben@...> 2008/06/26

On Thu, Jun 26, 2008, Tristin Davis wrote:

[#306245] Re: A cleaner way to pass a block or proc — "Tristin Davis" <tristin.colby@...> 2008/06/26

Thanks Ben. That worked perfect. No other changes required in the class. :)

[#306331] question about defined? and y — Ruby Freak <twscannell@...>

The defined? keyword seems to have some funky behaviors.

19 messages 2008/06/26

[#306420] Statistician I (#167) — "Matthew Moss" <matthew.moss@...>

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

13 messages 2008/06/27

[#306448] changing the shebang of ruby files best way ? — unbewusst.sein@... (Une B騅ue)

I've a lot of ruby files (grabed from net) having a wrong shebang for my

18 messages 2008/06/27
[#306505] Re: changing the shebang of ruby files best way ? — Ryan Davis <ryand-ruby@...> 2008/06/28

[#306524] Random Generation of Characters — Tj Superfly <nonstickglue@...>

How could you generate a list of all possible combination's of lowercase

12 messages 2008/06/29

[#306533] mysterious memory corruption, very confused — Seebs <usenet-nospam@...>

ruby 1.8.7-p22, OS X 10.4.mumble, PostgreSQL 8.3.1, ruby-pg 2008-03-18.

11 messages 2008/06/29

[#306547] Recursive Logic - Examples and Resources? — Dan __ <major_general_joe@...>

Hey all,

13 messages 2008/06/29

[#306620] Threads and Ruby — barjunk <barjunk@...>

I've been hunting around for information regarding threads, and to me,

35 messages 2008/06/30
[#306621] Re: Threads and Ruby — "ara.t.howard" <ara.t.howard@...> 2008/06/30

[#306701] nested methods good or bad design — John Maclean <jayeola@...>

=begin

15 messages 2008/06/30

[#306728] how to - quickly make permutations? — Max Williams <toastkid.williams@...>

can anyone provide an elegant implementation for this method?

18 messages 2008/06/30
[#306761] Re: how to - quickly make permutations? — Frederick Cheung <frederick.cheung@...> 2008/06/30

[#306778] Re: how to - quickly make permutations? — "jim finucane" <jimrails@...> 2008/07/01

each new element tries to double the size of the list

[SUMMARY] Preferable Pairs (#165)

From: "Matthew Moss" <matthew.moss@...>
Date: 2008-06-12 21:06:31 UTC
List: ruby-talk #305002
Apologies for being a little late today... Took a little bit to understand
some of what was going on in the solutions for the Preferable Pairs quiz,
and I'm not certain I explained it well enough, but...  here it is.


This "Preferable Pairs" quiz is, as was noted, very similar to the [Stable
Roommates][1] problem, though the goal as originally stated is slightly
different from the typical presentation of the Stable Roommates problem.
Still, the minor goal difference does not change that this is an
[NP-complete][2] problem, and as such, large input sets would require some
sort of approximation, heuristics or other techniques to keep the run time
reasonable.

Fortunately, I had no intention of testing the solutions provided on large
sets. My test involved a set of 20 people, to be grouped into 10 pairs
according to their preferences. Here are the results of my test on the
solutions provided.

    Solution          Time      Score
    Andrea Fazzi      0.159     438
    Dustin Barker     0.020     589
    Eric Ivancich     4.671     311
    Steven Hahn       -DNF-
    Eric Mahurin      0.211     311
    Matthew Moss      0.022     589
    Thomas ML         0.114     311

I neglected to post my own solution, but it's nearly identical to Dustin's
both in algorithm, results and performance (but mine is much uglier). Also,
apologies to Steven... I tried to wait, really I did, but it just kept
going, and going...

Andrea, Dustin and myself made straightforward attempts that were fast but
not optimal. While the numbers presented above don't show a huge disparity
in performance, I suspect that would be a different story if we were
attempting to solve larger datasets, of thousands of people as opposed to
twenty. For the tested dataset, I believe there might be a few grumbling
people, forced to play with someone they didn't like very much, but the
tournament would go on.

Eric Ivancich provided a genetic algorithm that is notably slower (at this
sample size), and isn't guaranteed to get the most optimal answer, but it
happened to do so here. It would be interesting to compare its performance
against the optimal solution algorithms for larger data sets.

Eric Mahurin and Thomas ML provided algorithms that find the optimal
solution. There is a fair bit of setup code in both to get the data into a
convenient form for the optimization algorithm to work. I'm going to skip
over that and jump right into Thomas' `optimize` method. As input to
`optimize`, the `pairings` argument looks like this for the sample data:

    [
      [["David", "Helen"], 0],
      [["David", "Vicki"], 1],
      [["Helen", "Vicki"], 2],
      [["Joseph", "Vicki"], 4],
      [["Helen", "Joseph"], 5],
      [["David", "Joseph"], 8]
    ]

Basically, the input is an ordered list of all pairs with the corresponding
score (as calculated according to the metric as described by the quiz). It
is a combined score, and reflects the preferences of both people in the
pair. For example, the pair of Helen and Joseph has a score of 5, because
Helen scores Joseph as 4, while Joseph scores Helen as 1: so, 4 + 1 == 5.

Before we conquer the whole of the algorithm, let's look at a simplified
version of `optimize` to get a feel for the general structure. The input
here (for argument `pairings`) is similar to the above, but without the
scores.

    def optimize(pairings, names, pos, posmax)
        bestpairs = nil
        while pos < posmax
            pair = pairings[pos]
            pos += 1
            if names & pair == pair
                names1 = names - pair
                if names1.size < 2
                    bestpairs = [pair]
                    bestpairs << names1 unless names1.empty?
                    return bestpairs
                elsif (rv = optimize(pairings, names1, pos, posmax)
                    bestpairs = rv
                    bestpairs << pair
                end
            end
        end
        return bestpairs
    end

`bestpairs` starts off empty, but by the end should be an array of pairs
chosen as the solution. Each iteration of the loop grabs the next pair from
`pairings` and checks to see if it is still usable by set intersection:

            if names & pair == pair

`names` will contain the names of people still available; that is, those
that have not already been chosen previously. The `&` operator treats the
two arrays as sets and performs set intersections. If the result of
intersection is equal to one of the arguments, that argument must be a
subset of the other, and in this context, is safe to choose for the
solution.

When a pair is chosen, those names are removed by Array difference (not
quite the same as set difference, but close enough for this case). So it is
with:

              names1 = names - pair

That we remove the chosen pair from the list of remaining people. If that is
the last possible pair to be made (there are fewer than 2 names remaining),
we finish up by setting and returning the `bestpairs` array

                    bestpairs = [pair]
                    bestpairs << names1 unless names1.empty?
                    return bestpairs

In the case that there is at least one more pair remaining, we continue onto
the recursive part of this solution:

                elsif (rv = optimize(pairings, names1, pos, posmax)
                    bestpairs = rv
                    bestpairs << pair

We know that `bestpairs`, as returned by the recursive call to `optimize`,
contains the best pairs from the subset of `names1`, which we got above
after removing `pair`. So we make sure to concatenate `pair` onto
`bestpairs` before it is returned to the caller.

As simplified, this amounts to a greedy algorithm, since the pairs were
initially sorted according to score, and the simplified algorithm, at each
level, simply takes the first pair possible.

Now let's go back to the complete `optimize` method.

    def optimize(pairings, names, pos, posmax, maxweight=nil)
        bestpairs = nil
        maxweight ||= pairings.size ** 2 + 1
        while pos < posmax
            pair, weight1 = pairings[pos]
            break unless weight1 * (names.size / 2).floor < maxweight
            pos += 1
            if names & pair == pair
                names1 = names - pair
                if names1.size < 2
                    bestpairs = [pair]
                    bestpairs << names1 unless names1.empty?
                    return [weight1, bestpairs]
                elsif (rv = optimize(pairings, names1, pos, posmax,
maxweight - weight1))
                    maxweight, bestpairs = rv
                    maxweight += weight1
                    bestpairs << pair
                end
            end
        end
        return bestpairs && [maxweight, bestpairs]
    end

The algorithm structure is basically the same: recursive, greedily selecting
pairs and removing those names from the set of names available... The major
difference here is the inclusion of the weights (i.e. scores) and possible
rejection of pairs with respect to those weights.

As recursive calls to `optimize` are made, the `maxweight` value is updated
via this code:

                    maxweight, bestpairs = rv
                    maxweight += weight1

and checked via this code:

            break unless weight1 * (names.size / 2).floor < maxweight

So a pair may be skipped if it's weight (scaled by the number of names)
exceeds the current maxweight, determined the the current set of choices.

When a possible solution is found, the `maxweight` variable represents the
total score for that solution. But the algorithm does not stop immediately;
it keeps checking pairs and solutions of pairs, rejecting those solutions
and partial solutions whose total score (i.e. `maxweight`) would exceed that
previously known `maxweight`.

In the end, the solution reported is the collection of pairs with the lowest
total score, and is returned via the original invocation of `optimize`.

[1]: http://en.wikipedia.org/wiki/Stable_roommates_problem
[2]: http://en.wikipedia.org/wiki/Np_complete



-- 

Matthew Moss <matthew.moss@gmail.com>

In This Thread

Prev Next