Вы не можете максимизировать случайность и справедливость одновременно, так что приходится давать.Я думаю, вы не должны рисковать быть несправедливыми по отношению к вашей жене, и поэтому справедливость должна преобладать!
Справедливость за счет случайности
Этот подход сортирует элементы в порядке убывания времени, а затем случайным образом назначает им элементыкаждому человеку, если это назначение не будет несправедливым.
Расчет справедливости здесь заключается в том, что максимальная разница во времени должна составлять самое большее продолжительность самой быстрой задачи.
$DescendingOrder = $Taches.Keys | Sort-Object -Descending { $Taches[$_] }
$Measures = $Taches.Values | Measure-Object -Sum -Minimum
$UnfairLimit = ($Measures.Sum + $Measures.Minimum) / 2
$Person1 = @{}
$Person2 = @{}
$Total1 = 0
$Total2 = 0
foreach ($Item in $DescendingOrder) {
$Time = $Taches[$Item]
$Choice = Get-Random 2
if (($Choice -eq 0) -and (($Total1 + $Time) -gt $UnfairLimit)) {
$Choice = 1
}
if (($Choice -eq 1) -and (($Total2 + $Time) -gt $UnfairLimit)) {
$Choice = 0
}
if ($Choice -eq 0) {
$Person1[$Item] = $Time
$Total1 += $Time
} else {
$Person2[$Item] = $Time
$Total2 += $Time
}
}
Пример выполнения:
PS> $Person1 | ConvertTo-Json
{
"Comptoir": 5,
"Lavabos": 10,
"Litières": 5,
"Couvertures lit": 5,
"Douche": 15,
"Lave-Vaisselle": 10
}
и другое лицо:
PS> $Person2 | ConvertTo-Json
{
"Moppe plancher": 20,
"Toilette": 5,
"Balayeuse plancher": 20,
"Poubelles": 5,
"Poele": 5
}
Случайность за счет справедливости
Этот подход заключается в рандомизации списка, просмотре каждого элемента и назначенииэто человеку, которому на данный момент отведено наименьшее количество времени.
Более ранние решения могут означать, что более поздние решения оказываются несправедливыми.
$RandomOrder = $Taches.Keys | Sort-Object { Get-Random }
$Person1 = @{}
$Person2 = @{}
$Total1 = 0
$Total2 = 0
foreach ($Item in $RandomOrder) {
$Time = $Taches[$Item]
if ($Total1 -lt $Total2) {
$Person1[$Item] = $Time
$Total1 += $Time
} else {
$Person2[$Item] = $Time
$Total2 += $Time
}
}
Пример выполнения:
PS> $Person1 | ConvertTo-Json
{
"Poele": 5,
"Douche": 15,
"Couvertures lit": 5,
"Lave-Vaisselle": 10,
"Balayeuse plancher": 20,
"Toilette": 5
}
и другой человек:
PS> $Person2 | ConvertTo-Json
{
"Lavabos": 10,
"Comptoir": 5,
"Poubelles": 5,
"Litières": 5,
"Moppe plancher": 20
}