У меня есть работающая реализация php алгоритма Форда Фулкерсона, основанная на этой замечательной статье. http://www.geeksforgeeks.org/maximum-bipartite-matching/
На данный момент матрица, управляющая алгоритмом, может иметь в своих ячейках значение 1 или 0, чтобы представлять возможность каждого сотрудника работать на этой должности. Я хотел бы добавить емкость алгоритму, в основном поместить в матрицу более высокие значения, такие как 2, 3 и так далее, чтобы выразить предпочтение выбирать сотрудника вместо другого.
Есть ли у вас какие-либо предложения о том, как отредактировать алгоритм для увеличения мощности?
Это код алгоритма:
function maxMatch($matrix, $cols) {
$match = array();
foreach ($cols as $v => $item) {
$match[$item] = -1;
}
$result = 0;
foreach ($matrix as $u => $row) {
$seen = array();
foreach ($cols as $v => $item) {
$seen[$item] = 0;
}
if ($this->checkVertex($matrix, $u, $seen, $match)) {
print_r($match);
$result++;
}
}
return $match;
}
function checkVertex($matrix, $u, &$seen, &$match) {
foreach ($matrix[$u] as $v => $row) {
if ($matrix[$u][$v] && !$seen[$v]) {
$seen[$v] = TRUE;
if ($match[$v] < 0 || $this->checkVertex($matrix, $match[$v], $seen, $match)) {
$match[$v] = $u;
return TRUE;
}
}
}
return FALSE;
}
Вот как я создаю матрицу:
function createMatrix($year, $month, $day, $shift) {
global $sql;
$result = $sql->query("VERY HUGE SELECT FOR EMPLOYEES AND POSITIONS MATCH");
while ($row = $result->fetch_assoc()) {
$matrix[$row['employee']][$row['position']] = 1;
}
return $matrix;
}
Большое спасибо,
Marco
Задача ещё не решена.
Других решений пока нет …