分班代码
php
<?php
// 假设每个学生的成绩都在下面数组中
$scores = [70, 80, 90, 73, 82, 89, 75, 93, 85, 78, 97, 81, 83, 76, 91, 94, 84, 79, 74, 77, 71, 95, 88, 86, 72, 87, 92, 96, 69, 98, 77, 65, 67, 63, 69, 73, 71, 75, 89, 87, 79, 68, 79, 79, 74, 68, 90, 80, 68, 78, 93, 75, 65, 79, 83, 79, 74, 85, 75, 93, 80, 89, 90];
// 把分数从高到低排序
rsort($scores);
// 假设学生的性别都在下面数组中
$genders = [1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1];
// 计算学生人数
$studentCount = count($scores);
// 计算班级个数
$classCount = ceil(sqrt($studentCount / 2));
// 将学生分班
$classes = [];
for ($i = 0; $i < $classCount; $i++) {
$classes[] = [];
}
// 将学生分配到班级,保证性别比例
foreach ($scores as $key => $score) {
if ($genders[$key] == 1) {// 性别为男
$classes[$key % $classCount][] = $score;
} else {// 性别为女
$classes[($key + 1) % $classCount][] = $score;
}
}
// 计算各班级的平均分
$avgs = [];
foreach ($classes as $class) {
$avgs[] = array_sum($class) / count($class);
}
// 计算多个班级平均分之间的最大差值
$diff = 0;
for ($i = 0; $i < $classCount - 1; $i++) {
for ($j = $i + 1; $j < $classCount; $j++) {
$diff = max($diff, abs($avgs[$i] - $avgs[$j]));
}
}
//echo "多个班级的平均分之间的最大差值为:" . $diff;
//foreach ($classes as $class) {
// var_dump(count($class));
//}
var_dump(count($classes));可试用的步骤
首先,计算每个学生的总成绩和每个科目的成绩。通过计算,可以得出每个学生的成绩,总体的每科成绩平均分,总体的男女比例,以及每个班级的平均分和男女比例。
接下来,根据每个学生的总成绩,使用加权平均法分配学生到不同的班级。具体来说,把总成绩作为权重,把学生的总成绩除以总体的平均分,就可以得出每个学生的权重。
接下来,对所有学生的每科成绩加权,以保证每科的平均分和总体的平均分接近。
最后,根据每个班级的男女比例,以及总体的男女比例,重新调整学生的分班结果,以确保每个班级的男女比例和总体的男女比例相近。
AI 给出的示例代码
php
<?php
// 假设每个学生的成绩都在下面数组中
$scores = [70, 80, 90, 73, 82, 89, 75, 93, 85, 78, 97, 81, 83, 76, 91, 94, 84, 79, 74, 77, 71, 95, 88, 86, 72, 87, 92, 96, 69, 98, 77, 65, 67, 63, 69, 73, 71, 75, 89, 87, 79, 68, 79, 79, 74, 68, 90, 80, 68, 78, 93, 75, 65, 79, 83, 79, 74, 85, 75, 93, 80, 89, 90];
// 把分数从高到低排序
rsort($scores);
// 假设学生的性别都在下面数组中
$genders = [1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1];
//计算每个学生的总成绩
$totalScores = [];
foreach($students as $student){
$totalScore = 0;
foreach($scores as $score){
$totalScore += $score;
}
$totalScore /= count($scores);
$totalScores[$student] = $totalScore;
}
//使用加权平均法分配学生到不同的班级
$classNum = count($classes);
$maxScore = max($totalScores);
$scores = [];
foreach($totalScores as $student => $score){
$avgScore = $score / $maxScore;
$score = $avgScore * $classNum;
$scores[$student] = $score;
}
//分配每一个学生到一个班级
$classes = [];
foreach($scores as $student => $score){
for($i = 0; $i < $classNum; $i++){
if($score >= $i && $score < ($i + 1)){
$classes[$student] = $i;
}
}
}
//加权分配每科成绩
$scores = [];
foreach($students as $student){
$totalScore = 0;
foreach($scores as $score){
$totalScore += $score;
}
$totalScore /= count($scores);
$scores[$student] = $totalScore;
}
foreach($scores as $student => $score){
$class = $classes[$student];
$classScores = [];
foreach($scores as $s => $sScore){
if($classes[$s] == $class){
$classScores[] = $sScore;
}
}
$classAvgScore = array_sum($classScores) / count($classScores);
$scores[$student] -= ($score - $classAvgScore);
}
//调整学生分班结果,使其符合男女比例和各科平均分
$totalMaleNum = 0;
$totalFemaleNum = 0;
foreach($students as $student){
if($genders[$student] == 'male'){
$totalMaleNum++;
}else{
$totalFemaleNum++;
}
}
foreach($classes as $student => $class){
$maleNum = 0;
$femaleNum = 0;
foreach($classes as $s => $sClass){
if($sClass == $class){
if($genders[$s] == 'male'){
$maleNum++;
}else{
$femaleNum++;
}
}
}
if($maleNum > ($totalMaleNum / $classNum)){
if($genders[$student] == 'male'){
$classes[$student] = -1;
}
}
if($femaleNum > ($totalFemaleNum / $classNum)){
if($genders[$student] == 'female'){
$classes[$student] = -1;
}
}
}
//将未分班的学生分配到另一个班
$classCount = array_fill(0, $classNum, 0);
foreach($classes as $student => $class){
if($class == -1){
$min = min($classCount);
foreach($classCount as $index => $count){
if($min == $count){
$classes[$student] = $index;
$classCount[$index]++;
break;
}
}
}
}AI 借鉴代码
php
<?php
//定义班级平均分
$avgClassScore = array(
'1' => 64,
'2' => 65,
'3' => 66,
'4' => 67
);
//定义男女人数
$personNum = array(
'man' => 24,
'woman' => 25
);
//定义各科排名
$subjectRank = array(
'math' => array(65, 64, 63, 62),
'chinese' => array(67, 66, 65, 64),
'english' => array(69, 68, 67, 66)
);
//定义班级
$class = array();
//计算男女人数
$manNum = $personNum['man'];
$womanNum = $personNum['woman'];
//定义最终学生名单
$studentList = array();
//根据男女人数计算每个班级分配人数
foreach ($avgClassScore as $clazz => $score) {
//每个班级分配男生数量
$manPerClassNum = round($manNum / 4);
//每个班级分配女生数量
$womanPerClassNum = round($womanNum / 4);
// 把分配数量放入班级
$class["man_num"] = $manPerClassNum;
$class["woman_num"] = $womanPerClassNum;
$class["score"] = $score;
array_push($studentList, $class);
}
//计算学生名单
foreach ($studentList as $key => $value) {
$manNum = $value['man_num'];
$womanNum = $value['woman_num'];
$score = $value['score'];
//获取最近的男生成绩
for ($i = 0; $i < $manNum; $i++) {
$manScore = nearestScore($score, $subjectRank['math']);
$subjectRank['math'] = delScore($manScore, $subjectRank['math']);
$studentList[$key]['man_list'][] = $manScore;
}
//获取最近的女生成绩
for ($j = 0; $j < $womanNum; $j++) {
$womanScore = nearestScore($score, $subjectRank['chinese']);
$subjectRank['chinese'] = delScore($womanScore, $subjectRank['chinese']);
$studentList[$key]['woman_list'][] = $womanScore;
}
//判断英语成绩是否平均分
$allScore = 0;
for ($k = 0; $k < count($studentList[$key]['man_list']); $k++) {
$allScore += $studentList[$key]['man_list'][$k];
}
for ($l = 0; $l < count($studentList[$key]['woman_list']); $l++) {
$allScore += $studentList[$key]['woman_list'][$l];
}
$avgScore = $allScore / ($manNum + $womanNum);
//获取最近的英语成绩
$englishScore = nearestScore($avgScore, $subjectRank['english']);
$subjectRank['english'] = delScore($englishScore, $subjectRank['english']);
$studentList[$key]['english_score'] = $englishScore;
}
//根据最接近的数值获取成绩
function nearestScore($score, $arr)
{
$nearestScore = 0;
$temp = 0;
foreach ($arr as $key => $value) {
if (abs($score - $value) < $temp || $temp == 0) {
$temp = abs($score - $value);
$nearestScore = $value;
}
}
return $nearestScore;
}
//根据成绩从数组中去除
function delScore($score, $arr)
{
$arr1 = array();
foreach ($arr as $key => $value) {
if ($value != $score)
$arr1[] = $value;
}
return $arr1;
}
//输出最终学生名单
print_r($studentList);