Skip to content

Commit a0b9fcd

Browse files
Allocate laptops using greedy algorithm
1 parent 333ea48 commit a0b9fcd

1 file changed

Lines changed: 39 additions & 21 deletions

File tree

laptop_allocation/laptop_allocation.py

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class Person:
1919
name: str
2020
age: int
2121
# Sorted in order of preference, most preferred is first.
22-
preferred_operating_system: List[OperatingSystem]
22+
preferred_operating_system: tuple
2323

2424

2525
@dataclass(frozen=True)
@@ -31,7 +31,7 @@ class Laptop:
3131
operating_system: OperatingSystem
3232

3333
# ============================================================================
34-
# HELPER FUNCTIONS
34+
# HELPER FUNCTION
3535
# ============================================================================
3636
"""
3737
Calculates how "sad" a person would be with a given laptop allocation.
@@ -50,12 +50,6 @@ class Laptop:
5050
Returns:
5151
An integer representing sadness (0 = most happy, 100 = not in preferences)
5252
"""
53-
def find_preferred_laptops(person:Person, laptops: List[Laptop]) -> list[Laptop]:
54-
preferred_laptops = []
55-
for laptop in laptops:
56-
if laptop.operating_system in person.preferred_operating_system:
57-
preferred_laptops.append(laptop)
58-
return preferred_laptops
5953

6054
def calculate_sadness(person:Person, laptop:Laptop)-> int:
6155
if laptop.operating_system in person.preferred_operating_system:
@@ -90,23 +84,47 @@ def calculate_sadness(person:Person, laptop:Laptop)-> int:
9084
]
9185

9286
people = [
93-
Person(name="Imran", age=22, preferred_operating_system=[OperatingSystem.UBUNTU, OperatingSystem.MACOS]),
94-
Person(name="Eliza", age=34, preferred_operating_system=[OperatingSystem.ARCH, OperatingSystem.UBUNTU]),
95-
Person(name="Marcus", age=28, preferred_operating_system=[OperatingSystem.MACOS, OperatingSystem.UBUNTU]),
96-
Person(name="Sofia", age=31, preferred_operating_system=[OperatingSystem.UBUNTU]),
97-
Person(name="James", age=25, preferred_operating_system=[OperatingSystem.ARCH, OperatingSystem.MACOS]),
98-
Person(name="Nina", age=29, preferred_operating_system=[OperatingSystem.MACOS, OperatingSystem.ARCH, OperatingSystem.UBUNTU]),
87+
Person(name="Imran", age=22, preferred_operating_system=(OperatingSystem.UBUNTU, OperatingSystem.MACOS)),
88+
Person(name="Eliza", age=34, preferred_operating_system=(OperatingSystem.ARCH, OperatingSystem.UBUNTU)),
89+
Person(name="Marcus", age=28, preferred_operating_system=(OperatingSystem.MACOS, OperatingSystem.UBUNTU)),
90+
Person(name="Sofia", age=31, preferred_operating_system=(OperatingSystem.UBUNTU,)),
91+
Person(name="James", age=25, preferred_operating_system=(OperatingSystem.ARCH, OperatingSystem.MACOS)),
92+
Person(name="Nina", age=29, preferred_operating_system=(OperatingSystem.MACOS, OperatingSystem.ARCH, OperatingSystem.UBUNTU)),
9993
]
10094

10195

10296

10397
# ============================================================================
10498
# TESTING
10599
# ============================================================================
106-
# Test the helper functions
107-
for person in people:
108-
print(f"\n{person.name}'s preferences: {[os.value for os in person.preferred_operating_system]}")
109-
for laptop in laptops:
110-
sadness= calculate_sadness(person, laptop)
111-
print(f"Laptop {laptop.id} ({laptop.operating_system.value}): sadness = {sadness}")
112-
100+
101+
def allocate_laptops(people: List[Person], laptops: List[Laptop]) -> Dict[Person,Laptop]:
102+
result={}
103+
available_laptops = laptops.copy()
104+
105+
for person in people:
106+
smallest_sadness = float("inf")
107+
best_laptop = None
108+
109+
for laptop in available_laptops:
110+
sadness = calculate_sadness(person, laptop)
111+
if sadness < smallest_sadness:
112+
smallest_sadness = sadness
113+
best_laptop = laptop
114+
115+
result[person]= best_laptop
116+
available_laptops.remove(best_laptop)
117+
118+
return result
119+
120+
allocate_laptops(people, laptops)
121+
allocation = allocate_laptops(people, laptops)
122+
123+
print("\n" + "="*50)
124+
print("FINAL ALLOCATION:")
125+
print("="*50)
126+
for person, laptop in allocation.items():
127+
print(f"{person.name}: {laptop.manufacturer} {laptop.model} ({laptop.operating_system.value})")
128+
129+
130+

0 commit comments

Comments
 (0)