主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

線形実行不可能性の調査

この例では,問題が実行不可能となる線形制約を調査する方法を説明します。これらの手法の詳細については,这个[1]および[2]を参照してください。

线路制约によって问题が行行不可能になるなる削除ば残りのメンバー问题がすれになるいう条件で実探しになるいうで,但是そのようなサブセットを,“制约の既约実行不可サブセット”(IIS)といいます。反対に,実“最大実行可能サブセット”(maxf)と呼ばれます。この2つの概念は関連していますが,同一ではありません。問題によっては,多数の異なるIISが含まれ,濃度も異なる場合があります。

この例では,IISを見つける2つの方法と,実行可能な制約のセットを取得する2つの方法を説明します。この例では,指定されたすべての境界が正しい,つまり,引数と乌兰巴托引数にエラーはないことを前提とします。

行排不可能な

サイズが150行15列の線形不等式を表す乱数行列一种を作物成し。対応するベクトルB.を10個のエントリをもつベクトルに設定し,それらの値のうち5%を-10に変更します。

N = 15;rng默认的a = randn([10 * n,n]);b = 10 * =(尺寸(a,1),1);AEQ = [];beq = [];B(兰特(尺寸(b))<= 0.05)= -10;f = 1(n,1);lb = -f;UB = F;

问题が実行不可能であることを確認します。

[x, fval exitflag、输出λ)= linprog (f, A、b Aeq,说真的,磅,乌兰巴托);
没有找到可行的解决办法。Linprog停止了,因为没有点满足约束。

削除フィルター

IISを特定するには,次の手順を実行します。1からNまでの番号が付いた線形制約があり、すべての問題の制約が実行不可能であるとします。

1からNまでの各一世について次を行います。

  • 問題から制約一世を一時的に削除します。

  • 得られた问题の実実性性をテストします。

  • 制约一世なしで問題が実行可能であれば,制約一世を問題に戻します。

  • 制约一世なしでは問題が実行不可能であれば,制約一世は問題に戻しません。

次の一世に進みます(値Nまで)。

この手順の終了時に問題に残っている制約がIISとなります。

このこの手顺を装载するMATLAB®コードコードについて,补助关联DeletionFilter.この例の终わりに掲载)ををしてください。

メモ:この例のライブスクリプトファイルを使用する場合は,関数DeletionFilter.が既にファイルの末尾に含まれています。それ以外の場合は,この関数をmファイルの末尾に作成するか,MATLABパス上のファイルとして追加する必要があります。このことは,この例で後ほど使用される他の補助関数についても当てはまります。

サンプルデータでDeletionFilter.の效果を确认します。

[ineqs,方程式,ncall] = deletionfilter (A, b, Aeq,说真的,磅,乌兰巴托);

この問題には等式制約がありません。不等式制約のインデックスとb (iis)の値を見つけます。

IIS =查找(INEQS)
IIS = 114.
b (iis)
ans = -10

境界制約とともに問題を実行不可能にしている不等式制約は1つだけです。制約は次のとおりです。

:一个(iis) * x < = b (iis)

一种の当該行について,その絶対値の和を求めます。

DISP(SUM(ABS(A(IIS,:))))))
8.4864

境界があるので,Xベクトルベクトル-1と1の间の値をとるため,a(IIS,:) * xb (iis)= -10未満にはなり得ません。

DeletionFilter.linprog呼び出しを何回実行したでしょうか。

disp (ncall)
150

問題には150件の線形制約があるため,この関数はlinprogを150回呼び出しました。

弾性フィルター

この弾性フィルターを试してみましょうフィルターフィルター,このフィルターは,次は,次のように能。

まず,各制約一世が正の量E(i)によってによって违反されることをしししし,で,等式制约は,加法的な正ののののと减减减减减减减値値ををの値値をもちます。

一种 一世 N E. 问: X B. 一世 N E. 问: + E. 一种 E. 问: X = B. E. 问: + E. 1 - E. 2

次に,以下の关键词计画计画(lp)を解きます。

最小值 X E. E. 一世

これは,リストされた制约および E. 一世 0. ににます。

  • 関連するLPに解があれば,厳密に正である関連 E. 一世 。

  • 关键词LPに解がない(传行不可能),または厳密に正である关联 E. 一世 がが结合は,フィルターを终了し。

弾性フィルターは,削除フィルターよりも大幅に少ない反復回数で終了できます。弾性フィルターは一度に多くのインデックスを IIS として特定可能であり、インデックスのリスト全体を検証することなく中止できるためです。しかし、この問題には元の問題よりも多くの変数が含まれており、得られるインデックスのリストが IIS よりも大きくなる可能性があります。弾性フィルターの実行後に IIS を見つけるには、結果に対して削除フィルターを実行します。

このこのフィルターを装载するMATLAB®コードコードについて,补助关联弹性滤片この例の终わりに掲载)ををしてください。

サンプルデータで弹性滤片の效果を确认します。

[ineqselastic, eqselastic ncall] =...Aeq elasticfilter (A, b,说真的,磅,乌兰巴托);

この問題には等式制約がありません。不等式制約のインデックスを見つけます。

iiselastic =找到(ineqselastic)
iiselastic =5×12 60 82 97 114

弾性IISでは5つの制约制约ががリストされれますますますががのみでは検出れれ制约のみたに対して削除フィルターフィルターをしたセットセット削除削除しししてててててててててててのみのみてのののののののののののののの当当当当のの

A_1 = A(ineqselastic > 0,:);B_1 = b(inqselastic > 0);[dineq_iis, deq_iis ncall2] = deletionfilter (A_1、b_1、Aeq,说真的,磅,乌兰巴托);iiselasticdeletion =找到(dineq_iis)
iiselasticdeletion = 5

弾性フィルターの結果における5番目の制約,不等式114がそのIISです。この結果は,削除フィルターの回答とも一致します。これらの手法の違いは,弾性フィルターと削除フィルターを組み合わせた場合に,使用されるlinprog呼び出しの回数が大幅に少なくなるということです。弾性フィルターによって使用され、次いで削除フィルターによって使用されるlinprog呼び出しの合計回数を表示します。

disp (ncall + ncall2)
7.

ループででiisの削除

一般に1つのIISを取得するだけでは,最適化問題が解けない理由のすべてを見つけることはできません。実行不可能な問題を修正するには,IISを見つけて問題から削除することを,その問題が実行可能になるまで繰り返します。

次のコードは,問題が実行可能になるまで,その問題から一度に1つずつIISを削除する方法を示しています。このコードは,インデックス付け手法を使用して,アルゴリズムが何らかの制約を削除する前に,元の問題における制約の位置という観点から制約を追跡します。

コードは問題に含まれる元の変数を追跡するために,ブールベクトルactiveAを使用しし行列一种の現在の制約(行)を表し,ブールベクトルactiveAeqを使用しし行列AEQ.の现を表します。制约制约追加または削除际,制约の数量変化しも行番がが変変番ようよう,に一种またはAEQ.にインデックスを付与します。

このコードを実行するとIDX2.がが返され。これこれ,activeAの非ゼロ要素を示すインデックスのベクトルであり,次のようになります。

idx2 =找到(activeA)

varIDX2.と同じ長さのブールベクトルであると仮定します。この場合

IDX2(find(var))

は,varを元の问题问题问题へインデックスとして表现します。このこのに,インデックス付けでは制约ののサブセットをして,より小さなサブセットサブセット操操,元元问题问题をよりより明确に参照することこと确よりに参照することこと可以です。

opts = Optimoptions('linprog'“显示”“没有任何”);actea = true(大小(b));activeaeq = true(大小(beq));[〜,〜,EXITFLAG] = LINPROG(F,A,B,AEQ,BEQ,LB,UB,OPTS);ncl = 1;Exitflag < 0 [ineqselastic,eqselastic,ncall] =...ElasticFilter(A(Activea,:),B(Activea),AEQ(ActiveAeq,:),Beq(ActiveAQ),LB,UB);NCL = NCL + ncall;idxaa = find(activea);idxae =查找(activeaeq);tmpa = idxaa(查找(Ineqselastic));tmpae = idxae(查找(eqselastic));aa = a(tmpa,:);bb = b(tmpa);ae = aeq(tmpae,:);be = beq(tmpae); [ineqs,eqs,ncall] =...deletionfilter (AA、bb AE,磅,乌兰巴托);NCL = NCL + ncall;activeA (tmpa (ineqs)) = false;activeAeq (tmpae(方程式))= false;disp (['删除不平等',Int2str((TMPA(INEQS))'),"平等"int2str ((tmpae(方程式 ))')]) [~,~, exitflag] =...Linprog(F,A(Activea,:),B(Activea),AEQ(ActiveAeq,:),BeQ(ActiveAQ),LB,UB,OPTS);ncl = ncl + 1;结尾
删除不等式114和等式删除不等式97和等式删除不等式64 82和等式删除不等式60和等式
fprintf(“Linprog的数量:%d \ n',ncl)
Linprog呼叫数量:28

ループが不成式64および82を同时にししいるから,これら2つの制约がiisとなることがます。

maxfsの検出

実行可能な制約のセットを取得するためのもう1つの手法は,maxfを直接見つけることです。这个[1]で説明されているように,maxfの検出はNP完全問題であり,問題がmaxfを見つけるための効率的なアルゴリズムを必ずしももつわけではないことを意味します。しかし,这个は,効率的に機能し得るいくつかのアルゴリズムを推奨しています。

Chinneckの算法7.3を使用して,削除时に実行可なを提供する,制约の”“カバーセットを見つけます。このアルゴリズムは,補助関数generatecoverこの例の终わりに掲載)内に実装されています。

[CoverseTineQ,CovereTeq,NLP] = Generatecover(A,B,AEQ,BEQ,LB,UB)
coversetineq =5×1114 97 60 82 2
CovereQeeq = []
nlp = 40

これらの制約を削除し,LPを解きます。

USEMEINEQ = TRUE(大小(b));USEMEINEQ(COVESETINEQ)= FALSE;去掉不等式约束usemeeq = true(大小(说真的));usemeeq (coverseteq) = false;%删除平等约束[x, fvals exitflags] =...Linprog(F,A(Usemeineq,:),B(Usemeineq),AEQ(USEMEEQ),BEQ(USEMEEQ),LB,UB);
找到最优解。

このカバーセットが弾性フィルターで得られたIiselastic.セットと完全に同一であることに注意してください。一般に,弾性フィルターが検出するカバーセットは大きすぎます。这个7.3はの算法,弾性フィルターの結果を使用して開始し、必要な制約のみを保持します。

这个7.3はの算法,linprogに対する呼び出しを40回実行してmaxfの計算を完了します。この回数は,ループでIISを削除するプロセスで先に使用した28回という呼び出し回数よりもいくらか多くなっています。

ループで削除された不等式は,算法7.3によって削除された不等式と完全に同一ではないことにも注意してください。ループでは不等式114年,97年,82年,60岁的および64ををする一方,算法7.3では不成式114,97,82,60,および2を削除します。82年不等式および64が(ループででiisの削除で示したとおり)IISとなり,不等式82および2もまたIISとなることを確認します。

usemeineq = false(大小(b));usemeineq((82、64))= true;ineqs = deletionfilter (A (usemeineq:)、b (usemeineq) Aeq,说真的,磅,乌兰巴托);disp (ineqs)
1 1
usemeineq = false(大小(b));usemeineq([2] 82年)= true;ineqs = deletionfilter (A (usemeineq:)、b (usemeineq) Aeq,说真的,磅,乌兰巴托);disp (ineqs)
1 1

参考文献

j·W·Chinneck优化中的可行性和不可行性:算法和计算方法。Springer,2008年。

j·W·Chinneck《优化的可行性和不可行性》CP-AI-OR-07教程,布鲁塞尔,比利时。https://www.sce.carleton.ca/faculty/chinneck/docs/CPAIOR07InfeasibilityTutorial.pdfから入手可。

补助关节

次のコードは,補助関数DeletionFilter.を作物成し。

函数[Ineq_IIS,EQ_IIS,NCALLS] = DeletionFilter(Aineq,Bineq,AEQ,BeQ,LB,UB)ncalls = 0;[mi,n] =尺寸(aineq);%变量个数和线性不等式约束f = 0 (1, n);我=大小(Aeq, 1);%线性等式约束的个数opts = Optimoptions(“linprog”“算法”“双重简单”“展示”“没有任何”);ineq_iis = true (mi, 1);从问题中的所有不平等开始eq_iis = true(我,1);从问题中的所有等式开始为了I =1:mi inq_iis (I) = 0;%删除不等式I[~, ~, exitflag] = linprog (f, Aineq (ineq_iis:), bineq (ineq_iis),...AEQ,BEQ,LB,UB,[],选择);ncalls = ncalls + 1;如果exitflag = = 1百分比现在是可行的INEQ_IIS(i)= 1;返回i到问题结尾结尾为了I =1: eq_iis(I) = 0;删除等号i[〜,〜,ExitFlag] = Linprog(F,Aineq,Bineq,...AEQ(EQ_IIS,:),BEQ(EQ_IIS),LB,UB,[],OPTS);ncalls = ncalls + 1;如果exitflag = = 1百分比现在是可行的eq_iis (i) = 1;返回i到问题结尾结尾结尾

次のコードは,補助関数弹性滤片を作物成し。

函数[INEQ_IIS,EQ_IIS,NCALLS,FVAL0] =弹性滤池(AINEQ,BINEQ,AEQ,BEQ,LB,UB)ncalls = 0;[mi,n] =尺寸(aineq);%变量个数和线性不等式约束我=大小(Aeq, 1);Aineq_r = [Aineq -1.0*eye(mi) zeros(mi,2*me)];Aeq_r = [Aeq zeros(me,mi) eye(me) -1.0*eye(me)];每个平等约束的%两个松弛lb_r =[磅(:);0 (mi + 2 *我,1)];ub_r =[乌兰巴托(:);正(mi + 2 *我,1)];ineq_slack_offset = n;Eq_pos_slack_offset = n + mi;Eq_neg_slack_offset = n + mi + me;F = [0 (1,n) 1 (1,mi+2*me)];opts = Optimoptions(“linprog”“算法”“双重简单”“展示”“没有任何”);托尔= 1平台以及;ineq_iis = false (mi, 1);eq_iis = false(我,1);[x, fval exitflag] = linprog (f Aineq_r bineq Aeq_r,说真的,lb_r, ub_r,[],选择);fval0 = fval;ncalls = ncalls + 1;Exitflag == 1 && fval > tol%可行,一些休闲裤是非零的c = 0;为了I = 1:mi j = ineq_slack_offset+ I;如果X (j) > tol ub_r(j) = 0.0;ineq_iis (i) = true;c = c + 1;结尾结尾为了I = 1: I = 1;如果X (j) > tol ub_r(j) = 0.0;eq_iis (i) = true;c = c + 1;结尾结尾为了I = 1:me j = eq_neg_slack_offset+ I如果X (j) > tol ub_r(j) = 0.0;eq_iis (i) = true;c = c + 1;结尾结尾[x, fval exitflag] = linprog (f Aineq_r bineq Aeq_r,说真的,lb_r, ub_r,[],选择);如果Fval > 0 fval0 = Fval;结尾ncalls = ncalls + 1;结尾结尾

次のコードは,補助関数generatecoverを作物成し。次のコードは,ループででiisの削除で示したコードと同じインデックス付け手法を使用して,制約を追跡します。

函数[CoverseTineq,CovereTeq,NLP] = Generatecover(Aineq,Bineq,AEQ,BEQ,LB,UB)%返回线性不等式的覆盖集,线性的覆盖集%等于,以及对Linprog的呼叫总数。%从Chinneck [1]算法7.3调整。步数来自这本书。coversetineq = [];coverseteq = [];activeA = true(大小(bineq));activeaeq = true(大小(beq));%算法7.3的步骤1[ineq_iis, eq_iis ncalls] = elasticfilter (Aineq、bineq Aeq,说真的,磅,乌兰巴托);nlp = ncalls;inf = sum(inq_iis (:)) + sum(eq_iis(:));如果Ninf == 1 coversetineq = inq_iis;coverseteq = eq_iis;返回结尾holdsetineq =找到(ineq_iis);holdseteq =找到(eq_iis);candidateineq = holdsetineq;candideqe = holdseteq;算法的%步骤2 7.3总和(candideineq(:))+ sum(candideqeq(:))> 0 minsinf = Inf;Ineqflag = 0;为了i = 1:length(candidateineq(:)) activeA(candidateineq(i)) = false;idx2 =找到(activeA);idx2eq =找到(activeAeq);[ineq_iis, eq_iis ncalls fval] = elasticfilter (Aineq (activeA:), bineq (activeA) Aeq (activeAeq),说真的(activeAeq)磅,乌兰巴托);NLP = NLP + ncalls;ineq_iis = idx2(找到(ineq_iis));eq_iis = idx2eq(查找(eq_iis));如果fval == 0 covesetineq = [coversetineq; candidateineq(i)];返回结尾如果Fval < minsinf inqflag = 1;赢家= candidateineq(我);minsinf = fval;holdsetineq = ineq_iis;如果nummel (eq_iis(:))) + nummel (eq_iis(:)) == 1 nextwinner = ineq_iis;nextwinner2 = eq_iis;nextwinner = [nextwinnner, nextwinner2];别的nextwinner = [];结尾结尾accea(Candidateineq(i))= true;结尾为了i = 1:长度(candideqe(:))activeaeq(candidepeq(i))= false;idx2 =找到(activeA);idx2eq =找到(activeAeq);[Ineq_IIS,EQ_IIS,NCALL,FVAL] =弹性滤液(ACTIMEA),Bineq(Activea),AEQ(ActiveAeq,:),BeQ(ActiveAQ),LB,UB);NLP = NLP + ncalls;ineq_iis = idx2(找到(ineq_iis));eq_iis = idx2eq(查找(eq_iis));如果Fval == 0 coverseteq = [coverseteq;candidateeq(i)];返回结尾如果fval 如果nummel (eq_iis(:))) + nummel (eq_iis(:)) == 1 nextwinner = ineq_iis;nextwinner2 = eq_iis;nextwinner = [nextwinnner, nextwinner2];别的nextwinner = [];结尾结尾activeAeq (candidateeq (i)) = true;结尾%算法7.3的步骤3如果Ineqflag == 1 coverseTineq = [CovereTineq;获胜者];Actiacea(获胜者)=假;如果NextWinner CoverseTineq = [CovereTineq; NextWinner];返回结尾结尾如果Ineqflag == -1 coverseteq = [coverseteq;赢家];activeAeq(冠军)= false;如果Nextwinner coverseteq = [coverseteq; Nextwinner];返回结尾结尾candidateineq = holdsetineq;candideqe = holdseteq;结尾结尾

参考

关键词トピック