ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

最適化変数の名前付きインデックス

名前付きインデックスの作成

最適化変数はインデックス要素の名前を使用できます。変数には作成時または作成後に名前を付けることができます。たとえば、変数を作成する際に名前を付けます。

x = optimvar('x',["United","Lufthansa","Virgin Air"])
x = 
  1x3 OptimizationVariable array with properties:

  Array-wide properties:
          Name: 'x'
          Type: 'continuous'
    IndexNames: {{}  {1x3 cell}}

  Elementwise properties:
    LowerBound: [-Inf -Inf -Inf]
    UpperBound: [Inf Inf Inf]

  See variables with showvar.
  See bounds with showbounds.

optimvar は、変数の順序で、指定された名前をインデックス番号に自動的にマッピングします。たとえば、"United" はインデックス 1 に、"Lufthansa" はインデックス 2 に、"Virgin Air" はインデックス 3 に対応します。確認のため、この最後の変数を表示します。

showvar(x(3))
    [ x(1, 'Virgin Air') ]

インデックス名を使用することで、インデックス名によって x の要素を参照できます。以下に例を示します。

route = 2*x("United") + 3*x("Virgin Air")
route = 
  OptimizationExpression

    2*x(1, 'United') + 3*x(1, 'Virgin Air')

変数を作成した後に、インデックス名を作成または変更することができます。ただし、構成後の最適化変数のサイズは変えられません。そのため、元の変数と同じサイズにインデックス付けする新しい名前を設定することでのみ、インデックス名を変更できます。以下に例を示します。

x = optimvar('x',3,2);
x.IndexNames = { {'row1','row2','row3'}, {'col1','col2'} };

また、インデックス名は次元ごとに個別に設定することもできます。

x.IndexNames{1} = {'row1', 'row2', 'row3'};
x.IndexNames{2} = {'col1', 'col2'};

特定の要素にインデックス名を設定できます。

x.IndexNames{1}{2} = 'importantRow';

変数のインデックス名を調べます。

x.IndexNames{1}
ans = 1x3 cell array
    {'row1'}    {'importantRow'}    {'row3'}

x.IndexNames{2}
ans = 1x2 cell array
    {'col1'}    {'col2'}

名前付きインデックスの使用

名前付きインデックス変数を使用すると、一部の問題を容易に作成およびデバッグできます。たとえば、vars 内の名前によってインデックス付けされている変数 x について考えてみます。

vars = {'P1','P2','I1','I2','C','LE1','LE2','HE1','HE2',...
    'HPS','MPS','LPS','BF1','BF2','EP','PP'};
x = optimvar('x',vars,'LowerBound',0);

名前付きインデックスを使用して、x の範囲、目的関数、線形制約を作成します。

x('P1').LowerBound = 2500;
x('I2').UpperBound = 244000;
linprob = optimproblem;
linprob.Objective = 0.002614*x('HPS') + 0.0239*x('PP') + 0.009825*x('EP');
linprob.Constraints.cons1 = x('I1') - x('HE1') <= 132000;

インデックス変数では、string (" ") と文字ベクトル (' ') を区別することなく使用できます。以下に例を示します。

x("P2").LowerBound = 3000;
x('MPS').LowerBound = 271536;
showbounds(x)
      2500 <= x(1, 'P1')
      3000 <= x(1, 'P2')
         0 <= x(1, 'I1')
         0 <= x(1, 'I2')  <= 244000
         0 <= x(1, 'C')
         0 <= x(1, 'LE1')
         0 <= x(1, 'LE2')
         0 <= x(1, 'HE1')
         0 <= x(1, 'HE2')
         0 <= x(1, 'HPS')
    271536 <= x(1, 'MPS')
         0 <= x(1, 'LPS')
         0 <= x(1, 'BF1')
         0 <= x(1, 'BF2')
         0 <= x(1, 'EP')
         0 <= x(1, 'PP')
    

x("P2") などの string で指定された変数と、x('MPS') などの文字ベクトルで指定された変数は区別されません。

名前付きインデックス変数は等価な数値をもつため、名前付きインデックス変数を扱うときでも、通常の和とコロン演算子を使用できます。たとえば、次の形式の制約を指定できます。

constr = sum(x) <= 100;
showconstr(constr)
  x(1, 'P1') + x(1, 'P2') + x(1, 'I1') + x(1, 'I2') + x(1, 'C')
+ x(1, 'LE1') + x(1, 'LE2') + x(1, 'HE1') + x(1, 'HE2') + x(1, 'HPS')
+ x(1, 'MPS') + x(1, 'LPS') + x(1, 'BF1') + x(1, 'BF2') + x(1, 'EP')
+ x(1, 'PP') <= 100
y = optimvar('y',{'red','green','blue'},{'plastic','wood','metal'},...
    'Type','integer','LowerBound',0);
constr2 = y("red",:) == [5,7,3];
showconstr(constr2)
(1, 1)

  y('red', 'plastic') == 5

(1, 2)

  y('red', 'wood') == 7

(1, 3)

  y('red', 'metal') == 3

インデックス変数による解の表示

名前付きインデックス変数を使用して、最適化問題を作成して解きます。問題は、収益で重み付けされた、さまざまな空港へのフルーツのフローを最大化することです。これはそれぞれの重み付きフローへの制約に従います。

rng(0) % For reproducibility
p = optimproblem('ObjectiveSense', 'maximize');
flow = optimvar('flow', ...
    {'apples', 'oranges', 'bananas', 'berries'}, {'NYC', 'BOS', 'LAX'}, ...
    'LowerBound',0,'Type','integer');
p.Objective = sum(sum(rand(4,3).*flow));
p.Constraints.NYC = rand(1,4)*flow(:,'NYC') <= 10;
p.Constraints.BOS = rand(1,4)*flow(:,'BOS') <= 12;
p.Constraints.LAX = rand(1,4)*flow(:,'LAX') <= 35;
sol = solve(p);
LP:                Optimal objective value is -1027.472366.                                         

Heuristics:        Found 1 solution using rounding.                                                 
                   Upper bound is -1027.233133.                                                     
                   Relative gap is 0.02%.                                                          

Cut Generation:    Applied 1 mir cut, and 2 strong CG cuts.                                         
                   Lower bound is -1027.233133.                                                     
                   Relative gap is 0.00%.                                                          


Optimal solution found.

Intlinprog stopped at the root node because the objective value is within a gap
tolerance of the optimal value, options.AbsoluteGapTolerance = 0 (the default
value). The intcon variables are integer within tolerance,
options.IntegerTolerance = 1e-05 (the default value).

ニューヨークとロサンゼルスへのオレンジとベリーの最適フローを求めます。

[idxFruit,idxAirports] = findindex(flow, {'oranges','berries'}, {'NYC', 'LAX'})
idxFruit = 1×2

     2     4

idxAirports = 1×2

     1     3

orangeBerries = sol.flow(idxFruit, idxAirports)
orangeBerries = 2×2

         0  980.0000
   70.0000         0

この表示は、NYC 向けのオレンジは 0、70 のベリーが NYC 向け、980 のオレンジが LAX 向けで、LAX 向けのベリーは 0 であることを示しています。

次の最適なフローをリストします。

Fruit Airports

----- --------

Berries NYC

Apples BOS

Oranges LAX

idx = findindex(flow, {'berries', 'apples', 'oranges'}, {'NYC', 'BOS', 'LAX'})
idx = 1×3

     4     5    10

optimalFlow = sol.flow(idx)
optimalFlow = 1×3

   70.0000   28.0000  980.0000

この表示は、70 のベリーが NYC 向け、28 のアップルが BOS 向けで、980 のオレンジが LAX 向けであることを示しています。

参考

|

関連するトピック