• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:glpkの文法について(初心者的質問))

glpkの文法について(初心者的質問)

seta_takahiroの回答

  • ベストアンサー
回答No.4

Excelで動くなら、それでいいんじゃないか、という気もしますが、 stSeihinLenを次のようにして、強引に足し算にすると、無理やり混合整数計画として表せるんじゃないかと思います。 param BX_MAX := 20; /* 一つの分割から取る部品の最大数、十分に大きな値を設定 */ set BNUM := 1..BX_MAX; param Blength_MAX := 6000; /* 1つの分割の最大長、十分に大きな値(または CoilLength)を設定 */ var Blength_part{BUNKATSU,SEIHIN,BNUM}, >=0; /* ある分割からある製品用に取ったBNUM番目の部品の長さ(0かBlengthかが入る) */ var Blength_part_nonzero{BUNKATSU,SEIHIN,BNUM}, binary; /* ある分割からある製品用に取ったBNUM番目の部品があるかどうか) */ s.t. stSeihinLen{s in SEIHIN} : sum{b in BUNKATSU, i in BNUM} Blength_part[b, s, i] >= Slength[s]; s.t. part_constraint{b in BUNKATSU, s in SEIHIN, i in BNUM} : Blength_part[b, s, i] <= Blength[b]; s.t. part_constraint2{b in BUNKATSU, s in SEIHIN, i in BNUM} : Blength_part_nonzero[b, s, i] <= (BX[b,s] / i); /* BXがi以上のときのみi番目の部品がとれる */ s.t. part_constraint2_2{b in BUNKATSU, s in SEIHIN, i in BNUM : Swidth[s] * i > CoilWidth} : Blength_part_nonzero[b, s, i] = 0; /* 1品種でとろうとした場合の最大の番号を超える分はゼロ */ s.t. part_constraint3{b in BUNKATSU, s in SEIHIN, i in BNUM} : Blength_part[b, s, i] <= Blength_part_nonzero[b, s, i] * Blength_MAX; /* BX[b,s]番目以降の部品は長さ0 */ 結果の主要部を書いておくので正しそうかどうかを判断する材料にしてください。 答えが出るまで35分かかりました。 上でpart_constraint2_2とした制約式は入れないで(入れ忘れて)動かしましたが、多分、条件としては上と等価だと思います。 No. Column name Activity Lower bound Upper bound ------ ------------ ------------- ------------- ------------- 1 Blength[1] 2666.67 0 2 Blength[2] 1666.67 0 3 Blength[3] 444.444 0 4 BX[1,1] * 2 0 5 BX[1,2] * 3 0 6 BX[1,3] * 1 0 7 BX[1,4] * 0 0 8 BX[2,1] * 2 0 9 BX[2,2] * 0 0 10 BX[2,3] * 2 0 11 BX[2,4] * 3 0 12 BX[3,1] * 3 0 13 BX[3,2] * 0 0 14 BX[3,3] * 0 0 15 BX[3,4] * 3 0 参考書については良く分かりませんが、GLPKの参考書というより、 線形計画の参考書を探した方が良さそうな気がします。

anahiro
質問者

お礼

回答ありがとうございます。 この課題については、線形性の制約上無理だった Blength[b] * BX[b,s] をどうやって別形式で表現しようかと悩んでいたのですが、いい方法が見つからずどうすることもできなかったところです。 なるほど回答者さんのように Blength_part_nonzero[b, s, i] <= (BX[b,s] / i) と Blength_part[b, s, i] <= Blength_part_nonzero[b, s, i] * Blength_MAX; の2つに分解して無理やり和の形式にもっていくことができるんですね。私は線形計画の定式化の経験がないもので、こういう計算量が大きくなるようなデータ形式を持つことは全く発想外で、式を読み解いて感心することしきりでした。 どうもありがとうございます。 参考文献は、やはりまず線形計画の参考書ですか。GLPKは英語マニュアルを読むしかないですね。これはがんばるしかないか。 なお、以下のHPでGLPKの出力を説明しているのを発見しました。 http://www.swa.gr.jp/lop/lop_a032.html いろいろ述べましたが、どうもありがとうございました。

関連するQ&A

  • 数学の質問><

    a,b を a<-1/3 b≠-2 をみたす定数とする。 (1)xについての不等式 x^2-(3a+3)x+3a+2<0 の解Sを求めよ。 (2)xについてのもう一つの不等式 x^2-3bx+(2b^2-b-1)<0 の解Tを求めよ。 (3)TがSに含まれるための a,b がみたす条件を求めよ。 おねがいします

  • SUMとJOINのことで質問です

    こんにちは 以下のようなテーブルがあるとして これらをLEFT JOINで全て繋いで、T2以降のSUM(金額)をそれぞれ 取りたいのですが、T2 T3 T4 T5 T6 の中にデータを入れるごとに 2倍・4倍・8倍・16倍とSUMの中の値がドンドン増えていってしまう のですが、何が原因なのでしょうか? 増えていく値が2のn乗なのはわかるのですが、どこが引っかかって こんなことになるのかサッパリわかりません。 ● T1 名前|A_id|B_id|C_id|D_id|E_id| AAAA|1111|2222|3333|4444|5555| ● T2 id|S_id|金額 01|1111|1000 →SUM=1000のはずが、16000 ● T3 id|S_id|金額 01|2222|2000 →SUM=2000のはずが、32000 ● T4 id|S_id|金額 01|3333|3000 →SUM=3000のはずが、48000 ● T5 id|S_id|金額 01|4444|4000 →SUM=4000のはずが、64000 ● T6 id|S_id|金額 01|5555|5000 →SUM=5000のはずが、80000 原因と宜しければ修正方法も教えて頂けるとありがたいです。 MySQL クライアントのバージョン: 5.0.45です 宜しくお願いします。。。

  • Javascriptで数値の和を求める際の処理

    宜しくお願いします。 下記のプログラムの場合、 a,b,c の何れかの値が一つでも未入力の場合、 計算結果が表示されません。 未入力の場合は「0」とみなして、結果を表示させるには、 どの様にしたらよろしいでしょうか。 ご教授ください。 <script> var sum = 0; sum += a; sum += b; sum += c; var result = sum; var x = result; var y = myFormatNumber(x);function myFormatNumber(x) { var s = "" + x; var p = s.indexOf(".");if (p < 0) { p = s.length; } var r = s.substring(p, s.length); for (var i = 0; i < p; i++) { var c = s.substring(p - 1 - i, p - 1 - i + 1); if (c < "0" || c > "9") { r = s.substring(0, p - i) + r; break;}if (i > 0 && i % 3 == 0) { r = "," + r; } r = c + r; } return r; } document.write(y); </script>

  • ベジェ曲線(3次関数)の長さ

    ベジェ曲線(3次関数)の長さを求めようと思っています。 p,q,r,sを位置ベクトルとする。 ベジェ曲線(p-q-r-s)の位置ベクトルbは b=p+t(-3p+3q+t(3p-6q+3r+t(-p+3q-3r+s))) (定義域0≦t≦1) 例えば4点(10,20)-(20,40)-(80,10)-(50,80)で表現されるベジェ曲線は bx=-140(t^3)+150(t^2)+30t+10 bx=150(t^3)-150(t^2)+60t+20 となります この曲線の長さを求める式を教えてください。

  • SUM関数を教えてください

    エクセル画面です      A     B     C 1    氏名  点数 2    H氏   10 3    A氏   20 4    S氏   30 5    T氏   40 6    Z氏   50 7    D氏   60 8    合計      S氏を基準としてS氏が(A4)の位置にある場合の合計を出すときの計算式は   B8=SUM(B4:B7)  となります S氏が(A5)の位置に来た場合   B8=SUM(B5:B7)  となります S氏のセルの位置が上下に移動するので SUM関数で範囲を自働的に変動させて計算させる方法を 教えてください よろしくお願いいたします。

  • 逆ラプラス変換について

    L^(-1)[log((s+a)/(s+b))](x) という問題をとくのに授業でもらったプリントに F(s)=log((s+a)/(s+b))=log(s+a)-log(s+b) とおく s→∞でlimF(s)=0 でありF'(s)=1/(s+a)-1/(s+b) であるのでF(s)=-∫F'(t)dt (s~∞)=∫{1/(t+a)-1/(t+b)}dt (s~∞) である.ここでG(s)=1/(s+a)-1/(s+b) と置くと F(S)=∫G(t)dt(s~∞) でありg(x)=L^(-1)G(x)=e^(-bx)-e^(-ax) よってL^(-1)F(x)=L^(-1)[∫G(t)dt](x) (s~∞) =g(x)/x==e^(-bx)-e^(-ax)/xと書いてありましたが 途中のF(s)=-∫F'(t)dt (s~∞)がこうなるのがよくわかりません.公式ですか? ただL^(-1)(s/(s^2+4)^2)(x) を上記の通りに解いたら2(e^(x)-cosx)/xとなりました.これは合っているのでしょうか?

  • 【C#】LINQについての質問です。

    【C#】LINQについての質問です。 今、プログラミングLINQ(日経BP)の本を読んでいるのですが、わからないところがありましたので、お分かりの方に教えていただきたいです。 問題の場所は、P87のリスト3-43で、以下のコードです。 わからないのは、このコードの中で、ラムダ式のtとsが何にを指しているのかということです。 お分かりになる方、よろしくお願いいたします。 var expr = from c in customers join o in (from c in customers from o in c.Orders join p in products on o.IdProduct equals p.IdProduct select new { c.Name, o.IdProduct, o.Month, OrderAmount = o.Quantity * p.Price }) on c.Name equals o.Name into orders select new { c.Name, MaxOrder = orders .Aggregate( new { Amount = 0m, Month = String.Empty }, (t, s) => t.Amount > s.OrderAmount ? t : new { Amount = s.OrderAmount, Month = s.Month }) };

  • 【シェル】case文でワイルドカードを使う

    変数varにtestで始まる文字列が格納されているかされていないかを判定し、 testで始まる文字列が格納されていない場合、ある処理をしたいです。 以下のようにすると、tまたはeまたはsまたはtで始まるかどうかを判定してしまいます。 case "$var" in [!test]* );; esac どのように書けばよいでしょうか? ヒントでも良いので教えてください。

  • 質問中の比例式(2)式の成立する根拠

    f(x)=ax^2+bx+c   a,b,c ∈Z(整数環) f( ξ )=0なる ξ が実の2次代数的数のときξを2次無理数 という。 以下f( ξ )=0となる2次無理数とする。   (1)式 η=(r ξ +s)/(t ξ +u)  r,s,t,u∈Z ,ru-st=1のとき ξ→ η なる変換を正のモジュラー変換という。 ここで ξ→ ξ なる自己変換を考える。 (1)’ 式  ξ =(r ξ+s)/(tξ+u) (1) ’ 式より t ξ ^2+(a-r)ξ-s=0、f(ξ)=0かつ ξ は有理数ではないので (2)式  t/a=(u-r)/b=-s/c=yとなる この(2)式は直観的には納得するのですが、厳密な論理からするとどういう定理(あるいは根拠)により成立するのかお教えください。 

  • 積分の問題について

    a,bを正の数とする。2つの曲線y=x^3+bx^2 , y=ax^2+abxによって囲まれる2つの部分の面積の和をSとする。 (1)Sをa,bで表せ。 (2)a+b=1のとき、Sを最小にするa,bの値を求めよ。 (一対一の対応、p157) この問題の(2)なのですが、解答は (1)より12S=(a^4+b^4+2a^3b+2ab^3) ab=tとおくと 12S=1-2t-2t^2 -(1) ここで、t>0であり、この範囲ではSはtの減少関数である。 よって、Sが最小になるのはtが最大のときであり、 t=ab=a(1-a) (0<a<1) はa=1/2のときに最大となる。 となっているのですが、 a>0,b>0,a+b=1より 0<ab<1⇔0<t<1 これと(1)を二次関数のグラフと見て最小値はt=1とするのはなぜダメなのでしょうか? t=1はとれないし、Sもマイナスになってしまうのでダメなことは明らかですが、なぜ解答のような考えに至るのかがわかりません。 よろしくお願いします。