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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

Q&A

解決済

1回答

1315閲覧

pulpでスケジューリング

退会済みユーザー

退会済みユーザー

総合スコア0

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

0グッド

0クリップ

投稿2020/06/25 02:20

編集2020/06/26 06:45

前提・実現したいこと

ある企業で各社員について出社したときと休んでいる時の業務が与えられているとして、会社の業務が最大化するような問題を実装してみたいと思っています。
制約として
・各社員が5日以上は出社する
・一日に4人以上は出社する

発生している問題・エラーメッセージ

エラーメッセージは出ないですが、値が出力されません。

該当のソースコード

Python

1import pulp 2import sys 3import numpy as np 4 5#オフィスワークの業務効率 6o=[2,5,2,3,6,7,8,65,4,7,2] 7#テレワークの業務効率 8r=[1,4,2,3,2,7,8,6,4,7,10] 9#交通費 10c=[603,400,603,909,703,200,307,400,077,1102,602,360,520,2208] 11 12#従業員数 13employee_num = 10 14weekday_num = 7 15 16data = [] 17for i in range(employee_num): 18 data += [[o[i],r[i],c[i]]] 19 20print(data) 21cc = [] 22owc = [] 23odc = [] 24 25def main(): 26 problem = pulp.LpProblem("miximize", pulp.LpMaximize) 27 28 variable = [[None for _ in range(weekday_num)] for _ in range(employee_num)] 29 for i in range(employee_num): 30 for d in range(weekday_num): 31 variable[i][d] = pulp.LpVariable(f"x({i},{d})",0 ,1,pulp.LpInteger) 32 33 efi = None 34 for i in range(employee_num): 35 for d in range(weekday_num): 36 efi += variable[i][d] * data[i][0] + (1 - variable[i][d]) * data[i][1] 37 38 problem += efi # 目的関数 39 cc = [0,0,0,0,0] 40 owc = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 41 odc = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 42 # 制約1本目 43 44 for d in range(weekday_num): 45 for i in range(employee_num): 46 cc[d] += variable[i][d] * data[i][2] 47 problem += cc[d] <= 5000 48 49 # 制約2本目 50 51 for i in range(employee_num): 52 for d in range(weekday_num): 53 if variable[i][d] == 1: 54 owc[i] += 1 55 problem += owc[i] >= 2 56 57 # 制約3本目 58 59 for d in range(weekday_num): 60 for i in range(employee_num): 61 if variable[i][d] == 1: 62 owc[d] += 1 63 problem += odc[d] >= 2 64 65 print(problem) 66 status = problem.solve() 67 print(status) 68 print("Obj.value", problem.objective.value()) 69 70 71if __name__=="__main__": 72 main()

試したこと

出社なら1、リモートなら0の関数がうまく言っていないのかなと感じましたが、修正の見当がつきませんでした。

補足情報(FW/ツールのバージョンなど)

Python3.7
Jupyter Notebook 6.0.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

不具合の原因は単純に3つ目の制約において

Python

1odc[d] += 1

とするべき箇所を

Python

1owc[d] += 1

とした事かと思います。

あとはもう一箇所気になるところは、交通費は(多分)10円単位でデータを保持しているにも関わらず、

Python

1cc[d] <= 5000

と計算しているところ。ここは

Python

1cc[d] <= 500

となるのではないでしょうか。
あと合計を求める箇所を lpSum() を使うように修正すると以下のようになります。

Python

1import pulp 2import sys 3import numpy as np 4 5#オフィスワークの業務効率 6o=[1, 5,2,6,7,32,7,45,7,9,0,8,7,6,4,3,2,] 7#テレワークの業務効率 8r=[1, 3, 3, 5, 9, 7, 3, 9, 10, 4, 8, 7, 9, 2, 10, 9, 5, 4, 1, 9] 9#交通費 10c=[63,4,63,99,73,20,37,40,77,112,62,36,52,22,9,6,51,76,219,118] 11 12#従業員数 13employee_num = 10 14weekday_num = 5 15 16data = [] 17for i in range(employee_num): 18 data += [[o[i],r[i],c[i]]] 19 20print(data) 21cc = [] 22owc = [] 23odc = [] 24 25def main(): 26 problem = pulp.LpProblem("miximize_business_efficiency", pulp.LpMaximize) 27 28 variable = [[None for _ in range(weekday_num)] for _ in range(employee_num)] 29 for i in range(employee_num): 30 for d in range(weekday_num): 31 variable[i][d] = pulp.LpVariable(f"x({i},{d})", cat="Binary") 32 33 efi = None 34 for i in range(employee_num): 35 for d in range(weekday_num): 36 efi += variable[i][d] * data[i][0] + (1 - variable[i][d]) * data[i][1] 37 38 problem += efi # 目的関数 39 cc = [0,0,0,0,0] 40 owc = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 41 odc = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 42 43 # 制約:1日の交通費は5000円以下とする 44 for d in range(weekday_num): 45 cc[d] = pulp.lpSum(variable[i][d] * data[i][2] for i in range(employee_num)) 46 problem += cc[d] <= 500 47 48 # 制約:1人2日以上出社 49 for i in range(employee_num): 50 owc[i] = pulp.lpSum(variable[i][d] for d in range(weekday_num)) 51 problem += owc[i] >= 2 52 53 # 制約:1日2人以上出社 54 for d in range(weekday_num): 55 odc[d] = pulp.lpSum(variable[i][d] for i in range(employee_num)) 56 problem += odc[d] >= 2 57 58 print(problem) 59 status = problem.solve() 60 print(status) 61 print("Obj.value", problem.objective.value()) 62 63 result = [[variable[i][d].varValue for d in range(weekday_num)] for i in range(employee_num)] 64 print(result) 65 66if __name__=="__main__": 67 main()

投稿2020/06/25 05:54

magichan

総合スコア15898

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

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

退会済みユーザー

退会済みユーザー

2020/06/25 06:33

まさに実装してみたいことができました。 本当にありがとうございました! これからも色々と試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問