{"id":30980277,"url":"https://github.com/ptrvsrg/dream-team-optimizer","last_synced_at":"2026-05-06T18:31:25.675Z","repository":{"id":314252910,"uuid":"851554932","full_name":"ptrvsrg/dream-team-optimizer","owner":"ptrvsrg","description":"Dream Team Optimizer is an algorithm for forming development teams based on their preferences, in order to maximize harmony and satisfaction of participants","archived":false,"fork":false,"pushed_at":"2024-12-23T06:24:19.000Z","size":316,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-11T12:55:27.175Z","etag":null,"topics":["asp-net","consul","csharp","dotnet","ef-core","event-driven","masstransit","microservice","moq","postgres","rabbitmq","xunit"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ptrvsrg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-09-03T10:01:47.000Z","updated_at":"2024-12-24T06:14:44.000Z","dependencies_parsed_at":"2025-09-11T12:55:31.983Z","dependency_job_id":"44de9d82-ea62-4a65-931a-4b7e26809982","html_url":"https://github.com/ptrvsrg/dream-team-optimizer","commit_stats":null,"previous_names":["ptrvsrg/dream-team-optimizer"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/ptrvsrg/dream-team-optimizer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ptrvsrg%2Fdream-team-optimizer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ptrvsrg%2Fdream-team-optimizer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ptrvsrg%2Fdream-team-optimizer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ptrvsrg%2Fdream-team-optimizer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ptrvsrg","download_url":"https://codeload.github.com/ptrvsrg/dream-team-optimizer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ptrvsrg%2Fdream-team-optimizer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274771522,"owners_count":25346427,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-12T02:00:09.324Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asp-net","consul","csharp","dotnet","ef-core","event-driven","masstransit","microservice","moq","postgres","rabbitmq","xunit"],"created_at":"2025-09-12T07:08:43.656Z","updated_at":"2026-05-06T18:31:25.641Z","avatar_url":"https://github.com/ptrvsrg.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\" style=\"font-weight: bold;\"\u003eDream Team Optimizer\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/ptrvsrg/dream-team-optimizer/actions/workflows/build-and-test-dotnet.yml\"\u003e\n        \u003cimg alt=\"GitHub Actions Build and Test Workflow Status\" src=\"https://img.shields.io/github/actions/workflow/status/ptrvsrg/dream-team-optimizer/build-and-test-dotnet.yml?branch=develop\u0026style=flat\u0026labelColor=222222\u0026color=77D4FC\u0026label=Build%20and%20Test%20%7C%20develop\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/ptrvsrg/dream-team-optimizer/graphs/contributors\"\u003e\n        \u003cimg alt=\"GitHub contributors\" src=\"https://img.shields.io/github/contributors/ptrvsrg/dream-team-optimizer?style=flat\u0026label=Contributors\u0026labelColor=222222\u0026color=77D4FC\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/ptrvsrg/dream-team-optimizer/forks\"\u003e\n        \u003cimg alt=\"GitHub forks\" src=\"https://img.shields.io/github/forks/ptrvsrg/dream-team-optimizer?style=flat\u0026label=Forks\u0026labelColor=222222\u0026color=77D4FC\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/ptrvsrg/dream-team-optimizer/stargazers\"\u003e\n        \u003cimg alt=\"GitHub Repo stars\" src=\"https://img.shields.io/github/stars/ptrvsrg/dream-team-optimizer?style=flat\u0026label=Stars\u0026labelColor=222222\u0026color=77D4FC\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/ptrvsrg/dream-team-optimizer/issues\"\u003e\n        \u003cimg alt=\"GitHub issues\" src=\"https://img.shields.io/github/issues/ptrvsrg/dream-team-optimizer?style=flat\u0026label=Issues\u0026labelColor=222222\u0026color=77D4FC\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/ptrvsrg/dream-team-optimizer/pulls\"\u003e\n        \u003cimg alt=\"GitHub pull requests\" src=\"https://img.shields.io/github/issues-pr/ptrvsrg/dream-team-optimizer?style=flat\u0026label=Pull%20Requests\u0026labelColor=222222\u0026color=77D4FC\"/\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003eThe algorithm for forming development teams based on their preferences, in order to maximize harmony and satisfaction of participants.\u003c/p\u003e\n\n\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\n**The Dream Team Optimizer** project is designed to optimally form development teams based on their preferences gathered\nduring the hackathon. Each developer (Juniors or TeamLeads) makes a list of desirable colleagues with whom he would like\nto work in a team. Based on this data, the project calculates the satisfaction index for each participant, and then\ncalculates the harmony of the team distribution. The main goal of the project is to maximize the harmony of team\nformation in order to ensure the greatest satisfaction of the participants. This tool can be useful for HR professionals\nto optimize the process of creating dream teams.\n\n\u003ch2\u003eStrategies\u003c/h2\u003e\n\n\u003ch3\u003eGale–Shapley algorithm\u003c/h3\u003e\n\nThe strategy is based on the [Gale-Shapley algorithm](https://en.wikipedia.org/wiki/Gale%E2%80%93Shapley_algorithm)\n(also known as the deferred acceptance algorithm, the offer and rejection algorithm, or the Boston Pool algorithm). This\nalgorithm solves the problem of stable matching, which consists in pairing an equal number of participants of two types\nusing the preferences of each participant.\n\n\u003ch3\u003eStrategy based on bipartite graph\u003c/h3\u003e\n\nIn order to form teams, a complete weighted bipartite graph is built, such that there are juniors in one share, team\nleaders in the other, and the edges have a weight equal to the sum of the vertex satisfaction indices. Next, the edges\nare sorted by weight and teams are formed sequentially from the edge with the highest weight (after creating the team,\nthe corresponding vertices and edges are removed from the rating)\n\n\u003ch3\u003eWeighted preference strategy\u003c/h3\u003e\n\nIt is a modification of Gale–Shapley algorithm. By introducing weights into preferences, it is possible to balance on \nchanging priorities in order to fairly take into account the interests of both sides. For example, if one side prefers \ninstinctively, its preferences may carry more weight.\n\n\u003ch3\u003eComparison\u003c/h3\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eMachine parameters\u003c/summary\u003e\n\n+ **CPU:** AMD Ryzen 5 3500U with Radeon Vega Mobile Gfx\n+ **RAM:** DDR4 8GB 3200 MHz * 2\n\n\u003c/details\u003e\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003eStrategy\u003c/th\u003e\n        \u003cth\u003eCPU, %\u003c/th\u003e\n        \u003cth\u003eRAM, %\u003c/th\u003e\n        \u003cth\u003eTime, s\u003c/th\u003e\n        \u003cth\u003eHarmonicity\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eGale–Shapley algorithm\u003c/td\u003e\n        \u003ctd\u003e209.667\u003c/td\u003e\n        \u003ctd\u003e0.367\u003c/td\u003e\n        \u003ctd\u003e91\u003c/td\u003e\n        \u003ctd\u003e13.907\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eWeighted preference strategy\u003c/td\u003e\n        \u003ctd\u003e317\u003c/td\u003e\n        \u003ctd\u003e0.367\u003c/td\u003e\n        \u003ctd\u003e120\u003c/td\u003e\n        \u003ctd\u003e14.157\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eStrategy based on bipartite graph\u003c/td\u003e\n        \u003ctd\u003e369.583\u003c/td\u003e\n        \u003ctd\u003e0.375\u003c/td\u003e\n        \u003ctd\u003e129\u003c/td\u003e\n        \u003ctd\u003e14.159\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003ch2 id=\"technologies\"\u003eTechnologies\u003c/h2\u003e\n\n+ .NET SDK 8.0\n\n\u003ch2 id=\"architecture\"\u003eArchitecture WEB application\u003c/h2\u003e\n\n![Architecture](./assets/architecture.png)\n\n\u003ch2 id=\"started\"\u003eGetting started\u003c/h2\u003e\n\n\u003ch3\u003ePrerequisites\u003c/h3\u003e\n\n- Git\n- .NET SDK\n- Docker\n- Docker Compose\n\n\u003ch3\u003eInstallation\u003c/h3\u003e\n\n```shell\ngit clone https://github.com/ptrvsrg/dream-team-optimizer\n```\n\n\u003ch3\u003eLaunch console application\u003c/h3\u003e\n\nConduct hackathon:\n```bash\nmake build.console\nHACKATHON_CONFIG_PATH=./src/DreamTeamOptimizer.ConsoleApp/appsettings.json \\\n  dotnet ./out/DreamTeamOptimizer.ConsoleApp.dll conduct\n```\n\nPrint statistic after hackathon by ID:\n```bash\nmake build.console\nHACKATHON_CONFIG_PATH=./src/DreamTeamOptimizer.ConsoleApp/appsettings.json \\\n  dotnet ./out/DreamTeamOptimizer.ConsoleApp.dll stat \u003cID\u003e\n```\n\nPrint average harmonicity:\n```bash\nmake build.console\nHACKATHON_CONFIG_PATH=./src/DreamTeamOptimizer.ConsoleApp/appsettings.json \\\n  dotnet ./out/DreamTeamOptimizer.ConsoleApp.dll average-harmonic\n```\n\n\u003ch3\u003eLaunch WEB application\u003c/h3\u003e\n\n1) Build applications\n\n    ```bash\n    make build.ms-employee\n    make build.ms-hr-director\n    make build.ms-hr-manager\n    ```\n\n2) Run applications\n\n    ```bash\n    docker compose up -d\n    ```\n    \n    After finishing execution, you can see the running containers:\n    \n    + PostgreSQL - for store data\n    + Consul - for service discovery\n    + Nginx - for reverse proxy\n    + Microservices:\n        + ms-employee-1 - WEB application for junior with ID 1\n        + ms-employee-21 - WEB application for team lead with ID 21\n        + ms-hr-director - WEB application for HR director\n        + ms-hr-manager - WEB application for HR manager\n\n3) Conduct hackathon:\n\n    ```bash\n    curl -X 'POST' \\\n      'http://localhost:20080/api/v1/hackathons' \\\n      -H 'accept: application/json' \\\n      -d ''\n    ```\n\n4) Get hackathon by ID:\n\n    ```bash\n    HACKATHON_ID=1\n    curl -X 'GET' \\\n      \"http://localhost:20080/api/v1/hackathons/${HACKATHON_ID}\" \\\n      -H 'accept: application/json'\n    ```\n\n5) Get average harmonicity:\n\n    ```bash\n    curl -X 'GET' \\\n      'http://localhost:20080/api/v1/hackathons/average-harmonic' \\\n      -H 'accept: application/json'\n    ```\n\n\u003ch2 id=\"contribute\"\u003eContribute\u003c/h2\u003e\n\nSee in the [CONTRIBUTING.md](CONTRIBUTING.md)\n\n\u003ch2 id=\"contribute\"\u003eCode of conduct\u003c/h2\u003e\n\nSee in the [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)\n\n\u003ch2 id=\"license\"\u003eLicense\u003c/h2\u003e\n\nDistributed under the Apache License 2.0 License.\nSee [Apache License 2.0 License](https://www.apache.org/licenses/LICENSE-2.0) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fptrvsrg%2Fdream-team-optimizer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fptrvsrg%2Fdream-team-optimizer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fptrvsrg%2Fdream-team-optimizer/lists"}