背景:一艘船停泊在码头上,使用24条系泊缆绳和4艘挡泥板。这些系泊线需要由经验丰富的工程师预先张紧到设计值。通过设定每个系泊绳的适当长度来完成预张紧。进行静态模拟以获得线上的张力和挡泥板上的压缩。这是一个迭代过程,因为系泊线长度的微小变化可能会导致张力的显着变化。
问题描述: 建立目标函数以将系泊线长度作为输入数组并返回目标和实现的预拉伸值之间的绝对差值之和。
现在,我正在使用scipy.optimize.minimize函数,其中包含以下选项:
car
但是,优化器不会改变输入数组。结果与初始输入数组target_wire_lenghts = {'Line1': (48.0, 49.0),'Line2': (48.0, 49.0),'Line3': (45.0,46.0),
'Line4': (10.0,11.0),'Line5': (8.0,9.0),'Line6': (7.0,8.0),
'Line7': (46.0,47.0),'Line8': (48.0,49.0),'Line9': (50.0,51.0),
'Line10': (33.0,34.0),'Line11': (31.0,32.0),'Line12': (29.0,30.0),
'Line13': (32.0,33.0),'Line14': (34.0,35.0),'Line15': (36.0,37.0),
'Line16': (48.0,49.0),'Line17': (46.0,47.0),'Line18': (45.0,46.0),
'Line19': (8.0,9.0), 'Line20': (8.0,9.0), 'Line21': (9.0,10.0),
'Line22': (44.0,45.0),'Line23': (45.0,46.0), 'Line24': (46.0,48.0)}
# Bounds
bounds = list(target_wire_lenghts.values())
# Initial guess
x0 = [np.mean([min, max], axis=0) for min,max in bounds]
# Options
options = {'ftol' : 0.1,
'xtol' : 0.1,
'gtol' : 0.1,
'maxiter' : 100,
'accuracy' : 0.1}
result = minimize(objfn, x0, method = 'TNC', bounds = bounds, options = options)
print(result)
相同(请参阅下面的长度列)。我尝试使用'TNC'解算器的可选公差参数,但没有看到任何改进。另外,请注意,尽管我已经设置了x0
,但迭代仍然是130.
请在调用最小化函数时建议我犯了什么错误。
编辑:我认为优化正在运行,但一次更改变量0.000001。选项参数maxiter = 100
(用于jacobian的数值近似的步长。)设置为0.01时,优化看起来有效。不幸的是,它仍然无法达成合理的解决方案。我尝试进行无限制的优化,初始猜测eps
非常接近答案(我通过手动更改每个变量找到),然后优化器能够提供比手动更好的解决方案。
所以现在的问题是如何在初始猜测错误的情况下快速进行24变量优化?多目标优化能否成为答案,达到每条线的预张力是一个目标?