非負の制約に関する最適化の問題があります (以下のマイナス記号で変換する必要があります)。制約は次のように与えられます。
function
[neg_constraint,zero_con]=metric_con_130830(theta,v_b,spec,selector,time_all,lambda_all)
theta=exp(theta);
g_sum=selector*(lambda_all*theta.*time_all);
%minus v_b-g_sum because I want v_b-g_sum to be positive
neg_constraint=-(v_b-g_sum);
zero_con=[];
制約が時々違反されてもかまいません。特に、ベクトル (v_b-g_sum) のエントリの 20% (またはその他の数) が負であるかどうかは気にしません。コードでそれを効率的に取得する方法はありますか?
簡単な修正はこれを行うことです:
zero_con=sum((v_b-g_sum)<0)./length(g_sum)>.20
しかし、オプティマイザーがこのインジケーター関数でどれだけうまく最小値を見つけられるかは疑問です。これはあまりスムーズではありません。
または、ランダムなサンプル (サイズは 80%) を取得し、その方法で制約を確認することもできます。
zero_con=v_b-g_sum;
zero_con=zero_con(randsample(length(zero_con),round(.8*(length(zero_con)))));