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

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

新規登録して質問してみよう
ただいま回答率
85.50%
文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

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

Q&A

解決済

3回答

1196閲覧

pythonでシフト作成システムを作ろうと思っています。その際にエラーがでました。

neiber

総合スコア1

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

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

0グッド

1クリップ

投稿2020/08/07 18:34

編集2020/08/08 08:53

前提・実現したいこと

“python”でシフト作成システムを作ろうと思っています。

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

Traceback (most recent call last): File "kari.py", line 36, in <module> ShiftScheduling += lpSum(x[m, d, a] for m in Member) == n, "Constraint_{:}_{:}".format(d,a) File "/usr/local/lib/python3.7/site-packages/pulp/pulp.py", line 888, in __eq__ return LpConstraint(self - other, const.LpConstraintEQ) File "/usr/local/lib/python3.7/site-packages/pulp/pulp.py", line 809, in __sub__ return self.copy().subInPlace(other) File "/usr/local/lib/python3.7/site-packages/pulp/pulp.py", line 784, in subInPlace self.subInPlace(e) File "/usr/local/lib/python3.7/site-packages/pulp/pulp.py", line 784, in subInPlace self.subInPlace(e) File "/usr/local/lib/python3.7/site-packages/pulp/pulp.py", line 784, in subInPlace self.subInPlace(e) [Previous line repeated 985 more times] File "/usr/local/lib/python3.7/site-packages/pulp/pulp.py", line 782, in subInPlace or isinstance(other, Iterable)): File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/abc.py", line 139, in __instancecheck__ return _abc_instancecheck(cls, instance) RecursionError: maximum recursion depth exceeded in comparison

該当のソースコード

Python

1for d in Day: 2 n = need[d] 3 4for d in Day: 5 for a in Action: 6 ShiftScheduling += lpSum(x[m, d, a] for m in Member) == n, "Constraint_{:}_{:}".format(d,a) 7 8 9ShiftScheduling += lpSum(x[m, d, a] for m in Member) == n, "Constraint_{:}_{:}".format(d,a) 10の部分でエラーが吐かれてます

試したこと

もともとは

Python

1for d in Day: 2 for a in Action: 3          n = need[d] 4 ShiftScheduling += lpSum(x[m, d, a] for m in Member) == n, "Constraint_{:}_{:}".format(d,a) 5

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

途中ですがコードを置きます

Python

1import numpy as np, pandas as pd 2from pulp import * 3 4Member = ["1", "2", "3","4","5","6","7","8","9","10"] 5Day = ["11", "12", "13", "14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","1","2","3","4","5","6","7","8","9","10"] 6Action = ["出勤", "休み"] 7 8#問題の宣言 9ShiftScheduling = LpProblem("ShiftScheduling", LpMinimize) 10 11#変数宣言 12x = {} 13for m in Member: 14 for d in Day: 15 for a in Action: 16 x[m, d, a] = LpVariable('x({:},{:},{:})'.format(m,d,a), 0, 1, LpInteger)#バイナリ 17 18days_counter = {} 19six_counter = {} 20for m in Member: 21 days_counter[m] = LpVariable('days_counter({:})'.format(m), 0, 7, LpInteger)#連続出勤回数 22 six_counter[m] = LpVariable('six_counter({:})'.format(m), 0, 6, LpInteger)#6連勤の回数 23 24need = {} 25for d in Day: 26 need[d] = input(d+"日に必要な人数を入力してください。") 27 28#目的関数:全体の6連勤の数を減らす 29ShiftScheduling += lpSum(six_counter[m] for m in Member), "Target" 30 31# それぞれの日の朝やお迎えに必ず誰か1人が割り当てられる 32for d in Day: 33 n = need[d] 34 35for d in Day: 36 for a in Action: 37 ShiftScheduling += lpSum(x[m, d, a] for m in Member) == n, "Constraint_{:}_{:}".format(d,a) 38 39results = ShiftScheduling.solve() 40print("optimality = {:}, target value = {:}".format(LpStatus[results], value(ShiftScheduling.objective))) 41 42 43for m in Member: 44 for d in Day: 45 for a in Action: 46 if value(x[m,d,a]) == 1: 47 print(value(x[m,d,a])) 48 print(x[m,d,a]) 49 50o ={} 51for d in Day: 52 for a in Action: 53 for m in Member: 54 if value(x[m,d,a]) == 1: 55 o.setdefault(d,[]).append(m) 56 57print(o) 58 59print(pd.DataFrame(n,index = ['出勤','休み']))

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

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

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

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

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

Daregada

2020/08/07 22:44

Pythonのソースを```Pythonと```で囲むように、質問文を修正してください。
meg_

2020/08/08 01:53

・コードは「コードの挿入」で記入してください。 ・エラー発生箇所はどこですか?
meg_

2020/08/08 10:28

質問のタグに「文字コード」とありますが質問に何か関係ありますか? 適切なタグを付けられた方が有識者から回答が付きやすくなるでしょう。
guest

回答3

0

File "/usr/local/lib/python3.7/site-packages/pulp/pulp.py", line 784, in subInPlace

self.subInPlace(e)

[Previous line repeated 985 more times]

前の行「subInPlaceの中の "self.subInPlace(e) 」は、985回繰り返されています
という事なので、再帰実行回数の上限に達した原因は subInPlace という関数にあると思われます。

幸いなことに、問題が起きているファイル(/usr/local/lib/python3.7/site-packages/pulp/pulp.py)と、問題が起きているコードの場所(784行目)が判っているので、デバッグ用のprint文を入れるなどすれば原因が判るのではないでしょうか?

投稿2020/08/08 09:34

coco_bauer

総合スコア6915

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

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

0

ベストアンサー

計算回数が多すぎるのがエラーの原因かと思い、とりあえず下記のコードを実行したところご質問のエラーは消えました。

Python

1for d in Day[0]: 2 for a in Action[0]: 3 ShiftScheduling += lpSum(x[m, d, a] for m in Member) == n, "Constraint_{:}_{:}".format(d,a)

やはり、lpSumでの計算回数が多すぎるのでしょう。

しかし上記コードでは別のエラーが発生しました。

KeyError: ('1', '1', '出')

上記エラーが出ないように、lpSumでやりたいことをご自身で実装されるのが良いかと思います。
また一度の計算回数が少なるようにする工夫も必要かもしれません。

投稿2020/08/08 10:25

meg_

総合スコア10577

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

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

0

なかなかソースのMarkdown化をしてくれないので、適当に推測したソースを作り、試してみました。
どう考えても、ループ中で使われているnの値はループ中で取得しないとまずいので、

Python

1for d in Day: 2 n = need[d] 3 for a in Action: 4 ShiftScheduling += lpSum(x[m, d, a] for m in Member) == n, "Constraint_{:}_{:}".format(d,a)

として、あとは末尾でデータフレームにする部分を、

Python

1print(pd.DataFrame(o))

にすれば、文法的なエラーは出なくなります。
結果はおそらく意図したものになっていないけど。

投稿2020/08/08 06:24

Daregada

総合スコア11990

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問