Sha256: 78a9410dd821b8473153ffda9e2f64b3ff422024c67159f58dd237b1f9ffed63
Contents?: true
Size: 1.28 KB
Versions: 3
Compression:
Stored size: 1.28 KB
Contents
require File.expand_path('../../lib/gov_kit-ca', __FILE__) desc "Picks the set cover for postal codes to electoral districts" task :set_cover, :file do |t,args| abort "Usage: rake #{t.name}[postal-code-for-districts.csv]" unless args[:file] # Get the electoral districts that each postal code covers postal_to_edid = {} File.read(args[:file]).split("\n").uniq.each do |postal_code| # Remove duplicate postal codes postal_to_edid[postal_code] = GovKit::CA::PostalCode.find_electoral_districts_by_postal_code(postal_code) end # Report how many electoral districts are covered. size = postal_to_edid.values.flatten.uniq.size if size < 308 puts "Postal codes cover #{size} electoral districts." end # Get the minimum number of postal codes to cover the electoral districts. # This is an instance of the set cover problem, which is NP-complete. Use the # greedy algorithm, which is the best-possible polynomial time approximation # algorithm for set cover. https://en.wikipedia.org/wiki/Set_cover_problem postal_codes = [] until postal_to_edid.empty? postal_code, edids = postal_to_edid.max{|_,v| v.size} postal_to_edid.each{|k,v| postal_to_edid[k] -= edids} postal_to_edid.reject!{|k,v| v.empty?} postal_codes << postal_code end puts postal_codes.sort end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
govkit-ca-0.0.16 | tasks/tasks.rb |
govkit-ca-0.0.15 | tasks/tasks.rb |
govkit-ca-0.0.14 | tasks/tasks.rb |