Wpis użytkownika EXCV31 w Programowanie
EXCV31Kompan
1piorunówCześć.
Potrzebowałbym wsparcia technicznego/informacji, na temat tego jakiego algorytmu muszę użyć.
Cel: Program który po wprowadzeniu kilku/nastu tasków wraz z poziomem trudności od 1 do 5 podzieli te taski tak, aby ich sumaryczny czas wynosił 8.00h.
Przykład:
Task1, trudność 1
Task2, trudność 1
Task3, trudność 1
Task4, trudność 1
Task5, trudność 5
Oczekiwane działanie:
Task1: Zajął 1h
Task2: Zajął 1h
Task3: Zajął 1h
Task4: Zajął 1h
Task5: Zajął 4h
SUMA: 8.00h
Oczywiście poziomy trudności mogą być inne, a program miałby sam określić ile dana rzecz zajęła, mając na uwadze że taski z wyższą trudnością musiały zająć proporcjonalnie większą ilość czasu.
Chciałbym to zaimplementować w języku Python, wraz z przyszłym wrzucaniem tego z automatu przez API do Jira.
Ma ktoś pomysł jak się za to zabrać? ChatGPT rozkłada ręce.
Komentarze (7)
def knapsack(tasks, difficulty_levels):
n = len(tasks)
dp = [[0] * (n + 1) for _ in range(9)] # Tablica przechowująca wyniki
# Obliczanie optymalnego rozwiązania
for i in range(1, n + 1):
task_time = tasks[i - 1]
difficulty = difficulty_levels[i - 1]
for j in range(1, 9):
if difficulty <= j:
dp[j][i] = max(dp[j][i - 1], dp[j - difficulty][i - 1] + task_time)
else:
dp[j][i] = dp[j][i - 1]
# Odtworzenie rozwiązania
selected_tasks = []
j = 8
for i in range(n, 0, -1):
if dp[j][i] != dp[j][i - 1]:
selected_tasks.append(i)
j -= difficulty_levels[i - 1]
return selected_tasks
# Przykładowe dane
tasks = [1, 1, 1, 1, 4]
difficulty_levels = [1, 1, 1, 1, 5]
selected_tasks = knapsack(tasks, difficulty_levels)
total_time = sum(tasks[i - 1] for i in selected_tasks)
# Wyświetlenie wyniku
for task_index in selected_tasks:
print(f"Task{task_index}: Zajął {tasks[task_index - 1]}h")
print(f"\nSUMA: {total_time:.2f}h")
@EXCV31 https://en.wikipedia.org/wiki/Subset_sum_problem ? Przepraszam, ale nie do końca rozumiem problem. Co to dokładnie znaczy „podzieli te taski tak, aby ich sumaryczny czas wynosił 8.00h”? Jak rozdzielę monety o łącznej wartości 100 zł pomiędzy iluś ludzi, to ich łączna wartość dalej będzie wynosiła 100 zł.
Subset sum problemThe subset sum problem (SSP) is a decision problem in computer science. In its most general formulation, there is a multiset S {\displaystyle S} of integers and a target-sum T {\displaystyle T} , and the question is to decide whether any subset of the integers sum to precisely ...WikipediaKomentarz usunięty
@EXCV31 Eeee… nie rozumiem. Chodzi o problem plecakowy, czy jak?
Wygląda mi to na typowy problem plecakowy lub któryś z jego wariantów:
- https://en.wikipedia.org/wiki/Knapsack_problem#Multi-objective_knapsack_problem
- https://en.wikipedia.org/wiki/Bin_packing_problem
Jeśli poziom trudności zawsze jest tak samo przeliczany na czas (np. trudność 1 zawsze oznacza 1 godzinę), to można go zignorować i od razu mówić o czasie. Czyli twój problem brzmi: "mam X kontenerów o pojemności Y (tutaj: 8h), do którego mam wrzucić przedmioty różnej wielkości (tutaj: o różnym czasie trwania) tak, aby maksymalnie zapełnić kontenery".
Ja osobiście bym zrobił prosty, zachłanny algorytm "wpakuj największy pasujący task aż zabraknie miejsca", ale skoro planujesz użyć Pythona, to na pewno znajdziesz miliard bibliotek z lepszymi algorytmami.
Patrzcie jaki zwyrodnialec - story pointy na godziny chce przeliczać ( ͡° ͜ʖ ͡°)
A może po prostu od razu wyceniać w jednostkach czasu? Albo przyjąć 1 punkt trudności = 1 godzina?
1. Sumujesz wszystkie trudności z wszystkich tasków.
2. Obliczasz współczynnik godzin na stopień trudności (chyba nie muszę pisać jakie działanie tutaj zastosować?).
3. Mnożysz stopień trudności przez współczynnik i masz wynik w godzinach ¯\\(ツ)/¯
Łączny czas / suma trudności i masz ile zajmuje jedna jednostka pracy. Żadnego fancy algorytmu nie trzeba o ile zakładamy że trudność i czas są liniowo powiązane