Add files via upload
This commit is contained in:
parent
ba15b69140
commit
905dca4158
@ -20,7 +20,7 @@
|
||||
"\n",
|
||||
"Let's start by clarifying some concepts:\n",
|
||||
"- **State**: denoted by the standard 2-letter abbreviations like `'CA'` (plus `'UP'` and `'LP'` for the Michigan peninsulas). \n",
|
||||
"- **States**: a set of states; implemented as a (hashable) `frozenset`. I'll use `states('OR CA')` for `frozenset({'OR', 'CA'})`.\n",
|
||||
"- **States**: a set of states; implemented as a (hashable) `frozenset`. I can use `states('OR CA')`.\n",
|
||||
"- **Region**: a set of states that are **contiguous**—they are all connected by a single tree of **neighbor** relations.\n",
|
||||
"- **Neighbor**: a relation saying two states share a border. Implemented as [adjacency sets](https://en.wikipedia.org/wiki/Adjacency_list) in the dict `neighbors`.\n",
|
||||
"- **Cut**: a set of states that, when removed from the map, cuts the map into disjoint regions. \n",
|
||||
@ -52,7 +52,7 @@
|
||||
"def statedict(**dic) -> dict: \"{State:States}\"; return {s: states(dic[s]) for s in dic}\n",
|
||||
"def area(states) -> int: \"Total area\"; return sum(areas[s] for s in states)\n",
|
||||
"\n",
|
||||
"neighbors = statedict( # https://theincidentaleconomist.com/wordpress/list-of-neighboring-states-with-stata-code/\n",
|
||||
"neighbors = statedict(\n",
|
||||
" AK='', AL='FL GA MS TN', AR='LA MO MS OK TN TX', AZ='CA CO NM NV UT', CA='AZ NV OR', \n",
|
||||
" CO='AZ KS NE NM OK UT WY', CT='MA NY RI', DC='MD VA', DE='MD NJ PA', FL='AL GA', \n",
|
||||
" GA='AL FL NC SC TN', HI='', IA='IL MN MO NE SD WI', ID='MT NV OR UT WA WY', IL='IA IN KY MO WI', \n",
|
||||
@ -67,7 +67,7 @@
|
||||
" UP='WI', LP='IN OH')\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"areas = dict( # https://www.census.gov/geographies/reference-files/2010/geo/state-area.html\n",
|
||||
"areas = dict(\n",
|
||||
" AK=665384, AL=52420, AZ=113990, AR=53179, CA=163695, CO=104094, CT=5543, DE=2489, DC=68, \n",
|
||||
" FL=65758, GA=59425, HI=10932, ID=83569, IL=57914, IN=36420, IA=56273, KS=82278, KY=40408, \n",
|
||||
" LA=52378, ME=35380, MD=12406, MA=10554, MI=96714, MN=86936, MS=48432, MO=69707, MT=147040, \n",
|
||||
@ -83,9 +83,9 @@
|
||||
"border = north | south | west | east\n",
|
||||
"\n",
|
||||
"# \"Countries\":\n",
|
||||
"usa = States(areas) # States plus {UP, LP, DC}\n",
|
||||
"usa = States(areas) # 50 states plus UP, LP, DC\n",
|
||||
"usa50 = usa - states('DC UP LP') # 50 actual US states\n",
|
||||
"usa48 = usa50 - states('AK HI') # 48 continental states\n",
|
||||
"usa48 = usa50 - states('AK HI') # 48 contiguous states\n",
|
||||
"usa49 = usa - states('DC AK HI MI') # 49 \"states\": MI split into UP, LP\n",
|
||||
"western = states('WA OR CA ID NV UT AZ MT WY CO NM') # The 11 states west of the Rockies"
|
||||
]
|
||||
@ -147,12 +147,12 @@
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{frozenset({'ID', 'NM', 'UT'}),\n",
|
||||
" frozenset({'AZ', 'ID', 'NV'}),\n",
|
||||
" frozenset({'AZ', 'ID', 'UT'}),\n",
|
||||
"{frozenset({'CA', 'ID', 'OR'}),\n",
|
||||
" frozenset({'CA', 'OR', 'WA'}),\n",
|
||||
" frozenset({'AZ', 'ID', 'NV'}),\n",
|
||||
" frozenset({'ID', 'NM', 'UT'}),\n",
|
||||
" frozenset({'CA', 'ID', 'NV'}),\n",
|
||||
" frozenset({'CA', 'ID', 'OR'})}"
|
||||
" frozenset({'AZ', 'ID', 'UT'})}"
|
||||
]
|
||||
},
|
||||
"execution_count": 3,
|
||||
@ -244,12 +244,12 @@
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[frozenset({'AZ', 'ID', 'UT'}),\n",
|
||||
" frozenset({'ID', 'NM', 'UT'}),\n",
|
||||
"[frozenset({'CA', 'ID', 'OR'}),\n",
|
||||
" frozenset({'AZ', 'ID', 'NV'}),\n",
|
||||
" frozenset({'ID', 'NM', 'UT'}),\n",
|
||||
" frozenset({'CA', 'ID', 'NV'}),\n",
|
||||
" frozenset({'CA', 'ID', 'OR'}),\n",
|
||||
" frozenset({'CA', 'OR', 'WA'})]"
|
||||
" frozenset({'CA', 'OR', 'WA'}),\n",
|
||||
" frozenset({'AZ', 'ID', 'UT'})]"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
@ -269,18 +269,18 @@
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[(frozenset({'CO', 'MT', 'NM', 'WY'}),\n",
|
||||
" frozenset({'CA', 'NV', 'OR', 'WA'}),\n",
|
||||
" frozenset({'AZ', 'ID', 'UT'})),\n",
|
||||
"[(frozenset({'AZ', 'CO', 'MT', 'NM', 'NV', 'UT', 'WY'}),\n",
|
||||
" frozenset({'WA'}),\n",
|
||||
" frozenset({'CA', 'ID', 'OR'})),\n",
|
||||
" (frozenset({'CO', 'MT', 'NM', 'UT', 'WY'}),\n",
|
||||
" frozenset({'CA', 'OR', 'WA'}),\n",
|
||||
" frozenset({'AZ', 'ID', 'NV'})),\n",
|
||||
" (frozenset({'AZ', 'CO', 'MT', 'NM', 'UT', 'WY'}),\n",
|
||||
" frozenset({'OR', 'WA'}),\n",
|
||||
" frozenset({'CA', 'ID', 'NV'})),\n",
|
||||
" (frozenset({'AZ', 'CO', 'MT', 'NM', 'NV', 'UT', 'WY'}),\n",
|
||||
" frozenset({'WA'}),\n",
|
||||
" frozenset({'CA', 'ID', 'OR'}))]"
|
||||
" (frozenset({'CO', 'MT', 'NM', 'WY'}),\n",
|
||||
" frozenset({'CA', 'NV', 'OR', 'WA'}),\n",
|
||||
" frozenset({'AZ', 'ID', 'UT'}))]"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
@ -326,7 +326,7 @@
|
||||
" The ∆ row of the table is not a region; it is the difference in area between A and B.\"\"\"\n",
|
||||
" A, B, C = split\n",
|
||||
" def print_row(name, region, sqmi): \n",
|
||||
" statelist = f'{len(region):2d}|{{{\",\".join(sorted(region))}}}' if region else ''\n",
|
||||
" statelist = f'{len(region):2d}|{\" \".join(sorted(region))}' if region else ''\n",
|
||||
" print(f'{name}|{sqmi:9,d}|{sqmi/area(country):7.3%}|{statelist}')\n",
|
||||
" print(f'\\n{title}:')\n",
|
||||
" print_row('A', A, area(A))\n",
|
||||
@ -347,15 +347,15 @@
|
||||
"49 states ⇒ 41,700 cuts (size ≤ 8, area ≤ 624,072) ⇒ 13,146 splits.\n",
|
||||
"\n",
|
||||
"1. Split that maximizes area(B):\n",
|
||||
"A|1,345,558|43.122%|29|{AL,AR,CT,DE,FL,GA,IN,KS,KY,LA,LP,MA,MD,ME,MS,NC,NH,NJ,NY,OH,OK,PA,RI,SC,TN,TX,VA,VT,WV}\n",
|
||||
"B|1,344,149|43.077%|15|{AZ,CA,IA,ID,MN,MT,ND,NV,OR,SD,UP,UT,WA,WI,WY}\n",
|
||||
"C| 430,653|13.801%| 5|{CO,IL,MO,NE,NM}\n",
|
||||
"A|1,345,558|43.122%|29|AL AR CT DE FL GA IN KS KY LA LP MA MD ME MS NC NH NJ NY OH OK PA RI SC TN TX VA VT WV\n",
|
||||
"B|1,344,149|43.077%|15|AZ CA IA ID MN MT ND NV OR SD UP UT WA WI WY\n",
|
||||
"C| 430,653|13.801%| 5|CO IL MO NE NM\n",
|
||||
"∆| 1,409| 0.045%|\n",
|
||||
"\n",
|
||||
"2. Split that minimizes ∆ = area(A) - area(B):\n",
|
||||
"A|1,267,033|40.605%|14|{AZ,CA,IA,ID,MN,MT,ND,NV,OR,UP,UT,WA,WI,WY}\n",
|
||||
"B|1,266,994|40.604%|27|{AL,AR,CT,DE,FL,GA,KS,KY,LA,LP,MA,MD,ME,MS,NC,NH,NJ,NY,OH,OK,PA,RI,SC,TX,VA,VT,WV}\n",
|
||||
"C| 586,333|18.791%| 8|{CO,IL,IN,MO,NE,NM,SD,TN}\n",
|
||||
"A|1,267,033|40.605%|14|AZ CA IA ID MN MT ND NV OR UP UT WA WI WY\n",
|
||||
"B|1,266,994|40.604%|27|AL AR CT DE FL GA KS KY LA LP MA MD ME MS NC NH NJ NY OH OK PA RI SC TX VA VT WV\n",
|
||||
"C| 586,333|18.791%| 8|CO IL IN MO NE NM SD TN\n",
|
||||
"∆| 39| 0.001%|\n"
|
||||
]
|
||||
}
|
||||
@ -424,18 +424,18 @@
|
||||
"49 states ⇒ 547,779 cuts (size ≤ 49, area ≤ 432,062) ⇒ 42,685 splits.\n",
|
||||
"\n",
|
||||
"1. Split that maximizes area(B):\n",
|
||||
"A|1,345,558|43.122%|29|{AL,AR,CT,DE,FL,GA,IN,KS,KY,LA,LP,MA,MD,ME,MS,NC,NH,NJ,NY,OH,OK,PA,RI,SC,TN,TX,VA,VT,WV}\n",
|
||||
"B|1,344,149|43.077%|15|{AZ,CA,IA,ID,MN,MT,ND,NV,OR,SD,UP,UT,WA,WI,WY}\n",
|
||||
"C| 430,653|13.801%| 5|{CO,IL,MO,NE,NM}\n",
|
||||
"A|1,345,558|43.122%|29|AL AR CT DE FL GA IN KS KY LA LP MA MD ME MS NC NH NJ NY OH OK PA RI SC TN TX VA VT WV\n",
|
||||
"B|1,344,149|43.077%|15|AZ CA IA ID MN MT ND NV OR SD UP UT WA WI WY\n",
|
||||
"C| 430,653|13.801%| 5|CO IL MO NE NM\n",
|
||||
"∆| 1,409| 0.045%|\n",
|
||||
"\n",
|
||||
"2. Split that minimizes ∆ = area(A) - area(B):\n",
|
||||
"A|1,345,558|43.122%|29|{AL,AR,CT,DE,FL,GA,IN,KS,KY,LA,LP,MA,MD,ME,MS,NC,NH,NJ,NY,OH,OK,PA,RI,SC,TN,TX,VA,VT,WV}\n",
|
||||
"B|1,344,149|43.077%|15|{AZ,CA,IA,ID,MN,MT,ND,NV,OR,SD,UP,UT,WA,WI,WY}\n",
|
||||
"C| 430,653|13.801%| 5|{CO,IL,MO,NE,NM}\n",
|
||||
"A|1,345,558|43.122%|29|AL AR CT DE FL GA IN KS KY LA LP MA MD ME MS NC NH NJ NY OH OK PA RI SC TN TX VA VT WV\n",
|
||||
"B|1,344,149|43.077%|15|AZ CA IA ID MN MT ND NV OR SD UP UT WA WI WY\n",
|
||||
"C| 430,653|13.801%| 5|CO IL MO NE NM\n",
|
||||
"∆| 1,409| 0.045%|\n",
|
||||
"CPU times: user 33.5 s, sys: 199 ms, total: 33.7 s\n",
|
||||
"Wall time: 33.8 s\n"
|
||||
"CPU times: user 35.5 s, sys: 325 ms, total: 35.8 s\n",
|
||||
"Wall time: 36 s\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -466,18 +466,18 @@
|
||||
"49 states ⇒ 1,209,042 cuts (size ≤ 10, area ≤ 1,040,120) ⇒ 278,472 splits.\n",
|
||||
"\n",
|
||||
"1. Split that maximizes area(B):\n",
|
||||
"A|1,345,558|43.122%|29|{AL,AR,CT,DE,FL,GA,IN,KS,KY,LA,LP,MA,MD,ME,MS,NC,NH,NJ,NY,OH,OK,PA,RI,SC,TN,TX,VA,VT,WV}\n",
|
||||
"B|1,344,149|43.077%|15|{AZ,CA,IA,ID,MN,MT,ND,NV,OR,SD,UP,UT,WA,WI,WY}\n",
|
||||
"C| 430,653|13.801%| 5|{CO,IL,MO,NE,NM}\n",
|
||||
"A|1,345,558|43.122%|29|AL AR CT DE FL GA IN KS KY LA LP MA MD ME MS NC NH NJ NY OH OK PA RI SC TN TX VA VT WV\n",
|
||||
"B|1,344,149|43.077%|15|AZ CA IA ID MN MT ND NV OR SD UP UT WA WI WY\n",
|
||||
"C| 430,653|13.801%| 5|CO IL MO NE NM\n",
|
||||
"∆| 1,409| 0.045%|\n",
|
||||
"\n",
|
||||
"2. Split that minimizes ∆ = area(A) - area(B):\n",
|
||||
"A|1,161,198|37.214%|29|{AL,CT,DE,FL,GA,IA,IL,IN,LP,MA,MD,ME,MN,NC,ND,NH,NJ,NY,OH,PA,RI,SC,SD,TN,UP,VA,VT,WI,WV}\n",
|
||||
"B|1,161,195|37.213%|10|{AZ,CA,CO,KS,LA,NM,OR,TX,UT,WA}\n",
|
||||
"C| 797,967|25.573%|10|{AR,ID,KY,MO,MS,MT,NE,NV,OK,WY}\n",
|
||||
"A|1,161,198|37.214%|29|AL CT DE FL GA IA IL IN LP MA MD ME MN NC ND NH NJ NY OH PA RI SC SD TN UP VA VT WI WV\n",
|
||||
"B|1,161,195|37.213%|10|AZ CA CO KS LA NM OR TX UT WA\n",
|
||||
"C| 797,967|25.573%|10|AR ID KY MO MS MT NE NV OK WY\n",
|
||||
"∆| 3| 0.000%|\n",
|
||||
"CPU times: user 1min 1s, sys: 696 ms, total: 1min 1s\n",
|
||||
"Wall time: 1min 1s\n"
|
||||
"CPU times: user 1min 3s, sys: 911 ms, total: 1min 4s\n",
|
||||
"Wall time: 1min 4s\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -497,18 +497,18 @@
|
||||
"49 states ⇒ 3,049,254 cuts (size ≤ 11, area ≤ 1,040,120) ⇒ 430,761 splits.\n",
|
||||
"\n",
|
||||
"1. Split that maximizes area(B):\n",
|
||||
"A|1,345,558|43.122%|29|{AL,AR,CT,DE,FL,GA,IN,KS,KY,LA,LP,MA,MD,ME,MS,NC,NH,NJ,NY,OH,OK,PA,RI,SC,TN,TX,VA,VT,WV}\n",
|
||||
"B|1,344,149|43.077%|15|{AZ,CA,IA,ID,MN,MT,ND,NV,OR,SD,UP,UT,WA,WI,WY}\n",
|
||||
"C| 430,653|13.801%| 5|{CO,IL,MO,NE,NM}\n",
|
||||
"A|1,345,558|43.122%|29|AL AR CT DE FL GA IN KS KY LA LP MA MD ME MS NC NH NJ NY OH OK PA RI SC TN TX VA VT WV\n",
|
||||
"B|1,344,149|43.077%|15|AZ CA IA ID MN MT ND NV OR SD UP UT WA WI WY\n",
|
||||
"C| 430,653|13.801%| 5|CO IL MO NE NM\n",
|
||||
"∆| 1,409| 0.045%|\n",
|
||||
"\n",
|
||||
"2. Split that minimizes ∆ = area(A) - area(B):\n",
|
||||
"A|1,161,198|37.214%|29|{AL,CT,DE,FL,GA,IA,IL,IN,LP,MA,MD,ME,MN,NC,ND,NH,NJ,NY,OH,PA,RI,SC,SD,TN,UP,VA,VT,WI,WV}\n",
|
||||
"B|1,161,195|37.213%|10|{AZ,CA,CO,KS,LA,NM,OR,TX,UT,WA}\n",
|
||||
"C| 797,967|25.573%|10|{AR,ID,KY,MO,MS,MT,NE,NV,OK,WY}\n",
|
||||
"A|1,161,198|37.214%|29|AL CT DE FL GA IA IL IN LP MA MD ME MN NC ND NH NJ NY OH PA RI SC SD TN UP VA VT WI WV\n",
|
||||
"B|1,161,195|37.213%|10|AZ CA CO KS LA NM OR TX UT WA\n",
|
||||
"C| 797,967|25.573%|10|AR ID KY MO MS MT NE NV OK WY\n",
|
||||
"∆| 3| 0.000%|\n",
|
||||
"CPU times: user 2min 33s, sys: 1.69 s, total: 2min 35s\n",
|
||||
"Wall time: 2min 35s\n"
|
||||
"CPU times: user 2min 39s, sys: 2.14 s, total: 2min 41s\n",
|
||||
"Wall time: 2min 42s\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -524,7 +524,7 @@
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"However, I'm pretty sure we can two regions with exactly equal areas. I want to allow a cut that might have 30 or 40 states, so instead of enumerating cuts, I'll focus on enumerating the regions *A* and *B*, and yielding pairs of regions that have exactly equal area. I'll use the function `make_cuts` to make contiguous regions *A* and *B*, even though they aren't cuts. I'll keep the regions small, and anchor *A* in the west and *B* in the east:"
|
||||
"However, I'm pretty sure we can find two regions with exactly equal areas. I want to allow a cut that might have 30 or 40 states, so instead of enumerating cuts, I'll focus on enumerating the regions *A* and *B*. Given two iterables of regions, `find_equal` will report all pairs (one from *As* and one from *Bs*) of regions that have the exact same area and that are not overlapping: *A* is disjoint from *B* and all its neighbors (the `neighborhood` of *B*)."
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -533,13 +533,25 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def find_equal(country: Region, maxsizeA=5, maxsizeB=8, startA=west, startB=east) -> Iterator[Tuple[Region, Region, int]]:\n",
|
||||
" \"\"\"Find contiguous regions A and B that have the same area, and yield (A, B, area).\"\"\"\n",
|
||||
" Bs = list(make_cuts(country, maxsizeB, start=startB, end=country))\n",
|
||||
" for A in make_cuts(country, maxsizeA, start=startA, end=country):\n",
|
||||
" for B in Bs:\n",
|
||||
" if area(B) == area(A):\n",
|
||||
" yield A, B, area(B)"
|
||||
"def find_equal(As: Iterable[Region], Bs: Iterable[Region]) -> Iterator[Tuple[Region, Region, int]]:\n",
|
||||
" \"\"\"From As and Bs, find disjoint regions A and B that have the exact same area. Yield (A, B, area(B)).\"\"\"\n",
|
||||
" area_table = {area(A): A for A in As}\n",
|
||||
" for B in Bs:\n",
|
||||
" if area(B) in area_table:\n",
|
||||
" A = area_table[area(B)]\n",
|
||||
" if A.isdisjoint(neighborhood(B)):\n",
|
||||
" yield (A, B, area(B))\n",
|
||||
"\n",
|
||||
"def neighborhood(A: Region) -> Region:\n",
|
||||
" \"\"\"The region consisting of A and all the neighbors of any state in A.\"\"\"\n",
|
||||
" return A | {s1 for s in A for s1 in neighbors[s]}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"I'll keep the regions small, and anchor *A* in the west and *B* in the east. If this experiment doesn't yield anything, I'll try larger regions:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -550,9 +562,24 @@
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(frozenset({'AZ', 'CA', 'OR'}),\n",
|
||||
" frozenset({'IL', 'IN', 'KS', 'MO', 'OH', 'TN', 'VA'}),\n",
|
||||
" 376064)"
|
||||
"[(frozenset({'CA', 'NV', 'UT'}),\n",
|
||||
" frozenset({'GA', 'IA', 'KY', 'MO', 'MS', 'TN', 'VA'}),\n",
|
||||
" 359164),\n",
|
||||
" (frozenset({'AZ', 'CA', 'OR'}),\n",
|
||||
" frozenset({'IA', 'IL', 'KY', 'NE', 'SD', 'VA', 'WV'}),\n",
|
||||
" 376064),\n",
|
||||
" (frozenset({'AZ', 'CA', 'OR'}),\n",
|
||||
" frozenset({'IL', 'IN', 'KS', 'MO', 'OH', 'TN', 'VA'}),\n",
|
||||
" 376064),\n",
|
||||
" (frozenset({'ID', 'OR', 'UT', 'WY'}),\n",
|
||||
" frozenset({'GA', 'IA', 'IL', 'IN', 'MO', 'TN', 'VA'}),\n",
|
||||
" 364658),\n",
|
||||
" (frozenset({'ID', 'NV', 'WA'}),\n",
|
||||
" frozenset({'KY', 'MS', 'NY', 'PA', 'TN', 'VT', 'WV'}),\n",
|
||||
" 265439),\n",
|
||||
" (frozenset({'ID', 'UT', 'WA', 'WY'}),\n",
|
||||
" frozenset({'AL', 'IL', 'IN', 'KY', 'TN', 'VA', 'WI'}),\n",
|
||||
" 337577)]"
|
||||
]
|
||||
},
|
||||
"execution_count": 15,
|
||||
@ -561,14 +588,17 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"next(find_equal(usa49))"
|
||||
"make_regions = make_cuts # make_cuts actually just makes contiguous regions\n",
|
||||
"\n",
|
||||
"list(find_equal(make_regions(usa49, 4, start=west, end=usa49),\n",
|
||||
" make_regions(usa49, 7, start=east, end=usa49)))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"There may be many other solutions; we didn't bother to check, because you can't get a delta of less than zero. Note that the cut (in yellow) is not contiguous, but that's legal: all that matters is that *A* and *B* are contiguous and disjoint.\n",
|
||||
"There are 6 solutions right away (and probably many more solutions with larger regions). I'll show the map for one of them (the smallest one, with area 265,439 square miles for both regions). Note that the cut (in yellow) is not contiguous, but that's in accord with the rules: all that matters is that *A* and *B* are contiguous and disjoint.\n",
|
||||
"\n",
|
||||
""
|
||||
]
|
||||
@ -595,15 +625,15 @@
|
||||
"50 states ⇒ 43,600 cuts (size ≤ 8, area ≤ 624,072) ⇒ 13,134 splits.\n",
|
||||
"\n",
|
||||
"1. Split that maximizes area(B):\n",
|
||||
"A|1,345,626|43.123%|30|{AL,AR,CT,DC,DE,FL,GA,IN,KS,KY,LA,LP,MA,MD,ME,MS,NC,NH,NJ,NY,OH,OK,PA,RI,SC,TN,TX,VA,VT,WV}\n",
|
||||
"B|1,344,149|43.076%|15|{AZ,CA,IA,ID,MN,MT,ND,NV,OR,SD,UP,UT,WA,WI,WY}\n",
|
||||
"C| 430,653|13.801%| 5|{CO,IL,MO,NE,NM}\n",
|
||||
"A|1,345,626|43.123%|30|AL AR CT DC DE FL GA IN KS KY LA LP MA MD ME MS NC NH NJ NY OH OK PA RI SC TN TX VA VT WV\n",
|
||||
"B|1,344,149|43.076%|15|AZ CA IA ID MN MT ND NV OR SD UP UT WA WI WY\n",
|
||||
"C| 430,653|13.801%| 5|CO IL MO NE NM\n",
|
||||
"∆| 1,477| 0.047%|\n",
|
||||
"\n",
|
||||
"2. Split that minimizes ∆ = area(A) - area(B):\n",
|
||||
"A|1,267,062|40.605%|28|{AL,AR,CT,DC,DE,FL,GA,KS,KY,LA,LP,MA,MD,ME,MS,NC,NH,NJ,NY,OH,OK,PA,RI,SC,TX,VA,VT,WV}\n",
|
||||
"B|1,267,033|40.604%|14|{AZ,CA,IA,ID,MN,MT,ND,NV,OR,UP,UT,WA,WI,WY}\n",
|
||||
"C| 586,333|18.790%| 8|{CO,IL,IN,MO,NE,NM,SD,TN}\n",
|
||||
"A|1,267,062|40.605%|28|AL AR CT DC DE FL GA KS KY LA LP MA MD ME MS NC NH NJ NY OH OK PA RI SC TX VA VT WV\n",
|
||||
"B|1,267,033|40.604%|14|AZ CA IA ID MN MT ND NV OR UP UT WA WI WY\n",
|
||||
"C| 586,333|18.790%| 8|CO IL IN MO NE NM SD TN\n",
|
||||
"∆| 29| 0.001%|\n"
|
||||
]
|
||||
}
|
||||
@ -640,15 +670,15 @@
|
||||
"48 states ⇒ 41,735 cuts (size ≤ 8, area ≤ 624,072) ⇒ 18,642 splits.\n",
|
||||
"\n",
|
||||
"1. Split that maximizes area(B):\n",
|
||||
"A|1,348,646|43.221%|30|{AL,CT,DE,FL,GA,IA,IL,IN,KY,MA,MD,ME,MI,MN,MT,NC,ND,NH,NJ,NY,OH,PA,RI,SC,SD,TN,VA,VT,WI,WV}\n",
|
||||
"B|1,341,666|42.997%|12|{AZ,CA,CO,KS,LA,NM,NV,OK,OR,TX,UT,WA}\n",
|
||||
"C| 430,048|13.782%| 6|{AR,ID,MO,MS,NE,WY}\n",
|
||||
"A|1,348,646|43.221%|30|AL CT DE FL GA IA IL IN KY MA MD ME MI MN MT NC ND NH NJ NY OH PA RI SC SD TN VA VT WI WV\n",
|
||||
"B|1,341,666|42.997%|12|AZ CA CO KS LA NM NV OK OR TX UT WA\n",
|
||||
"C| 430,048|13.782%| 6|AR ID MO MS NE WY\n",
|
||||
"∆| 6,980| 0.224%|\n",
|
||||
"\n",
|
||||
"2. Split that minimizes ∆ = area(A) - area(B):\n",
|
||||
"A|1,267,816|40.630%|13|{AZ,CA,ID,KS,MN,MT,ND,NE,NV,OR,SD,UT,WA}\n",
|
||||
"B|1,267,672|40.626%|28|{AL,AR,CT,DE,FL,GA,IL,IN,KY,LA,MA,MD,ME,MI,MS,NC,NH,NJ,NY,OH,PA,RI,SC,TN,TX,VA,VT,WV}\n",
|
||||
"C| 584,872|18.744%| 7|{CO,IA,MO,NM,OK,WI,WY}\n",
|
||||
"A|1,267,816|40.630%|13|AZ CA ID KS MN MT ND NE NV OR SD UT WA\n",
|
||||
"B|1,267,672|40.626%|28|AL AR CT DE FL GA IL IN KY LA MA MD ME MI MS NC NH NJ NY OH PA RI SC TN TX VA VT WV\n",
|
||||
"C| 584,872|18.744%| 7|CO IA MO NM OK WI WY\n",
|
||||
"∆| 144| 0.005%|\n"
|
||||
]
|
||||
}
|
||||
@ -685,15 +715,15 @@
|
||||
"49 states ⇒ 1,237 cuts (size ≤ 4, area ≤ 624,072) ⇒ 384 splits.\n",
|
||||
"\n",
|
||||
"1. Split that maximizes area(B):\n",
|
||||
"A|1,607,869|51.528%|18|{AZ,CA,CO,IA,ID,KS,MN,MT,ND,NE,NV,OR,SD,UP,UT,WA,WI,WY}\n",
|
||||
"B|1,193,381|38.245%|27|{AL,AR,CT,DE,FL,GA,IN,KY,LA,LP,MA,MD,ME,MS,NC,NH,NJ,NY,OH,PA,RI,SC,TN,TX,VA,VT,WV}\n",
|
||||
"C| 319,110|10.227%| 4|{IL,MO,NM,OK}\n",
|
||||
"A|1,607,869|51.528%|18|AZ CA CO IA ID KS MN MT ND NE NV OR SD UP UT WA WI WY\n",
|
||||
"B|1,193,381|38.245%|27|AL AR CT DE FL GA IN KY LA LP MA MD ME MS NC NH NJ NY OH PA RI SC TN TX VA VT WV\n",
|
||||
"C| 319,110|10.227%| 4|IL MO NM OK\n",
|
||||
"∆| 414,488|13.283%|\n",
|
||||
"\n",
|
||||
"2. Split that minimizes ∆ = area(A) - area(B):\n",
|
||||
"A|1,607,869|51.528%|18|{AZ,CA,CO,IA,ID,KS,MN,MT,ND,NE,NV,OR,SD,UP,UT,WA,WI,WY}\n",
|
||||
"B|1,193,381|38.245%|27|{AL,AR,CT,DE,FL,GA,IN,KY,LA,LP,MA,MD,ME,MS,NC,NH,NJ,NY,OH,PA,RI,SC,TN,TX,VA,VT,WV}\n",
|
||||
"C| 319,110|10.227%| 4|{IL,MO,NM,OK}\n",
|
||||
"A|1,607,869|51.528%|18|AZ CA CO IA ID KS MN MT ND NE NV OR SD UP UT WA WI WY\n",
|
||||
"B|1,193,381|38.245%|27|AL AR CT DE FL GA IN KY LA LP MA MD ME MS NC NH NJ NY OH PA RI SC TN TX VA VT WV\n",
|
||||
"C| 319,110|10.227%| 4|IL MO NM OK\n",
|
||||
"∆| 414,488|13.283%|\n"
|
||||
]
|
||||
}
|
||||
@ -721,15 +751,15 @@
|
||||
"49 states ⇒ 367 cuts (size ≤ 3, area ≤ 624,072) ⇒ 89 splits.\n",
|
||||
"\n",
|
||||
"1. Split that maximizes area(B):\n",
|
||||
"A|2,393,960|76.721%|42|{AL,AR,CO,CT,DE,FL,GA,IA,IL,IN,KS,KY,LA,LP,MA,MD,ME,MN,MO,MS,MT,NC,ND,NE,NH,NJ,NM,NY,OH,OK,PA,RI,SC,SD,TN,TX,UP,VA,VT,WI,WV,WY}\n",
|
||||
"B| 443,944|14.227%| 4|{CA,NV,OR,WA}\n",
|
||||
"C| 282,456| 9.052%| 3|{AZ,ID,UT}\n",
|
||||
"A|2,393,960|76.721%|42|AL AR CO CT DE FL GA IA IL IN KS KY LA LP MA MD ME MN MO MS MT NC ND NE NH NJ NM NY OH OK PA RI SC SD TN TX UP VA VT WI WV WY\n",
|
||||
"B| 443,944|14.227%| 4|CA NV OR WA\n",
|
||||
"C| 282,456| 9.052%| 3|AZ ID UT\n",
|
||||
"∆|1,950,016|62.493%|\n",
|
||||
"\n",
|
||||
"2. Split that minimizes ∆ = area(A) - area(B):\n",
|
||||
"A|2,393,960|76.721%|42|{AL,AR,CO,CT,DE,FL,GA,IA,IL,IN,KS,KY,LA,LP,MA,MD,ME,MN,MO,MS,MT,NC,ND,NE,NH,NJ,NM,NY,OH,OK,PA,RI,SC,SD,TN,TX,UP,VA,VT,WI,WV,WY}\n",
|
||||
"B| 443,944|14.227%| 4|{CA,NV,OR,WA}\n",
|
||||
"C| 282,456| 9.052%| 3|{AZ,ID,UT}\n",
|
||||
"A|2,393,960|76.721%|42|AL AR CO CT DE FL GA IA IL IN KS KY LA LP MA MD ME MN MO MS MT NC ND NE NH NJ NM NY OH OK PA RI SC SD TN TX UP VA VT WI WV WY\n",
|
||||
"B| 443,944|14.227%| 4|CA NV OR WA\n",
|
||||
"C| 282,456| 9.052%| 3|AZ ID UT\n",
|
||||
"∆|1,950,016|62.493%|\n"
|
||||
]
|
||||
}
|
||||
@ -775,6 +805,8 @@
|
||||
"\n",
|
||||
" assert all((x in neighbors[y]) == (y in neighbors[x]) \n",
|
||||
" for x in neighbors for y in neighbors)\n",
|
||||
"\n",
|
||||
" assert neighborhood(states('CO UT')) == states('NV UT KS AZ NM ID NE OK WY CO')\n",
|
||||
" \n",
|
||||
" assert set(make_cuts(western, 3)) == {\n",
|
||||
" states('AZ ID NV'),\n",
|
||||
@ -794,6 +826,8 @@
|
||||
" \n",
|
||||
" for country in (usa48, usa49, border, western):\n",
|
||||
" assert contiguous(country) == country\n",
|
||||
"\n",
|
||||
" assert contiguous(usa50) != usa50\n",
|
||||
" \n",
|
||||
" return 'ok'\n",
|
||||
" \n",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user