• 締切済み

シンプレックス法解き方

シンプレックス法をシンプレックス表で解く方法を勉強しており、 http://zeus.mech.kyushu-u.ac.jp/~tsuji/java_edu/Simplex_st.html このサイトを参考にして解いていますが、 (2)その交差する要素2をピボットとして掃き出しを行う。その後同様に最上段の最小なもの-1/2があるx1の列を列選択し、最小な1/(1/2)=2がある行を行選択する。 と言うところの表のx3の行はどうやって計算して出されているのでしょうか? 計算式など教えていただけると幸いです。 ご教授よろしくお願いします。

  • ionx
  • お礼率75% (3/4)

みんなの回答

  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.2

No.1です。 文章ばかりでわかりにくかったようで失礼致しました。 今回は式中心にして、(1)から(2)へ変換する掃き出しの部分のみを説明します。 1.掃き出し法について 計算の説明の前に、質問者様は掃き出し法をご存知でしょうか。 連立方程式を解く方法としてよく使われるもので、おおざっぱに言えば今回も使用している掃き出しの手順を繰り返すものです。 ただ、今回のシンプレックス表を使うシンプレックス法では、ピボットの選び方、基底変数の把握、計算終了の判定が通常の連立方程式と異なるようです。 2.(1)から(2)への掃き出しの説明 2-1.初期状態 表(1)ですが、初期状態からピボットを選択しただけの状態です 念のため初期のシンプレックス表を示します。 基底変数 x1  x2  x3  x4  x5 定数項 Z    -2  -3   0   0   0   0 x2    1   2   1   0   0  14 x4    1   1   0   1   0   8 x5    3   1   0   0   1  18 ここで列を選び定数項/列要素を比較した結果、2行目のx2の項である2がピボットになります。 2行目の式は以下の式1のとおりと初期状態のままです。 x1+2・x2+x3 = 14    式1 (式の書き方はこのようにしますがよろしいでしょうか) 2-2.第1段階(ピボットのある行の式) 掃き出しの第1段階として、ピボットを1にします。方法は、式1の両辺をピボットで割ります。 (x1+2・x2+x3)/2 = 14/2 1/2・x1+x2+1/2・x3 = 7    式2 なお、基底変数はx2になります。(理由ですが、項が1になったからというより、ピボットだからと考えた方がよさそうです。) 式2によって表の2行目は表(2)の値に更新され、他の行は表(1)のままとなります。 つまり、表は以下のようになります。 基底変数 x1  x2  x3  x4  x5 定数項 Z    -2  -3   0   0   0   0 x2   1/2  1  1/2  0   0   7 x4    1   1   0   1   0   8 x5    3   1   0   0   1  18 (質問者様がお持ちの疑問はこのあたりでしょうか) 2-3.第2段階その1(1行目の式) 掃き出しの第2段階として、他の行のx2の項を0にします。 方法は、連立方程式の加減法と同じです。 つまり、他の行のx2の項を2行目の式(式2)の両辺に掛け、それを引きます。 (1行目のx2の項は-3なので-3を掛けます) 1行目の場合を示すと以下のようになります。 1行目のx2の項は-3なので-3を掛けます (1/2・x1+x2+1/2・x3)・(-3) = 7・(-3) -3/2・x1-3・x2-3/2・x3 = -21    式3 式3を1行目の式から引きます。   Z  -2・x1-3・x2        =   0  (1行目の式) -) -3/2・x1-3・x2-3/2・x3 = -21   (式3) -----------------------------   Z-1/2・x1     +3/2・x3 =  21    式4 式4により表の1行目が表(2)の値に更新されます。 基底変数 x1  x2  x3  x4  x5 定数項 Z   -1/2  0  3/2  0   0  21 x2   1/2  1  1/2  0   0   7 x4    1   1   0   1   0   8 x5    3   1   0   0   1  18 2-4.第2段階その2(3行目、4行目の式) 同様に3行目、4行目についてもx2の項を0にします。 (式2に掛ける値はどちらも1です) これですべての項が表(2)の値に更新されます。 結果のみ(というか単に表(2)から定数項/列要素を除いたものですが)を示します。 基底変数 x1  x2  x3  x4  x5 定数項 Z   -1/2  0  3/2  0   0  21 x2   1/2  1  1/2  0   0   7 x4   1/2  0 -1/2  1   0   1 x5   5/2  0 -1/2  0   1  11 以上で1回目の掃き出しは完了です。 3.次の処理 この状態ではまだ終了条件になっていません。 そこでこのあと列選択、定数項/列要素の比較を行い次のピボットを選びます。 いかがでしょうか。ご質問や他の説明のご希望等ありましたら補足いただければと思います。

  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.1

シンプレックス法はまったくわからないのですが、リンク先の内容の数値だけを追ってみました。 x3の行というのは行を基底変数で区別しているのですが、基底変数は変わるので2行目と呼ぶことにします。(リンク先の丸付き数字は質問者様にならいかっこ付き数字にします) (1)でx2の列が最大である2行目を選んでいますが、その行・列の交差するところの要素が2であるので、それで2行目の全要素を割っています。その結果x2の要素が1になり同じ行の他の要素は1以外になるので、基底変数がx3からx2に変わっているのだと思います。 次に、他の行のx2の要素が0になるように、他の行に対して2行目を加算又は減算します。(加算又は減算は、x1から定数項までの6個の項について行います。) 1行目に対しては、3倍して加算、3行目と4行目についてはそのまま減算します。 (たとえば3行目の定数項は2行目の定数項をそのまま減算するので8-7=1となります。  また、1行目のx1の要素は、-2+1/2×3=-1/2となります。) これで(2)の下の表のとおりの数値になります。 ここまでが掃き出しです。 あとは、説明の通りに列と行を選択します。 x1列の選択は説明の通りと思います。 行の選択ですが、定数項/列要素の値(定数項を選択した列の要素で割ったもの)を比較します。 3行目の場合、定数項が1、x1の要素が1/2なので1/(1/2)=2というのは説明の通りです。 定数項/列要素は 14, 2, 22/5 となるので、2、つまり3行目を選択します。 (2)の下の表の色が選択結果を表しています。

ionx
質問者

お礼

ありがとうございます。 しかし、如何せん頭が固くなっており、文字だけだとピンと来ません・・・。 よろしかったら方程式を書いていただけませんでしょうか? すみません、よろしくお願いします。

関連するQ&A

  • 準ニュートン法について

    参考先:http://zeus.mech.kyushu-u.ac.jp/~tsuji/java_edu/QNewton.html にて、ニュートン法、準ニュートン法について勉強しています。 準ニュートン法のステップ1に,k=0とする。 とありますが、このkはxの次元ですか? それとも、サンプル数ですか? おそらく、後者だと思うのですが、自信がないので回答お願いします。

  • シンプレックス法について

    シンプレックス法は、以下のサイトで紹介されているように目的関数を最大もしくは最小化するときに使用されます。 http://www.bunkyo.ac.jp/~nemoto/lecture/or/97/simplex/index.htm しかし、シンプレックス法のアルゴリズムでは、 目的関数を「最大化」する場合、目的関数が、  Object=a・x+b・y  a>0、b>0 となっており、 目的関数を「最小化」する場合、目的関数が、  Object=-a・x-b・y  a>0、b>0 となっている必要があると思います。 (ピボット列の選択のとき、目的関数を最大化する場合には、目的関数 を増やすために、係数a、bはプラスでなくてはならない。 目的関数を最小化する場合には、目的関数を減らすために係数a、bはマイナス でなくてはならない) ここで疑問なのは、目的関数を「最小化」する場合、 目的関数が、  Object=a・x+b・y  a>0、b>0 となっている場合、シンプレックス法では解けないのでしょうか? 対象とする問題によっては、このようなことが起きうると思うのですが、何か方法があるのでしょうか? 回答よろしくお願いします。

  • ピボットテーブル内のフィールド値を求める計算式

    セル位置(行や列)を引数に、別の表にあるセルの値をINDIRECT関数で 参照するような感じと同様に、ピボットテーブル中のフィールド値の種別 を参照する計算式の書き方が分かれば教えてください。 図のように、ピボットテーブル内のフィールド値の中に、 複数の重複した要素がある場合に、 ピボットテーブルの行番号を指定して、その行にある値は INDIRECTで求められますが、フィルターの見出しにあたる (この図の例では「型式」のフィールド区分)を求める 計算式(あるいは計算式の組み合わせ)が分かりませんでした。 ピボットテーブルが固定されていれば、行列番号が変わらない 前提で方法はありそうですが、 ピボットテーブルのフィールドの順番を入れ替えても (この図の例では区分と型式を入れ替えても) 大丈夫なように、汎用的な式が書ければと思っています。 よろしくお願いします。 (1)重複した要素のある元データ表 (2)行フィルターに複数のテーブル条件を指定 (3)できがったピボットテーブル (4)行番後を指定して、INDIRECTで値を求めるのと同様、行フィルターの元のフィールドを計算式で求められるか。

  • エクセルのピボットに新しい範囲変更

     ある表を元にピボットテーブルを作成した後、元の表の行や列を付け加えた時、作ったピボットにも新しい広い範囲を適用させるにはどうしたら良いでしょうか? 新しいピボットを作り直し、範囲を広く指定し直さなければならないでしょうか?    宜しくお願いします。

  • Excel2007:複数列を対象としたフィルタ

    Excel2007で複数列を対象としたフィルタを行いたいのですが、どういう方法がありますでしょうか?(ピボットテーブル、マクロを使うのも可) 添付画像の表(1)が表(2)の中に存在しうる単語です。 たとえば「大阪」という文字列を選択すると表(2)の行3,4が抽出され、「朝日」の文字列を選択すると行1,2,4を抽出。「英語」であれば1行も抽出されないといった具合です。 実際には行・列・対象となる文字列ともに例よりも多い数での使用を考えています。また、表(2)の値は変化しえますが、そのたびに数式を見直したりといった手間は無いほうが良いです。 一旦テキストに落としてgrepとかも無しで、Excle内で完結させたいと思っています。 よい解決策を教えてください。

  • 表中から最大値と最小値の見出しを求める方法を教えて

    エクセルで作成した表があります。 表中から行の最大値と最小値の列見出しを求める方法を教えてください。 表は、行に1から1000、列に(1)~(10)とそれぞれ見出しをつけ、表の中には1.000から1.500のランダムな数字があります。 行の番号をB2セルに入れると最大値と最小値の列の見出し{例えば“(5)”というように…)を求めたいのです。行の数字は複数同じ値がある場合もあります。 良い方法がありましたら、教えてください。 よろしくお願いします。

  • EXCEL2002のピボットテーブルの罫線

    データをピボットテーブルで作りました。出来た表に列・行同士の間に罫線を入れ見やすくしました。新たに更新をかけたら行同士の罫線だけが消えてしまいます。どうしたらよいでしょうか?

  • エクセルのピボットテーブルで

    ピボットテーブルの表示方法についてです。 表の品名と数量からピボットテーブルを作成します。 行に品名、データ部に数量を表示させるのですが、数量が0(ゼロ)の場合には、その行自体を表示させない様にしたいのです。 元の表の方は変更等出来ないので、ピボットテーブルの方で何とか出来ないかと思います。 【元の表】 品番  数量 A001  5,000 A002    0 B001  4,500 B002    0 上記の2列からピボットテーブルを作成すます。 【ピボットテーブル】 品番  数量 A001  5,000 B001  4,500 総計  9,500 上記の様に、元の表で数量が0なら、その品番と数量の行が表示されない様にです。

  • エクセルのマクロで特定の文字列を選択したい

    集計表にピボットテーブルを2つ入れるマクロを作成しています。 その際に、出来あがったピボットテーブルの項目ごとの合計を 表示しないためには、対象となるセルを選択して(Select) 表示しないを選択する(Selection.Delete)ことはマクロの記録からわかりました。 しかし、ピボットテーブルの枠が固定されているわけではないので、 合計欄の選択がうまくできません。 結果的には、A列の何行目かに「B在庫」という文字列が表示されていて、 その下からピボットテーブルが作成されています。 その「B在庫」の文字列から「右に3、下に2」と「右に1、下に5」 進んだセルをそれぞれ指定して(Select)削除(Selection.Delete)したいと思っています。 どのように「B在庫」と入力された文字列を探し出すのか、 また、そこから「右に3、下に2」と「右に1、下に5」進んだセルを 指定する方法を教えていただけないでしょうか。

  • Accessでこんな表を作りたいです

    ピボットテーブルで表を作っています。       0-1 1-2 2-6 6-10 ・・・ 計 ----------------------------------- 000-050  001 002 000 001 ・・・ 004 050-060  020 000 000 000 ・・・ 020 060-070  000 010 000 000 ・・・ 010 070-080  000 000 050 000 ・・・ 050 080-090  003 000 000 000 ・・・ 003 090-100  000 000 000 000 ・・・ 000 -----------------------------------      024 012 050 001 ・・・ 087 クロス集計の表なのですが、列と行の階級のとり方が一定ではないのです。 プロパティの【フィルタとグループ化】で同間隔で表示する方法しかわかりません…。 例えば行なら 010-020 020-030 030-040 といったような。 まだまだ未熟者なため、説明が不十分なところがあるかと思いますが、よい方法がありましたら教えていただきたいです。よろしくお願いいたします。