[*]min and max players for each role,
[*]max players from one team
[*]if contest is small, 80% player need to be consistent and 20% risky players and if contest is mega, 60% player will be consistent and 40% risky players
[*]all teams should be unique
[*]random players combination based on team like 7-4,4-7,5-6 and 6-5 etc
< /ol>
Теперь я выполнил функцию такую: < /p>
Код: Выделить всё
private void generateTeams(List captains, List viceCaptains) {
if (!canGenerateTeams()) {
showErrorDialog(getString(R.string.error), getString(R.string.unable_to_generate_teams));
return;
}
int consistentRatio = contestType == 2 ? 80 : 60; // Small contest: 80-20, Mega contest: 60-40
// Prepare player pools
List allPlayers = new ArrayList(PlayersViewModelCricketAI.getBothTeamsPlayers().getValue());
allPlayers.removeAll(selectedPlayerOut); // Remove locked-out players
// Sort players by credits (higher credits first for consistent players)
allPlayers.sort((p1, p2) -> Double.compare(p2.getPlayerCredit(), p1.getPlayerCredit()));
// Divide players into consistent and risky groups
int splitIndex = (consistentRatio * allPlayers.size()) / 100;
List consistentPlayers = new ArrayList(allPlayers.subList(0, splitIndex));
List riskyPlayers = new ArrayList(allPlayers.subList(splitIndex, allPlayers.size()));
// Initialize team generation parameters
List generatedTeams = new ArrayList();
Set generatedTeamSignatures = new HashSet();
int maxPlayersFromOneTeam = MAX_PLAYERS_ONE_TEAM;
int requiredTeams = totalTeamsToCreate;
int attempts = 0;
int maxAttempts = (requiredTeams * 50);
Random random = new Random();
while (generatedTeams.size() < requiredTeams && attempts < maxAttempts) {
attempts++;
List teamPlayers = new ArrayList();
Set teamPlayerIds = new HashSet();
int team1Count = 0, team2Count = 0;
// Randomly choose a valid team combination (e.g., 7-4, 6-5, 5-6)
int team1Limit = 4 + random.nextInt(4); // Adjust range as needed
int team2Limit = TOTAL_PLAYERS - team1Limit;
// Add locked-in players
for (Player player : selectedPlayerIn) {
if (teamPlayers.size() < TOTAL_PLAYERS && !teamPlayerIds.contains(player.getPlayerId())) {
if (validatePositionConstraints(player, teamPlayers)) {
teamPlayers.add(player);
teamPlayerIds.add(player.getPlayerId());
if (player.getPlayerTeamNumber() == 1) team1Count++;
if (player.getPlayerTeamNumber() == 2) team2Count++;
}
}
}
// Add captain and vice-captain
Player captain = captains.get(random.nextInt(captains.size()));
Player viceCaptain = viceCaptains.get(random.nextInt(viceCaptains.size()));
// Ensure captain and vice-captain are not the same
if (captain.getPlayerId() != viceCaptain.getPlayerId()) {
if (!teamPlayerIds.contains(captain.getPlayerId()) && validatePositionConstraints(captain, teamPlayers)) {
teamPlayers.add(captain);
teamPlayerIds.add(captain.getPlayerId());
if (captain.getPlayerTeamNumber() == 1) team1Count++;
if (captain.getPlayerTeamNumber() == 2) team2Count++;
}
if (!teamPlayerIds.contains(viceCaptain.getPlayerId()) && validatePositionConstraints(viceCaptain, teamPlayers)) {
teamPlayers.add(viceCaptain);
teamPlayerIds.add(viceCaptain.getPlayerId());
if (viceCaptain.getPlayerTeamNumber() == 1) team1Count++;
if (viceCaptain.getPlayerTeamNumber() == 2) team2Count++;
}
}else{
continue;
}
// Fill remaining slots with consistent players
for (Player player : consistentPlayers) {
if (teamPlayers.size() >= TOTAL_PLAYERS) break;
if (!teamPlayerIds.contains(player.getPlayerId()) && validatePositionConstraints(player, teamPlayers)) {
if (player.getPlayerTeamNumber() == 1 && team1Count >= team1Limit) continue;
if (player.getPlayerTeamNumber() == 2 && team2Count >= team2Limit) continue;
teamPlayers.add(player);
teamPlayerIds.add(player.getPlayerId());
if (player.getPlayerTeamNumber() == 1) team1Count++;
if (player.getPlayerTeamNumber() == 2) team2Count++;
}
}
// Fill remaining slots with risky players
for (Player player : riskyPlayers) {
if (teamPlayers.size() >= TOTAL_PLAYERS) break;
if (!teamPlayerIds.contains(player.getPlayerId()) && validatePositionConstraints(player, teamPlayers)) {
if (player.getPlayerTeamNumber() == 1 && team1Count >= team1Limit) continue;
if (player.getPlayerTeamNumber() == 2 && team2Count >= team2Limit) continue;
teamPlayers.add(player);
teamPlayerIds.add(player.getPlayerId());
if (player.getPlayerTeamNumber() == 1) team1Count++;
if (player.getPlayerTeamNumber() == 2) team2Count++;
}
}
if (validateTeam(teamPlayers, maxPlayersFromOneTeam)) {
List playerIds = new ArrayList();
for (Player p : teamPlayers) {
playerIds.add(p.getPlayerId());
}
Collections.sort(playerIds);
String teamSignature = playerIds + "-" + captain.getPlayerId() + "-" + viceCaptain.getPlayerId();
// Check uniqueness
if (!generatedTeamSignatures.contains(teamSignature)) {
Team team = new Team();
team.players = new ArrayList(teamPlayers);
team.captainId = captain.getPlayerId();
team.viceCaptainId = viceCaptain.getPlayerId();
generatedTeams.add(team);
generatedTeamSignatures.add(teamSignature); // Track this team
}
}
}
Log.e("RESULTS","REQUIRED TEAMS: "+ totalTeamsToCreate +" GENERATED TEAMS: "+ generatedTeams.size()+" ATTEMPTS:"+attempts);
String content = getResources().getString(R.string.teams_count_confirmation, generatedTeams.size());
showSuccessDialog(content, generatedTeams);
}
< /code>
И результат журнала похож на этот < /p>
2024-12-01 09:51:07.597 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 20 ATTEMPTS:30
2024-12-01 09:51:11.173 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 20 ATTEMPTS:40
2024-12-01 09:51:14.302 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 20 ATTEMPTS:32
2024-12-01 09:51:16.138 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 20 ATTEMPTS:37
2024-12-01 09:51:17.869 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 20 ATTEMPTS:28
2024-12-01 09:51:19.641 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 20 ATTEMPTS:37
2024-12-01 09:51:21.848 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 20 ATTEMPTS:35
2024-12-01 09:51:23.616 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 20 ATTEMPTS:33
2024-12-01 09:51:25.495 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 20 ATTEMPTS:48
2024-12-01 09:51:27.400 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 16 ATTEMPTS:1000
2024-12-01 09:51:30.288 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 20 ATTEMPTS:34
2024-12-01 09:51:32.172 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 20 ATTEMPTS:32
2024-12-01 09:51:33.722 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 20 ATTEMPTS:39
2024-12-01 09:51:36.133 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 20 ATTEMPTS:25
2024-12-01 09:51:37.877 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 20 ATTEMPTS:29
2024-12-01 09:51:39.724 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 20 ATTEMPTS:39
2024-12-01 09:51:42.020 25080-25080 RESULTS com.example.teams E REQUIRED TEAMS: 20 GENERATED TEAMS: 16 ATTEMPTS:1000
спасибо! < /P>
Подробнее здесь: https://stackoverflow.com/questions/792 ... using-java