Существует проблема разделения дефицитного ресурса среди группы пользователей, каждый из которых имеет равные права на ресурс, но некоторые из них по своей природе требуют меньше ресурсов, чем другие. Как тогда разделить ресурс? Методика совместного использования, широко применимая на практике, называется «Максимальная справедливая доля». Интуитивно понятно, что справедливая доля выделяет пользователю с «малым» спросом то, что он хочет, и равномерно распределяет неиспользуемые ресурсы «крупным» пользователям. Максимальное распределение справедливой доли формально определяют следующим образом:
– ресурсы распределяются в порядке возрастания спроса;
– ни один пользователь не получает долю ресурса, превышающую его спрос;
– пользователи с неудовлетворёнными требованиями получают равную долю ресурса.
Пользовательская функция
MaxMinFair - функция справедливого распределения ресурсов между несколькими требованиями. Первый аргумент - диапазон с требованиями, второй - количество ресурса.
Код |
---|
Function MaxMinFair(DataRange As Variant, Supply As Double) As Variant
Dim i As Long, n As Long, u As Long
Dim Allocated() As Double, Available As Double, Share As Double
If TypeName(DataRange) = "Range" Then DataRange = DataRange.Value2
If Supply <= 0 Or UBound(DataRange, 2) > 1 Then Exit Function
u = UBound(DataRange, 1)
For i = 1 To u
If DataRange(i, 1) < 0 Then
Exit Function
ElseIf DataRange(i, 1) > 0 Then
n = n + 1
End If
Next i
Available = Supply
ReDim Allocated(1 To u, 1 To 1)
Do Until n = 0 Or Available = 0
Share = Available / n
n = 0: Available = 0
For i = 1 To u
If Allocated(i, 1) < DataRange(i, 1) Then Allocated(i, 1) = Allocated(i, 1) + Share
Next i
For i = 1 To u
If Allocated(i, 1) >= DataRange(i, 1) Then
Available = Available + Allocated(i, 1) - DataRange(i, 1)
Allocated(i, 1) = DataRange(i, 1)
Else
n = n + 1
End If
Next i
Loop
MaxMinFair = Allocated
End Function |