Skip to content
Snippets Groups Projects
Unverified Commit d1919040 authored by Noah Huppert's avatar Noah Huppert
Browse files

added week 7 grouping alg solution

parent b81fb0f8
No related branches found
No related tags found
No related merge requests found
%% Cell type:code id: tags:
``` python
import random
# Helpers
def calc_deltas(t, ns):
deltas = []
for n in ns:
deltas.append(t-n)
return deltas
def largest_index(ns):
largest = ns[0]
largest_i = 0
for i in range(len(ns)):
n = ns[i]
if n > largest:
largest = n
largest_i = i
return largest_i
def sub_sum(ns):
sums = []
for n in ns:
sums.append(sum(n))
return sums
def sub_add(delta, ns):
new = []
for n in ns:
new.append(n+delta)
return new
def sub_abs(ns):
new = []
for n in ns:
new.append(abs(n))
return new
# Runners
def gen_nums(num_nums, num_groups):
num_min = 0
num_max = int(num_nums/(num_groups))
nums = []
for i in range(num_nums):
nums.append(random.randint(num_min, num_max))
return nums
def run_alg(num_nums, num_groups, grouper):
nums = gen_nums(num_nums, num_groups)
groups = grouper(nums, num_groups)
group_sums = sub_sum(groups)
group_deltas = calc_deltas(target, group_sums)
group_deltas = sub_abs(group_deltas)
return group_deltas
def test_alg(num_nums, num_groups, grouper, iterations):
deltas = []
for i in range(iterations):
deltas.extend(run_alg(num_nums, num_groups, grouper))
delta = sum(deltas)
avg = delta / (iterations * num_groups)
return avg
# Algorithms
def balance_group(nums, num_groups):
# Initialize groups
groups = []
for i in range(num_groups):
groups.append([])
# Target info
num_sums = sum(nums)
target = num_sums / num_groups
# Group
nums.sort()
for n in nums:
sums = sub_sum(groups)
#sums = sub_add(n, sums) # Might improve? Have to test
deltas = calc_deltas(target, sums)
largest_d = largest_index(deltas)
groups[largest_d].append(n)
return groups
# Test
num_nums = 200
num_groups = 5
iterations = 100
print("testing")
print("balance_group: {}".format(test_alg(num_nums, num_groups, balance_group, iterations)))
```
%% Output
testing
balance_group: 218393.51666666797
%% Cell type:code id: tags:
``` python
```
%% Cell type:code id: tags:
``` python
import random
# Helpers
def calc_deltas(t, ns):
deltas = []
for n in ns:
deltas.append(t-n)
return deltas
def largest_index(ns):
largest = ns[0]
largest_i = 0
for i in range(len(ns)):
n = ns[i]
if n > largest:
largest = n
largest_i = i
return largest_i
def sub_sum(ns):
sums = []
for n in ns:
sums.append(sum(n))
return sums
def sub_add(delta, ns):
new = []
for n in ns:
new.append(n+delta)
return new
def sub_abs(ns):
new = []
for n in ns:
new.append(abs(n))
return new
# Runners
def gen_nums(num_nums, num_groups):
num_min = 0
num_max = int(num_nums/(num_groups))
nums = []
for i in range(num_nums):
nums.append(random.randint(num_min, num_max))
return nums
def run_alg(num_nums, num_groups, grouper):
nums = gen_nums(num_nums, num_groups)
groups = grouper(nums, num_groups)
group_sums = sub_sum(groups)
group_deltas = calc_deltas(target, group_sums)
group_deltas = sub_abs(group_deltas)
return group_deltas
def test_alg(num_nums, num_groups, grouper, iterations):
deltas = []
for i in range(iterations):
deltas.extend(run_alg(num_nums, num_groups, grouper))
delta = sum(deltas)
avg = delta / (iterations * num_groups)
return avg
# Algorithms
def balance_group(nums, num_groups):
# Initialize groups
groups = []
for i in range(num_groups):
groups.append([])
# Target info
num_sums = sum(nums)
target = num_sums / num_groups
# Group
nums.sort()
for n in nums:
sums = sub_sum(groups)
#sums = sub_add(n, sums) # Might improve? Have to test
deltas = calc_deltas(target, sums)
largest_d = largest_index(deltas)
groups[largest_d].append(n)
return groups
# Test
num_nums = 200
num_groups = 5
iterations = 100
print("testing")
print("balance_group: {}".format(test_alg(num_nums, num_groups, balance_group, iterations)))
```
%% Output
testing
balance_group: 218393.51666666797
%% Cell type:code id: tags:
``` python
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment