はてなキーワード: 線形計画問題とは
今日という日は、僕の知的なリズムに乱れを生じさせた。朝はいつも通り決められたルーティンで始めた。7時整に起床し、まず歯を120秒正確に磨いた。その後、オートミールとスクランブルエッグを、タンパク質と炭水化物の最適な比率で摂取した。ルームメイトは僕の規律を理解しようともしないでコーヒーをこぼし、キッチンに一瞬カオス的初期条件を作り出した。その瞬間に僕の頭の中では、弦理論における境界条件問題の初期値敏感性と完全に同型な不快感が広がった。
僕は午前中を使って、dS背景における超弦理論の非摂動的定式化の可能性について考え続けた。アディンクラ(supermultipletの可視化手法)をdS/CFT的枠組みで拡張する試みは、AdS/CFTのきれいなホログラフィック辞書と違い、群表現の非ユニタリ性が問題を引き起こす。だが、ここにこそ突破口があると考えている。通常の弦理論的真空はAdSやMinkowskiを基盤にして安定化されるが、dSでは不安定性が恒常的に残る。しかし、もしも境界条件を「量子情報幾何学的な状態多様体」として扱い、そこにFisher情報計量を組み込めば、エンタングルメントエントロピーの正則化と一緒に新しい自己無撞着な枠組みが構築できる可能性がある。僕は昼食中もこの数式を頭の中で展開していた。隣人がテレビでどうでもいいドラマを流していたせいで集中が一瞬途切れたが、幸いにも僕のワーキングメモリは平均的ヒトのそれを圧倒的に凌駕しているので支障はない。
午後は週刊コミックの新刊を入手した。バットマンの最新号では、またしてもゴッサムの治安は壊滅的だ。正直に言うと、僕ならバットマンのように非効率な格闘を選ばず、まず量子暗号通信を導入して都市の情報ネットワークを完全掌握するだろう。だが作者が物理学的合理性よりもドラマ性を優先するのは理解できる。僕は同じく収集しているフラッシュのバックナンバーも読み返したが、相対論的効果の扱いが毎回不正確で失望する。光速に近い走行をしているのに時間膨張や質量増加を無視するのは科学的犯罪に等しい。
夜は友人たちとオンラインでカタンの開拓者たちをプレイした。僕は当然ながら資源分布をエントロピー最小化の観点から最適化し、交易を線形計画問題に帰着させて勝利した。彼らは「ゲームなのに楽しんでいない」と不満を述べたが、それは誤りだ。僕にとって勝利すること自体が最大の快楽であり、規則正しい戦略的優位性を確認することが娯楽なのだ。
寝る前にもう一度、歯を120秒磨いた。僕の睡眠は必ず21時42分に始まる。もしそれが1分でもずれると、翌日の全ての計算に誤差が生じる。ルームメイトがまた騒がしい生活習慣で僕の理想的な初期条件を乱さないことを願う。明日はさらに複雑な弦理論的計算を進めたい。特に、非可換幾何に基づく新しいブレーン安定化機構を検討する予定だ。これがもしうまくいけば、ウィッテンですら首をひねるだろう。
僕は眠りにつく前に、今日も世界が僕の計画通りに回っていないことを嘆いた。だが少なくとも、僕自身のルーティンと頭脳は完全に回転している。これ以上完璧なことがあるだろうか。
ある会社が2つの製品(XとY)を2台の機械(AとB)を使って製造しています。Xの1単位を生産するには、機械Aで50分、機械Bで30分の処理時間が必要です。Yの1単位を生産するには、機械Aで24分、機械Bで33分の処理時間が必要です。
今週の始めの時点で、在庫にはX製品が30単位、Y製品が90単位あります。今週の機械Aの利用可能な処理時間は40時間、機械Bは35時間と予測されています。
今週のX製品の需要は75単位、Y製品の需要は95単位と予測されています。会社の方針は、週末時点でのXとY製品の在庫単位数の合計を最大化することです。
1: 今週、各製品をどれだけ製造するかを決定する問題を線形計画問題として定式化してください。
2: この線形計画問題をglpkを用いて解いてください。
決定変数:
最大化 Z = (x + 30 - 75) + (y + 90 - 95) = x + y - 50
制約条件:
1. 機械Aの処理時間制約: 50x + 24y ≤ 2400 (40時間 = 2400分)
2. 機械Bの処理時間制約: 30x + 33y ≤ 2100 (35時間 = 2100分)
3. X製品の需要制約: x ≥ 45 (需要75 - 在庫30 = 45)
4. Y製品の需要制約: y ≥ 5 (需要95 - 在庫90 = 5)
5. 非負制約: x ≥ 0, y ≥ 0
GLPKで解くために、以下のようなモデルファイル(例:model.mod)を作成します:
/* 決定変数 */ var x >= 45; var y >= 5; /* 目的関数 */ maximize Z: x + y - 50; /* 制約条件 */ s.t. machine_A: 50*x + 24*y <= 2400; s.t. machine_B: 30*x + 33*y <= 2100; end;
このモデルファイルを使用して、コマンドラインで以下のコマンドを実行します:
glpsol --model model.mod -o solution.txt
GLPKが問題を解いた結果は以下です。
Problem: model Rows: 3 Columns: 2 Non-zeros: 6 Status: OPTIMAL Objective: Z = 1.25 (MAXimum) No. Row name St Activity Lower bound Upper bound Marginal ------ ------------ -- ------------- ------------- ------------- ------------- 1 Z B 51.25 2 machine_A NU 2400 2400 0.0416667 3 machine_B B 1556.25 2100 No. Column name St Activity Lower bound Upper bound Marginal ------ ------------ -- ------------- ------------- ------------- ------------- 1 x NL 45 45 -1.08333 2 y B 6.25 5 Karush-Kuhn-Tucker optimality conditions: KKT.PE: max.abs.err = 4.55e-13 on row 2 max.rel.err = 9.47e-17 on row 2 High quality KKT.PB: max.abs.err = 0.00e+00 on row 0 max.rel.err = 0.00e+00 on row 0 High quality KKT.DE: max.abs.err = 0.00e+00 on column 0 max.rel.err = 0.00e+00 on column 0 High quality KKT.DB: max.abs.err = 0.00e+00 on row 0 max.rel.err = 0.00e+00 on row 0 High quality End of output
以下のような最適解が得られます:
Z = 1.25 (週末時点での余剰在庫数)
この結果から、会社は今週、X製品を45単位、Y製品を6.25単位製造するべきであることがわかります。これにより、週末時点での余剰在庫数は1.25単位となり、最大化されます。
製品Aと製品Bの両方を生産することを前提とした線形計画法の問題設定を考える。
2x_A + x_B \leq 100
3x_A + 2x_B \leq 180
x_A \geq 10
x_B \geq 5
x_A, x_B \geq 0
ここで、x_A は製品Aの生産量、x_B は製品Bの生産量。最小生産量を設定することで、両方の製品を必ず生産するようにする。
from scipy.optimize import linprog # 目的関数の係数(利益は最大化したいため、符号を反転) c = [-50, -30] # 制約条件の係数 A = [ [2, 1], # 労働力の制約 [3, 2] # 原材料の制約 ] # 制約条件の右辺 b = [100, 180] # 最小生産量制約を追加(これらは不等式として扱われるため、逆に設定) A_eq = [ [1, 0], # 製品Aの最小生産量制約 [0, 1] # 製品Bの最小生産量制約 ] b_eq = [10, 5] # 最小生産量 # 各変数の非負制約を設定 bounds = [(10, None), (5, None)] # 最小値を設定 # 線形計画問題を解く result = linprog(c, A_ub=A, b_ub=b, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs') # 結果の表示 if result.success: print(f'Optimal value (最大利益): {-result.fun}') print(f'x_A (製品Aの生産量): {result.x[0]}') print(f'x_B (製品Bの生産量): {result.x[1]}') else: print("最適解が見つかりませんでした。")