Вот проблема комбинаторной оптимизации в реальном мире.
Нам задан большой набор ценностных предложений для некоторого произведения. Ценностные предложения имеют разные типы, но каждый тип является независимым и добавляет равную выгоду всему продукту. При создании продукта мы можем включить любое неотрицательное целое число "единиц" каждого типа. Однако после добавления первой единицы определенного типа предельное преимущество дополнительных единиц этого типа постоянно уменьшается. Фактически, предельное преимущество нового блока - это инверсия числа единиц этого типа после добавления нового блока. Из-за этого требования наш продукт должен иметь хотя бы одну единицу какого-либо типа, и из-за этого требуется небольшая коррекция, которую мы должны сделать для общего значения.
Пусть T[]
- массив, представляющий число каждого типа в определенном производственном прогоне продукта. Тогда общее значение V
задается (псевдокодом):
V = 1
For Each t in T
V = V * (t + 1)
Next t
V = V - 1 // correction
Со стороны затрат единицы одного типа имеют одинаковую стоимость. Но единицы разных типов имеют уникальные иррациональные издержки. Количество типов велико, но нам присваивается массив затрат типа C[]
, который сортируется от наименьшего к самому большому. Пусть далее предположим, что массив типов типов T[]
также сортируется по цене от минимального до самого большого. Тогда общая стоимость U
представляет собой просто сумму каждой единицы стоимости:
U = 0
For i = 0, i < NumOfValueTypes
U = U + T[i] * C[i]
Next i
Пока все хорошо. Итак, вот проблема: заданный продукт P
со значением V
и стоимостью U
, найдите продукт Q
со стоимостью U'
и значением V'
, имеющей минимальный U'
такой, что U' > U
, V'/U' > V/U
.