罚函数法

时间:2016-06-14 17:32:53

标签: python math

我正在尝试实现惩罚函数方法以最小化函数。我需要找到Rosenbrok's function的最小值。

我正在使用这个惩罚函数:

Penalty Function

Penalty Function

首先,我找到了使用$First_Array的最低要求:

$start_time = '';               // keep track of "no event" starts
$summary = array();             // array for event summary

foreach ( $First_Array as $time => $event ) {

    if ( '' === $start_time ) { // empty string means new start
        $start_time = $time;
        $summary[$start_time] = array(
          'e_name' => 'No events', 'e_start' => $start_time, 'e_end' => ''
        );
    }

    if ( is_array($event) ) {                   // array means there's an event
        $summary[$start_time]['e_end'] = $time; // end last 'no events'
        $summary[$time] = $event;               // add event to summary
        $start_time = '';                       // reset start
    }
}
$summary[$start_time]['e_end'] = $time;         // get last end time
print_r($summary);

答案是ksort($First_Array)scipy.optimize.minimize

然后我试图通过我的惩罚方法实现找到最小值:

from scipy.optimize import minimize, rosen
rz = lambda x: (1-x[0])**2 + 100*(x[1] - x[0]**2)**2;
h_1 = lambda x: (x[0] - 2 * x[1] + 2);
h_2 = lambda x: (-x[0] - 2 * x[1] + 6);
h_3 = lambda x: (-x[0] + 2 * x[1] + 2);

x0 = [2.3, 5];
cons = ({'type': 'ineq', 'fun': h_1},
       {'type': 'ineq', 'fun': h_2},
       {'type': 'ineq', 'fun': h_3}) 
minimize(rz, x0, constraints=cons)

这给了我x(如果我增加迭代次数,最终值会更大)。

我的实施中的错误在哪里? 感谢。

P.S。函数array([ 0.99971613, 0.99942073])特定于我的约束,当然,它们都是'不等式'类型。

1 个答案:

答案 0 :(得分:2)

您遇到的问题是公式中的h_i用于相等约束,而您要解决的问题是不等式约束,它们对应到公式中的g_i。因此,您的惩罚函数应该使用min(0, h_1(x))**2之类的术语而不是h_1(x)**2。要了解为何会出现这种情况,请考虑如果i = 1000x是所需的解决方案(1, 1)会发生什么。然后,惩罚将包括一个巨大的术语i * h_1(x)**2 = 1000

请注意,我使用了min而不是max,因为您要强制执行的不等式似乎是h_1(x) >= 0。这意味着只要h_1(x) >= 0,惩罚就应该为零,但只要h_1(x)变为负数,就会开始惩罚。如果它实际上是h_1(x) <= 0,那么您使用max(那么当您使用{{1}时,您必须使用h_1切换-h_1 }})。

顺便说一句,由于scipy.optimize.minimize通常是一个索引变量,因此将惩罚权重命名为其他内容可能更好,例如i