「線形計画問題」を含む日記 RSS

はてなキーワード: 線形計画問題とは

2025-09-28

[]

今日という日は、僕の知的リズムに乱れを生じさせた。朝はいつも通り決められたルーティンで始めた。7時整に起床し、まず歯を120秒正確に磨いた。その後、オートミールスクランブルエッグを、タンパク質炭水化物の最適な比率摂取した。ルームメイトは僕の規律理解しようともしないでコーヒーをこぼし、キッチンに一瞬カオス初期条件を作り出した。その瞬間に僕の頭の中では、弦理論における境界条件問題の初期値敏感性と完全に同型な不快感が広がった。

僕は午前中を使って、dS背景における超弦理論の非摂動的定式化の可能性について考え続けた。アディンクラ(supermultipletの可視化手法)をdS/CFT的枠組みで拡張する試みは、AdS/CFTきれいなログラフィック辞書と違い、群表現の非ユニタリ性問題を引き起こす。だが、ここにこそ突破口があると考えている。通常の弦理論真空はAdSやMinkowskiを基盤にして安定化されるが、dSでは不安定性が恒常的に残る。しかし、もしも境界条件を「量子情報幾何学的な状態多様体」として扱い、そこにFisher情報計量を組み込めば、エンタングルメントエントロピー正則化と一緒に新しい自己無撞着な枠組みが構築できる可能性がある。僕は昼食中もこの数式を頭の中で展開していた。隣人がテレビでどうでもいいドラマを流していたせいで集中が一瞬途切れたが、幸いにも僕のワーキングメモリは平均的ヒトのそれを圧倒的に凌駕しているので支障はない。

午後は週刊コミック新刊を入手した。バットマンの最新号では、またしてもゴッサム治安は壊滅的だ。正直に言うと、僕ならバットマンのように非効率な格闘を選ばず、まず量子暗号通信を導入して都市情報ネットワークを完全掌握するだろう。だが作者が物理学合理性よりもドラマ性を優先するのは理解できる。僕は同じく収集しているフラッシュバックナンバーも読み返したが、相対論効果の扱いが毎回不正確で失望する。光速に近い走行をしているのに時間膨張や質量増加を無視するのは科学犯罪に等しい。

夜は友人たちとオンラインカタンの開拓者たちプレイした。僕は当然ながら資源分布エントロピー最小化の観点から最適化し、交易線形計画問題帰着させて勝利した。彼らは「ゲームなのに楽しんでいない」と不満を述べたが、それは誤りだ。僕にとって勝利すること自体が最大の快楽であり、規則正しい戦略的優位性を確認することが娯楽なのだ

寝る前にもう一度、歯を120秒磨いた。僕の睡眠は必ず21時42分に始まる。もしそれが1分でもずれると、翌日の全ての計算に誤差が生じる。ルームメイトがまた騒がしい生活習慣で僕の理想的初期条件を乱さないことを願う。明日さらに複雑な弦理論計算を進めたい。特に、非可換幾何に基づく新しいブレーン安定化機構検討する予定だ。これがもしうまくいけば、ウィッテンですら首をひねるだろう。

僕は眠りにつく前に、今日世界が僕の計画通りに回っていないことを嘆いた。だが少なくとも、僕自身ルーティン頭脳は完全に回転している。これ以上完璧なことがあるだろうか。

2025-02-04

線型計画法の例題

ある会社が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を用いて解いてください。

回答

問題1: 線形計画問題の定式化

決定変数:

x: 今週製造するX製品単位

y: 今週製造するY製品単位

目的関数:

最大化 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

問題2: GLPKを用いた解法

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

以下のような最適解が得られます

x = 45 (X製品生産量)

y = 6.25 (Y製品生産量)

Z = 1.25 (週末時点での余剰在庫数)

この結果から会社は今週、X製品を45単位、Y製品を6.25単位製造するべきであることがわかります。これにより、週末時点での余剰在庫数は1.25単位となり、最大化されます

注意:実際の生産では、Y製品生産量を6単位に切り下げるか7単位に切り上げる必要があるかもしれません。

2025-01-05

線型計画法の基礎

製品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の生産量。最小生産量を設定することで、両方の製品を必ず生産するようにする。

Pythonによる実装

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("最適解が見つかりませんでした。")

実行結果

Optimal value (最大利益): 650.0

x_A (製品Aの生産量): 10.0

x_B (製品Bの生産量): 5.0

 
ログイン ユーザー登録
ようこそ ゲスト さん