質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1854閲覧

【PULPを使った数理最適化】細かい制約条件を考慮した最適生産計画計算

python...

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/09/08 06:48

編集2021/09/29 05:41

前提・実現したいこと
Pythonで得意先からの品番別注文依頼数を基に、各製造ラインへ各品番の生産数を
自動で振り分けるコードを記述しています。(PythonのPULPを使用)
現状は、各製造ラインの月の稼働時間が上限値を超えずに得意先注文数を満たす様に
振り分けるという部分までは出来ていますが、追加で制約を行いたい部分(残業42h以上にならない様にしたい、定時割れは定時扱いにしたい)が実装できていません。

今回の生産計画自動作成に向けた条件
・各製造ライン毎に品番を加工する為の工数(製品1個を加工する時間[分])が異なります
・作業者は決まったラインでしか働けません
・稼働体制は昼勤ラインと昼勤&夜勤ラインがあり所定内時間は7.5h/直、残業は3.0h/直まで
・ラインは掛け持ちを行うラインがあり、例えばAラインとCラインを掛け持ちする場合
Aラインが100h/月、Cラインが150h/月の場合は作業者は150h/月働く事になります。

◇目的:労務費が最小となる様に各製造ラインに生産数を振り分けたい

■制約条件(実現したい事)
1.定時割れを起こした場合も定時分の労務費は発生する
(他ラインに仕事を振りすぎて定時割れになった場合は労務費のロスが発生)
2.掛け持ちラインも考慮して労務費が最小になる様にしたい
3.工数が少なくても1人当たりの残業が42h/月を超える場合は他ラインに仕事を振りたい
4.やむを得ず42h/月を超える場合も、60h/月以内に収める様にしたい
(どう頑張っても60h以上になってしまう程の注文がある場合は60h以上も可)

python

1from pulp import * 2I = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) #製造ライン16ライン 3J = (1,2,3,4,5,6,7,8,9,10) #加工品番10種類 4worktime = {1:21420,2:21420,3:21420,4:21420,5:21420,6:21420,7:21420,8:21420,9:21420,10:0,11:10710,12:21420,13:21420,14:10710,15:10710,16:21420} # 労働上限(直数×630分×稼働日数[17日]) 5ontime = {1:15300,2:15300,3:15300,4:15300,5:15300,6:15300,7:15300,8:15300,9:15300,10:0,11:7650,12:15300,13:15300,14:7650,15:7650,16:15300} # 労働上限(直数×450分×稼働日数[17日]) 6order = {1:908,2:0,3:8,4:25123,5:3252,6:0,7:2830,8:319,9:0,10:0} # 得意先注文数量 7cost = {(1,1):3.3,(1,2):3.2,(1,3):4.0,(1,4):2.9,(1,5):100,(1,6):100,(1,7):100,(1,8):100,(1,9):100,(1,10):100, 8(2,1):100,(2,2):100,(2,3):100,(2,4):1.9,(2,5):100,(2,6):100,(2,7):100,(2,8):100,(2,9):100,(2,10):100, 9(3,1):100,(3,2):100,(3,3):100,(3,4):100,(3,5):3.0,(3,6):3.8,(3,7):3.8,(3,8):3.8,(3,9):100,(3,10):100, 10(4,1):100,(4,2):100,(4,3):100,(4,4):100,(4,5):100,(4,6):100,(4,7):100,(4,8):100,(4,9):1.9,(4,10):2.1, 11(5,1):100,(5,2):100,(5,3):100,(5,4):2.2,(5,5):100,(5,6):100,(5,7):100,(5,8):100,(5,9):100,(5,10):100, 12(6,1):100,(6,2):100,(6,3):100,(6,4):100,(6,5):100,(6,6):100,(6,7):100,(6,8):100,(6,9):100,(6,10):100, 13(7,1):100,(7,2):100,(7,3):100,(7,4):100,(7,5):2.9,(7,6):100,(7,7):100,(7,8):100,(7,9):100,(7,10):100, 14(8,1):100,(8,2):100,(8,3):100,(8,4):2.2,(8,5):3.0,(8,6):100,(8,7):100,(8,8):100,(8,9):100,(8,10):100, 15(9,1):100,(9,2):100,(9,3):100,(9,4):100,(9,5):100,(9,6):100,(9,7):100,(9,8):100,(9,9):100,(9,10):100, 16(10,1):100,(10,2):100,(10,3):100,(10,4):100,(10,5):100,(10,6):100,(10,7):100,(10,8):100,(10,9):100,(10,10):100, 17(11,1):100,(11,2):100,(11,3):100,(11,4):2.4,(11,5):3.6,(11,6):100,(11,7):100,(11,8):100,(11,9):100,(11,10):100, 18(12,1):100,(12,2):100,(12,3):100,(12,4):2.5,(12,5):100,(12,6):100,(12,7):100,(12,8):100,(12,9):100,(12,10):100, 19(13,1):100,(13,2):100,(13,3):100,(13,4):2.4,(13,5):100,(13,6):100,(13,7):100,(13,8):100,(13,9):100,(13,10):100, 20(14,1):100,(14,2):100,(14,3):100,(14,4):100,(14,5):100,(14,6):100,(14,7):100,(14,8):100,(14,9):100,(14,10):100, 21(15,1):100,(15,2):100,(15,3):100,(15,4):100,(15,5):100,(15,6):100,(15,7):100,(15,8):100,(15,9):100,(15,10):100, 22(16,1):100,(16,2):100,(16,3):100,(16,4):100,(16,5):100,(16,6):100,(16,7):100,(16,8):100,(16,9):100,(16,10):100} #(ライン、加工品番)工数 ※工数100の部分は、そのラインでは加工できない品番を表す 23 24# モデルの作成 25model = LpProblem(sense=LpMinimize) 26 27# 変数の定義 28x = {} 29for i in I: 30 for j in J: 31 x[i,j] = LpVariable('x{},{}'.format(i,j),lowBound=0,upBound=None,cat='Continuous') 32print(x) 33 34# xの中身は(1,1),(1,2),(1,3),・・・・・・(16,8),(16,9),(16,10)が入っている 35 36# 目的関数 37model += sum(cost[i,j]*x[i,j] for(i,j) in x) 38 39# 制約条件 40for i in I: 41 model += sum(cost[i,j]*x[i,j] for j in J) <= worktime[i] 42 43for j in J: 44 model += sum(x[i,j] for i in I) == order[j] 45 46# ソルバーの実行 47model.solve() 48 49# 結果の表示 50print(value(model.objective)) 51 52for i in I: 53 for j in J: 54 print(x[i,j],value(x[i,j]))

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/09/18 07:17

「PuLPを使った最適化」のようにモジュールを明記した方が知っている人のフォローが得られやすいかもしれません。あとは、<code>で表示される記号の間にソースコードを挟んだ方が良いです。知っている人でも「あー」となるかもしれないためです(私はPuLPを使ったことがありません)
python...

2021/09/29 02:47

ご指摘いただきありがとうございます。タイトルにモジュールを明記しました。 また、<code>で表示される記号の間にソースコードを挟んだ方が良いという意味が分からず そちらの点については修正が出来ておりません。申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問