Optimization 在一定约束条件下最小化两个列表元素的峰值差
我想使用scipy.optimize.minimize方法最小化list1[I]-list2[I]的峰值差异。 列表1和列表2中的元素是浮动 例如: list1=[50,50.5,52,53,55,55.5,56,57,60,61] 如果我有两个约束条件,如何最小化list1[I]-list2[I]: 1。list2=list1[0] 2。list2[i+1]-list2[i]NLP模型 这是NLP模型的“工作”版本。这种方法无法可靠地求解模型,因为它是不可微的Optimization 在一定约束条件下最小化两个列表元素的峰值差,optimization,scipy,mathematical-optimization,minimize,scipy-optimize-minimize,Optimization,Scipy,Mathematical Optimization,Minimize,Scipy Optimize Minimize,我想使用scipy.optimize.minimize方法最小化list1[I]-list2[I]的峰值差异。 列表1和列表2中的元素是浮动 例如: list1=[50,50.5,52,53,55,55.5,56,57,60,61] 如果我有两个约束条件,如何最小化list1[I]-list2[I]: 1。list2=list1[0] 2。list2[i+1]-list2[i]NLP模型 这是NLP模型的“工作”版本。这种方法无法可靠地求解模型,因为它是不可微的 import numpy as
import numpy as np
from scipy.optimize import minimize
list1 = np.array([50, 50.5, 52, 53, 55, 55.5, 56, 57,60, 61])
list1_0 = list1[0]
n = len(list1)
# our x variable will have one element less (first element is fixed)
list1x = np.delete(list1,0) # version with 1st element dropped
nx = len(list1x)
# objective function
# minimize the the maximum difference
# Notes:
# - x excludes first element (they are the same by definition)
# - this is non-differentiable so likely to be non-optimal
def maxDifference(x):
return np.max(np.abs(list1x - x))
# n-1 constraints
def constraint1(x):
return 1.5 - np.diff(np.insert(x,0,list1_0),1)
con1 = {'type': 'ineq', 'fun': constraint1}
#Optimize
x = 55*np.ones(nx) # initial value
sol = minimize(maxDifference, x, constraints=con1)
sol
# optimal is: x = [51.25,51.25,52.75,54.25,54.75,56.25,57.75,59.25,60.25]
# obj = 0.75
结果是:
fun: 5.0
jac: array([0., 0., 0., 0., 0., 0., 0., 0., 0.])
message: 'Optimization terminated successfully'
nfev: 20
nit: 2
njev: 2
status: 0
success: True
x: array([51.5, 53. , 54.5, 55. , 55. , 55. , 55. , 55. , 56. ])
这是非最优的:目标是5(而不是0.75)
LP模型
LP模型将找到经验证的最佳解决方案。这要可靠得多。例如:
import pulp as lp
list1 = [50, 50.5, 52, 53, 55, 55.5, 56, 57,60, 61]
n = len(list1)
model = pulp.LpProblem("Min_difference", pulp.LpMinimize)
x = lp.LpVariable.dicts("x",(i for i in range(n)))
z = lp.LpVariable("z")
# objective
model += z
# constraints
for i in range(n):
model += z >= x[i]-list1[i]
model += z >= list1[i]-x[i]
for i in range(n-1):
model += x[i+1] - x[i] <= 1.5
model += x[0] == list1[0]
model.solve()
print(lp.LpStatus[model.status])
print("obj:",z.varValue)
print([x[i].varValue for i in range(n)])
(1) 这是一个线性规划问题。也许最好使用LP解算器。(2) 差异应使用abs(列表1[i]-列表2[i])?(3) 最小化作为数组传递的x。您应该在obj和约束中使用该x。(4) 你可以通过打印调试东西。将print(“con”,list2)和print(“obj”,list2)添加到目标和约束中,以查看发生了什么,
import pulp as lp
list1 = [50, 50.5, 52, 53, 55, 55.5, 56, 57,60, 61]
n = len(list1)
model = pulp.LpProblem("Min_difference", pulp.LpMinimize)
x = lp.LpVariable.dicts("x",(i for i in range(n)))
z = lp.LpVariable("z")
# objective
model += z
# constraints
for i in range(n):
model += z >= x[i]-list1[i]
model += z >= list1[i]-x[i]
for i in range(n-1):
model += x[i+1] - x[i] <= 1.5
model += x[0] == list1[0]
model.solve()
print(lp.LpStatus[model.status])
print("obj:",z.varValue)
print([x[i].varValue for i in range(n)])
Optimal
obj: 0.75
[50.0, 51.25, 52.75, 53.75, 55.25, 56.25, 56.75, 57.75, 59.25, 60.25]