#algorithm #dynamic-programming
#алгоритм #динамическое программирование
Вопрос:
Мой плавильный материал должен достичь требуемого свойства. Будет 2 набора материалов 1) Лом 2) ферросплавы Цель: Достичь целевого значения каждого элемента с минимальной стоимостью, например. После 1000 кг смеси Мы хотим достичь следующего свойства Углерод — 2,4% Кремний — 2,1% p — 0,015% S — 0,015%
Теперь из заданных наборов материалов мы определили значение, которое мы можем получить, например, из CRC (то есть лома) мы можем получить 1,1% углерода, из карбюризатора (ферросплавов) мы можем получить 78% углерода. Это означает, что если мы используем 100 кг CRC, мы можем получить 1,1 углерода, но мы используем 5 кг карбюризатора, мы можем получить 3,9 углерода. Итак, у нас есть все значения элементов для каждого материала. Кроме того, у нас есть цена каждого материала. Например, CRC составляет 25 рупий / кг. а науглероживатель составляет 1500 / кг. поэтому, соответственно, нам нужно смешать материал таким образом, чтобы он достиг целевого значения с минимальными затратами, например, для получения 2,4% углерода, если мы используем 100 кг лома, чем мы можем получить 1,1% углерода и требуемые 1,4, мы можемполучите от 1,8 кг науглероживателя, стоимость которого 2500 2700 = 5200 рупий. Это может быть любое количество комбинаций, из которых нам нужно найти решение с наименьшей возможной стоимостью, но требуется условие, материал должен быть подсчитан, например, ответ должен быть 701.5, чем это нормально, но это не должно быть 701.115, поскольку никто не собирается измерять 115 грамм, когда на самом деле собирается смешивать. Итак, нам нужно найти минимально возможную стоимость и для этого сколько кг какого материала следует использовать? это пример одного элемента, но мы должны достичь всего целевого элемента.
Входные данные: утильный материал и его значение элемента с его стоимостью
CRC Scrap C% — 1,5 Si% — 0,9 стоимость: 25 / кг
Чугун C% — 1,9 Si% — 1,1 Стоимость: 28 / кг
MS Scrap C% — 1,4 Si% — 0,9 Стоимость: 23,5 / кг
Стальной лом c% — 1,8 Si% — 1,5 Стоимость: 29 / кг
Ферросплавы
Карбюризатор C% — 80 Si% 0 Стоимость: 1000 / кг
Феррокремний C% — 0 Si%- 65 S% 10 Стоимость: 1200 / кг
Ферромарганец c% — 0 S% — 20 P% — 15 Стоимость: 500 / кг
Медь cu% — 98 Стоимость: 1500 / кг
Требуемое значение определено выше. Теперь нам нужно найти 1000 кг смеси лома и для достижения свойств использовать ферросплавы таким образом, чтобы стоимость была оптимальной.
Существует ли какой-либо алгоритм для решения такого рода задач? Или любой метод, который может помочь мне определить стоимость аренды?
Спасибо.
Ответ №1:
Все это можно представить в виде линейной программы. Получив это, вы можете подключить его к своему любимому решателю и получить решение, если это возможно.
Цель оптимизации, которую вы хотите минимизировать, — это общая стоимость:
f = w_CRC * cost_CRC w_pigIron * cost_pigIron ...
Это w_...
веса для каждого материала и представляют переменные оптимизации. Затраты являются постоянными величинами.
Затем вы добавляете следующие ограничения для моделирования ваших требований:
w_CRC w_pigIron w_MS ... = totalWeight
w_CRC >= 0, w_pigIron >=0, w_MS >= 0 ...
w_CRC * C_CRC w_pigIron * C_pigIron ... = desiredCWeight
w_CRC * Si_CRC w_pigIron * Si_pigIron ... = desiredSiWeight
C_
и Si_
являются пропорциями элемента в соответствующем материале и desiredXWeight = totalWeight * desiredXProportion
.
Если вы хотите убедиться, что ваши результаты являются «хорошими» числами, вы можете добавить ограничения интегральности и сделать это целочисленной линейной программой. Например, если вы хотите разрешить веса с точностью до первого знака после запятой, вы должны заменить веса w_X
0.1 * u_X
и решить для целых весовых коэффициентов u_X
. Затем вы получаете фактический вес w_X = 0.1 * u_X
. Тем не менее, я предполагаю, что первоначальная формулировка уже даст вам достаточно хорошие числа, где большинство весов, вероятно, равны нулю. Кроме того, накладывая ограничения на интегральность, вы можете сделать проблему неосуществимой. Таким образом, может потребоваться смягчить эти ограничения интегральности. Вы могли бы сделать это, изменив цель оптимизации на
f = (... what we had before...) a * ((w_CRC - 0.1 * u_CRC)^2 (w_pigIron - 0.1 * u_pigIron)^2 ...)
Здесь вы должны добавить целочисленные переменные u_X
и сделать свои веса w_X
близкими к представленному весу. Константа a
обозначает, насколько сильно вы хотите применить это ограничение.