Treść programowa

Zaprojektowanie i implementacja aplikacji pobierającej dane wejściowe z linii komend, zawierającej pętle, instrukcje warunkowe oraz obsługę wyjątków.

Cel zajęć

Obie grupy mają za zadanie zaimplementować swój meta-heurystyczny algorytm problemu przydziału zasobów (resource-allocation).

Przebieg działania programu może być wyświetlany na standardowym wyjściu (konsola). Ważna parametry, takie jak np. aktualnie badana konfiguracja bądź wartość funkcji celu powinny być na bieżąco prezentowane w celu śledzenia przebiegu działania programu. Warunkiem terminującym działanie powinien być brak poprawy wyniku przez kolejną określoną ilość iteracji. Dane wejściowe będą czytane z pliku (przykładowe treści niżej).

Należy zwrócić też uwagę na sensowność generowanych wyników - np. dana osoba jako sugestie nie powinna otrzymać samej siebie, pracownik nie może być przypisany jednocześnie do dwóch projektów, każdy projekt musi mieć pracownika itp.

$ java -jar <skrypt.jar> <sciezka do pliku wejsciowego> 

<Testowana konfiguracja, wartość funkcji celu...>
<Testowana konfiguracja, wartość funkcji celu...>
...

Przykładowe klasy w projekcie

Należy zwrócić uwagę na poddział obowiązków klas w kodzie. Sugerowane minimum:

Java Stream API

Bardzo zalecane jest zastąpienie standardowych pętli for lub while (i tworzenie dodatkowych zmiennych do inkrementacji indeksów) poprzez mechanizm Stream API (dostępne od Java 8). Jego użycie sprawia, że kod jest bardziej zwięzły oraz ma funkcyjną naturę.

// przykład użycia Streaming API na kolekcji
public static void main(String[] args) {
    List<Employee> employees = new ArrayList<>();
    employees.add(new Employee("Alice", "Female", "Sales and Marketing", 50000));
    employees.add(new Employee("Bob", "Male", "Product Development", 60000));
    employees.add(new Employee("Charlie", "Male", "Sales and Marketing", 70000));
    employees.add(new Employee("Diana", "Female", "Sales and Marketing", 80000));
    employees.add(new Employee("Emily", "Female", "Infrastructure", 90000));

    double avgSalary = employees.stream()
                                .filter(e -> e.getGender().equals("Female"))
                                .filter(e -> e.getDepartment().equals("Sales and Marketing"))
                                .mapToDouble(Employee::getSalary)
                                .average()
                                .orElse(Double.NaN);
    System.out.println("Average salary of female employees in Sales and Marketing department: " + avgSalary);
}

Grupa A