<p>通过折叠频率和压力约束作为对整体适应度的惩罚,使这成为一个单值优化问题可能是最简单的,比如</p>
<pre><code>LOW_COST = 10.
MID_COST = 150.
HIGH_COST = 400.
def weight(a, b, c, d):
return "calculated weight of structure"
def frequency(a, b, c, d):
return "calculated resonant frequency"
def freq_penalty(freq):
# Example linear piecewise penalty function -
# increasing cost for frequencies below 205 or above 395
if freq < 205:
return MID_COST * (205 - freq)
elif freq < 395:
return 0.
else:
return MID_COST * (freq - 395)
def stress_fraction(a, b, c, d):
return "calculated stress / failure criteria"
def stress_penalty(stress_frac):
# Example linear piecewise penalty function -
# low extra cost for stress fraction below 0.85,
# high extra cost for stress fraction over 0.98
if stress_frac < 0.85:
return LOW_COST * (0.85 - stress_frac)
elif stress_frac < 0.98:
return 0.
else:
return HIGH_COST * (stress_frac - 0.98)
def overall_fitness(parameter_vector):
a, b, c, d = parameter_vector
return (
# D'oh! it took me a while to get this right -
# we want _minimum_ weight and _minimum_ penalty
# to get _maximum_ fitness.
-weight(a, b, c, d)
- freq_penalty(frequency(a, b, c, d))
- stress_penalty(stress_fraction(a, b, c, d)
)
</code></pre>
<p>。。。当然,你会想找到更合适的惩罚函数和使用相对权重,但这应该给你一个大概的想法。然后你就可以把它最大化</p>
^{pr2}$
<p>(使用lambda可以让fmin(一个最小值)找到一个最大值,以获得整体拟合度)。在</p>
<p>或者,<code>fmin</code>允许在每次迭代后应用回调函数;如果您知道如何适当地调整a、b、c、d,可以使用它来对频率施加硬限制,比如</p>
<pre><code>def callback(x):
a, b, c, d = x # unpack parameter vector
freq = frequency(a, b, c, d)
if freq < 205:
# apply appropriate correction to put frequency back in bounds
return [a, b, c + 0.2, d]
elif freq < 395:
return x
else:
return [a, b, c - 0.2, d]
</code></pre>