一個(gè)均勻合理分配工作的算法

function cal($jobs, $persons) {
    // 將任務(wù)轉(zhuǎn)換為包含id和時(shí)間的數(shù)組,并按時(shí)間降序排序
    $sortedJobs = [];
    foreach ($jobs as $id => $time) {
        $sortedJobs[] = ['id' => $id, 'time' => $time];
    }
    usort($sortedJobs, function ($a, $b) {
        return $b['time'] - $a['time'];
    });

    // 初始化員工數(shù)據(jù)
    $personData = [];
    foreach ($persons as $person) {
        $personData[$person] = [
            'total' => 0,
            'jobs' => []
        ];
    }

    // 分配任務(wù)給員工(貪心算法)
    foreach ($sortedJobs as $job) {
        // 找到當(dāng)前總工時(shí)最少的員工
        $minTotal = PHP_INT_MAX;
        $selectedPerson = null;
        foreach ($personData as $person => $data) {
            if ($data['total'] < $minTotal) {
                $minTotal = $data['total'];
                $selectedPerson = $person;
            }
        }
        // 分配任務(wù)
        $personData[$selectedPerson]['total'] += $job['time'];
        $personData[$selectedPerson]['jobs'][] = $job;
    }

    // 將任務(wù)分配到天數(shù)(每天最多5小時(shí))
    $result = [];
    foreach ($personData as $person => $data) {
        $jobsList = $data['jobs'];
        // 按任務(wù)耗時(shí)降序排序以優(yōu)化天數(shù)分配
        usort($jobsList, function ($a, $b) {
            return $b['time'] - $a['time'];
        });

        $days = [];
        $currentDay = 1;
        $currentDayTime = 0;
        $currentJobs = [];
        foreach ($jobsList as $job) {
            $time = $job['time'];
            if ($currentDayTime + $time <= 5) {
                $currentDayTime += $time;
                $currentJobs[] = $job['id'];
            } else {
                $days[] = [
                    'day' => '第' . $currentDay . '天',
                    'jobs_id' => $currentJobs
                ];
                $currentDay++;
                $currentDayTime = $time;
                $currentJobs = [$job['id']];
            }
        }
        if (!empty($currentJobs)) {
            $days[] = [
                'day' => '第' . $currentDay . '天',
                'jobs_id' => $currentJobs
            ];
        }
        $result[$person] = $days;
    }

    return $result;
}


$jobs = [  // 工作key  => 工時(shí)
    "1423" => 1, 
    "1424" => 1,
    "1501" => 2,
    "1392" => 1,
    "1391" => 1,
    "1464" => 4,
    "1484" => 1,
    "1493" => 4, 
    "1403" => 1,
    "1395" => 1,
    "1399" => 2,
    "1402" => 1,
    "1489" => 2,
    "1490" => 1,
    "1491" => 1, 
];
$persons = ["superman", "batman", "heiguafu"];

$result = cal($jobs, $persons);
print_r($result);


//輸出結(jié)果
λ php cal.php
Array
(
    [superman] => Array
        (
            [0] => Array
                (
                    [day] => 第1天
                    [jobs_id] => Array
                        (
                            [0] => 1464
                        )

                )

            [1] => Array
                (
                    [day] => 第2天
                    [jobs_id] => Array
                        (
                            [0] => 1489
                            [1] => 1484
                            [2] => 1402
                        )

                )

        )

    [batman] => Array
        (
            [0] => Array
                (
                    [day] => 第1天
                    [jobs_id] => Array
                        (
                            [0] => 1493
                            [1] => 1423
                        )

                )

            [1] => Array
                (
                    [day] => 第2天
                    [jobs_id] => Array
                        (
                            [0] => 1392
                            [1] => 1403
                            [2] => 1490
                        )

                )

        )

    [heiguafu] => Array
        (
            [0] => Array
                (
                    [day] => 第1天
                    [jobs_id] => Array
                        (
                            [0] => 1501
                            [1] => 1399
                            [2] => 1424
                        )

                )

            [1] => Array
                (
                    [day] => 第2天
                    [jobs_id] => Array
                        (
                            [0] => 1391
                            [1] => 1395
                            [2] => 1491
                        )

                )

        )

)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容