Optimization 在一定约束条件下最小化两个列表元素的峰值差

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

我想使用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 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]