or-tools - вычисляет stdev из SumArray () - PullRequest
2 голосов
/ 23 марта 2019

Мне нужно создать планирование для сотрудников с помощью инструментов оптимизации Google.Одним из ограничений будет то, что у каждого сотрудника будет примерно одинаковое количество рабочих часов.

Таким образом, я хочу собрать в списке, сколько часов работает каждый сотрудник, а затем минимизировать стандартное отклонение этого списка..

var workingTimes = new List<SumArray>();
foreach (var employee in employees) {
    // Gather the duration of each task the employee is
    // assigned to in a list
    // o.IsAssign is an IntVar and task.Duration is an int
    var allDurations = shifts.Where(o => o.Employee == employee.Name)
                .Select(o => o.IsAssigned * task[o.Task].Duration);

    // Total time the employee is working
    var workTime = new SumArray(allDurations);
    workingTimes.Add(workTime);
}

Теперь я хочу минимизировать стандартное значение workingTimes.Я попробовал следующее:

IntegerExpression workingTimesMean = new SumArray(workingTimes) * (1/workingTimes.Count);    
var gaps = workingTimes.Select(o => (o - workingTimesMean)*(o - workingTimesMean));
var stdev = new SumArray(gaps) * (1/gaps.Count());
model.Minimize(stdev);

Но запрос LINQ во 2-й строке последнего фрагмента кода выдает мне ошибку:

Невозможно применить оператор * к IntegerExpressionи IntegerExpression

Как вычислить стандартное отклонение для Google.OrTools.Sat.SumArray?

1 Ответ

2 голосов
/ 23 марта 2019

«Естественный» API поддерживает только линейные выражения. Вам необходимо использовать API AddProductEquality ().

Обратите внимание, что 1 / Gaps.Count () всегда будет возвращать 0 (мы в целочисленной арифметике). Так что вам нужно все масштабировать.

Лично я бы просто минимизировал немасштабированную сумму абс (вал - среднее). Не нужно делить на количество элементов. Просто убедитесь, что вычисление среднего значения имеет правильную точность (еще раз, мы в целочисленной арифметике).

Вы могли бы также рассмотреть возможность минимизировать максимум (абс (val - среднее значение)). Это проще и может быть достаточно хорошим.

...