Я пытаюсь решить задачу оптимизации. Для решения этой проблемы я использую PuLP. Однако оптимальное решение, данное решателем, не учитывает ограничения, которые я налагаю в коде. Это абсурд и я не понимаю.
Описание проблемы: Я хочу решить проблему, изображенную на картинке
Проблема оптимизации, которую я хочу решить
"sc" означает "в условиях ограничений" и: f(p, e) = 20 sum_{i=0}^12 s_i + 50 \sum_{i=0}^{11}e {p[i+1]-p} с s_m = s_0 + sum_{i=1}^m (p_m - d_m)
Последовательность u просто проверяет u=sign(p[i+1]-p)
d — заданная последовательность элементов.
def q(e, X, p0): # Constantes et données de l'énonce mois = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12' ] mois0 = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11' , '12'] е = {'1': е[0], '2': е[1], '3': е[2], '4': е[3], '5': е[4], '6': е[5], '7': е[6], '8': е[7], '9': е[8], '10': е[9], '11': е[10], '12': е[11]} # Определение проблемы prob = LpProblem("Планирование производства", LpMinimize) # Определение переменных p = LpVariable.dicts("mois", mois0, 0) # Объект функции защита lst_mois(м): Л=[] для i в диапазоне (1, m+1): L.append(str(i)) вернуть Л проб += lpSum([20 * (s0 + lpSum([p - d для i в lst_mois(int(m))])) для m в mois0]) + lpSum([50 * e[ i] * (p - p[str(int(i)-1)]) for i in mois]), "Coût à Constante Près" # Противопоказания для м в месяцах: проб += (s0 + lpSum([p - d для i в lst_mois(int(m))])) >= 0, m потому что я в моем: prob += e * (p[i] - p[str(int(i)-1)]) >= 0, "Contrainte de Signe" +i если X < np.inf: потому что я в моем: проб += p[i] Результат неудовлетворительный, поскольку второе ограничение не соблюдается. Действительно, результат:
[600.0, 466.25, 600.0, 600.0, 282.5, 282.5, 282.5, 282.5, 282.5, 282.5, 0.0, 0.0, 0.0] и оказывается, что второе ограничение никогда не соблюдается.
Я пытаюсь решить задачу оптимизации. Для решения этой проблемы я использую PuLP. Однако оптимальное решение, данное решателем, не учитывает ограничения, которые я налагаю в коде. Это абсурд и я не понимаю.
Описание проблемы: Я хочу решить проблему, изображенную на картинке Проблема оптимизации, которую я хочу решить
[img]https://i.stack.imgur.com/xuK7D.png[/img]
"sc" означает "в условиях ограничений" и: f(p, e) = 20 sum_{i=0}^12 s_i + 50 \sum_{i=0}^{11}e[i] {p[i+1]-p[i]} с s_m = s_0 + sum_{i=1}^m (p_m - d_m)
Последовательность u просто проверяет u[i]=sign(p[i+1]-p[i])
d — заданная последовательность элементов.
def q(e, X, p0): # Constantes et données de l'énonce mois = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12' ] mois0 = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11' , '12'] е = {'1': е[0], '2': е[1], '3': е[2], '4': е[3], '5': е[4], '6': е[5], '7': е[6], '8': е[7], '9': е[8], '10': е[9], '11': е[10], '12': е[11]} # Определение проблемы prob = LpProblem("Планирование производства", LpMinimize) # Определение переменных p = LpVariable.dicts("mois", mois0, 0) # Объект функции защита lst_mois(м): Л=[] для i в диапазоне (1, m+1): L.append(str(i)) вернуть Л проб += lpSum([20 * (s0 + lpSum([p[i] - d[i] для i в lst_mois(int(m))])) для m в mois0]) + lpSum([50 * e[ i] * (p[i] - p[str(int(i)-1)]) for i in mois]), "Coût à Constante Près" # Противопоказания для м в месяцах: проб += (s0 + lpSum([p[i] - d[i] для i в lst_mois(int(m))])) >= 0, m потому что я в моем: prob += e[i] * (p[i] - p[str(int(i)-1)]) >= 0, "Contrainte de Signe" +i если X < np.inf: потому что я в моем: проб += p[i] Результат неудовлетворительный, поскольку второе ограничение не соблюдается. Действительно, результат:
[600.0, 466.25, 600.0, 600.0, 282.5, 282.5, 282.5, 282.5, 282.5, 282.5, 0.0, 0.0, 0.0] и оказывается, что второе ограничение никогда не соблюдается.