擅长:python、mysql、java
<blockquote>
<p>x is between 0 and 15 and between 30 and 50</p>
</blockquote>
<p>这将使模型不可行。没有这样的<code>x</code>。你可能是说:</p>
<p>x在0和15之间<strong>或</strong>在30和50之间</p>
<p>这是非凸的,因此标准局部解算器对此有困难。它通常使用额外的二进制变量建模:</p>
<pre><code>30 δ ≤ x ≤ 15(1-δ) + 50 δ
δ ∈ {0,1}
</code></pre>
<p>当然,这假设您可以处理二进制变量(SLSQP不能)。具有二元变量和非线性约束(或目标函数)的模型称为MINLP模型(混合整数非线性规划)。这类模型的求解器是现成的。在</p>
<p>其他一些可行的方法:</p>
<ul>
<li>把问题解决两次。一次使用<code>0 ≤ x ≤ 15</code>,一次使用<code>30 ≤ x ≤ 50</code>。然后选择最好的解决方案。在</li>
<li>使用<code>scipy.optimize.basinhopping</code>全局解算器帮助您摆脱局部最优。这不是一个严格的算法(没有保证),但它可以帮助。在</li>
</ul>
<p>一些通常不起作用的方法:</p>
<ul>
<li>使用连续变量<code>δ ∈ [0,1]</code>并添加约束<code>δ(1-δ)=0</code>,而不是二进制变量<code>δ ∈ {0,1}</code>。通常这会让你陷入困境。在</li>
<li>另一个答案是多项式方法:这也是非凸的,不太适合SLSQP。你会陷入局部最优。在</li>
<li>如果<code>x ∈ [15,30]</code>,则向目标添加惩罚。局部解算器也不适用。在</li>
</ul>