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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

1003閲覧

プログラムのエラーについて

K.takita

総合スコア14

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/12/22 04:56

編集2020/12/22 06:18

前提・実現したいこと

すみません。先ほど投稿した、「Falseの場合削除する」についての質問内容ですが、聞きたかったことと異なっていたため、内容を変えさせていただきます。
以下の作成したプログラムについての質問です。

該当のソースコード

python

1import numpy as np 2import pandas as pd 3from pulp import LpBinary, LpMinimize, LpProblem, LpVariable, lpSum, value 4 5#アルバイトの集合 6n_member = 5 7member = pd.Series(f"member{m+1}" for m in range(n_member)) 8 9#日にちの集合 10n_day = 7 11day = pd.Series(f"day{d+1}" for d in range(n_day)) 12 13#時刻の集合 14n_time = 9 15time = pd.Series(f"{t+12}時" for t in range(n_time)) 16#t時 : t時~t+1時 17 18#シフト番号 19n_shiftnumber = 6 20shiftnumber = pd.Series(f"shift{sn+1}" for sn in range(n_shiftnumber)) 21 22 23 24#シフトの一覧(直書き) 25shift = pd.DataFrame([[0, 0, 0, 0, 0, 0, 0, 0, 0], 26 [1, 1, 1, 1, 1, 1, 1, 1, 1], 27 [1, 1, 1, 0, 0, 0, 0, 0, 0], 28 [0, 0, 0, 1, 1, 1, 0, 0, 0], 29 [0, 0, 0, 0, 0, 0, 1, 1, 1], 30 [1, 1, 1, 0, 0, 0, 1, 1, 1]], index=shiftnumber, columns=time) 31 32#0:出勤不可のシフトパターン, 1:出勤可能のシフトパターン 33shiftdaycount = [int(sum(x) > 0) for x in shift.values] 34 35 36 37 38#各シフトの労働時間(直書き) 39wtime = pd.DataFrame([[0, 0, 0, 0, 0, 0, 0], 40 [9, 9, 9, 9, 9, 9, 9], 41 [3, 3, 3, 3, 3, 3, 3], 42 [3, 3, 3, 3, 3, 3, 3], 43 [3, 3, 3, 3, 3, 3, 3], 44 [6, 6, 6, 6, 6, 6, 6]], index=shiftnumber, columns=day) 45 46#必要人数 47need = pd.DataFrame([[2, 2, 2, 2, 2, 2, 2, 2, 2]], index=day, columns=time) 48 49#希望出勤日 50kibou = pd.DataFrame([[1, 1, 1, 1, 1, 1, 1], 51 [1, 1, 1, 1, 1, 1, 1], 52 [1, 1, 1, 1, 1, 1, 1], 53 [1, 1, 1, 1, 1, 1, 1], 54 [0, 0, 0, 0, 0, 0, 0]], index=member, columns=day) 55 56 57 58 59#時間を考慮したデータ 60#Day1 61kiboutime1 = pd.DataFrame([[0, 0, 0, 1, 1, 1, 0, 0, 0], 62 [0, 0, 0, 1, 1, 1, 0, 0, 0], 63 [1, 1, 1, 0, 0, 0, 1, 1, 1], 64 [1, 1, 1, 0, 0, 0, 1, 1, 1], 65 [0, 0, 0, 0, 0, 0, 0, 0, 0]], index=kibou.iloc[:,0], columns=time) 66 67 68 69#for t in range(time.size): 70# for s in range(n_shiftnumber): 71# for m in range(member.size): 72# shift.iloc[s,t] <= kiboutime1.iloc[m,t] 73 74 75 76 77 78#各メンバーの時給 79jikyu = pd.DataFrame([[900, 900, 900, 900, 900, 900, 900], 80 [900, 900, 900, 900, 900, 900, 900], 81 [900, 900, 900, 900, 900, 900, 900], 82 [900, 900, 900, 900, 900, 900, 900], 83 [900, 900, 900, 900, 900, 900, 900]], index=member, columns=day) 84 85#1日の人件費 86jinkenhi = pd.DataFrame([[16200], 87 [16200], 88 [16200], 89 [16200], 90 [16200], 91 [16200], 92 [16200]], index=day) 93 94 95 96#モデルの作成 97prob = LpProblem(sense=LpMinimize) 98 99#変数 100X = LpVariable.dicts('X', ([m for m in range(member.size)], [d for d in range(day.size)], [s for s in range(n_shiftnumber)]), 0, 1, 'Integer') 101 102 103#目的関数 104prob += kibou.values.sum() - lpSum(shiftdaycount[s] * X[m][d][s] for s in range(n_shiftnumber) for d in range(day.size) for m in range(member.size)) 105 106#制約条件 107#(制約1) 108for m in range(member.size): 109 #希望出勤日数 110 ks = kibou.iloc[m].sum() 111 #実際に働いた日数 112 actual = lpSum(shiftdaycount[s] * X[m][d][s] for s in range(n_shiftnumber) for d in range(day.size)) 113 #(制約1)実際に働いた日数が希望出勤日数を超えない制約 114 prob += actual <= ks 115 116 117 118#(制約2)必要最低人数を満たす制約 119for d in range(day.size): 120 for t in range(time.size): 121 prob += lpSum(shift.values[s][t] * X[m][d][s] for s in range(n_shiftnumber) for m in range(member.size) ) >= need.iloc[d, t] 122 123#(制約4)各メンバーが1日に取りうるシフトは必ず1つ 124for m in range(member.size): 125 for d in range(day.size): 126 prob += lpSum(X[m][d][s] for s in range(n_shiftnumber)) == 1 127 128#(制約5)人件費を超えない 129for d in range(day.size): 130 prob += lpSum(jikyu.iloc[m, d] * wtime.iloc[s, d] * X[m][d][s] for m in range(member.size) for s in range(n_shiftnumber) ) <= jinkenhi.iloc[d] 131 132#(制約6)6日以上の連続勤務を禁止する 133for m in range(member.size): 134 prob += lpSum(shiftdaycount[s] * X[m][d][s] for s in range(n_shiftnumber) for d in range(day.size)) <= 6 135 136#(制約7) 137for t in range(time.size): 138 for s in range(n_shiftnumber): 139 for m in range(member.size): 140 prob += shift.iloc[s,t] <= kiboutime1.iloc[m,t] 141 142 143prob.solve() 144 145 146scheduling = pd.DataFrame(index=member, columns=day) 147for m in range(member.size): 148 for d in range(day.size): 149 for s in range(n_shiftnumber): 150 if X[m][d][s].value() == 1: 151 scheduling.iloc[m, d] = shiftnumber[s] 152 153 154scheduling.to_csv("scheduling.csv") 155

(制約7)のところで、各メンバーの希望出勤時間とシフトパターンの同時刻部分を比較しています。シフトの時刻は、同時刻の希望出勤時間以下となる制約(希望出勤時間が0の時、シフトの同時刻は0をとり、その他の場合は0または1をとる)を表しています。
手書きではありますが、やりたいことのイメージは以下の通りです。
イメージ説明
しかし以下のようなエラーメッセージが出てきてしまいます。

発生してるエラーメッセージ

python

1TypeError: Can only add LpConstraintVar, LpConstraint, LpAffineExpression or True objects

(制約7)より前のものは、正しく動いていることが確認できているため、(制約7)の部分でエラーが起きていると思うのですが、どのように直したらいいか、または、別のやり方があるのかわからない状態です。
一方的な質問ですがご教授いただきたいです。
よろしくお願いいたします。

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

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

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

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

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

siruku6

2020/12/26 12:17

おそらくですが、回答するのに必要ない情報があまりにも多すぎて回答しにくいのではないかと感じました。 上手くいっているところの情報は消し、 ①うまくいかない処理の直前の入力データ ②うまくいかない処理 ③②の処理の結果 のような状態まで情報を減らした方がいいかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問