🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Q&A

1回答

629閲覧

プログラムのエラーメッセージについて

K.takita

総合スコア14

Python 3.x

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

0グッド

0クリップ

投稿2020/12/15 06:07

前提・実現したいこと

以下のプログラムで、各メンバーに対してすべてのシフトパターンを比較し、各メンバーのシフトを決定するということを行いたいです。
各データ(shift, Day1kiboutime)は、0が出勤しない時間帯を表し、1がshiftの場合出勤時間、Day1kiboutimeの場合出勤可能時間を表しています。

該当のソースコード

import numpy as np import pandas as pd from pulp import LpBinary, LpMinimize, LpProblem, LpVariable, lpSum, value #アルバイトの集合 n_member = 5 member = pd.Series(f"member{m+1}" for m in range(n_member)) #日にちの集合 n_day = 7 day = pd.Series(f"day{d+1}" for d in range(n_day)) #時刻の集合 n_time = 9 time = pd.Series(f"{t+12}時" for t in range(n_time)) #t時 : t時~t+1時 #シフト番号 n_shiftnumber = 6 shiftnumber = pd.Series(f"shift{sn+1}" for sn in range(n_shiftnumber)) #シフトの一覧(直書き) shift = pd.DataFrame([[0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1], [1, 1, 1, 0, 0, 0, 1, 1, 1]], index=shiftnumber, columns=time) #希望出勤時間(Day1) Day1kiboutime = pd.DataFrame([[0, 0, 0, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 0, 0, 0], [1, 1, 1, 0, 0, 0, 1, 1, 1], [1, 1, 1, 0, 0, 0, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0]], index=member, columns=time)

Day1kiboutimeとshiftの組み合わせが4つあります。((Day1kiboutime,shift)=(0,0),(0,1),(1,0),(1,1))
見方としては、(Day1kiboutime,shift)=(0,0)の場合、希望出勤時間が0、シフトの出勤時間も0という見方です。
今回行いたいことは、(Day1kiboutime,shift)=(0,1)の時(希望出勤時間が0のとき、シフトの出勤時間が1)を不可にするシフト行いたいです。
私自身が思いついた方法として、Day1kiboutime - shift が0以上の場合可能にすればよいと思い以下のプログラムを試しました。しかしエラーが発生してしまいました。

試したこと

#(制約) for m in range(member.size): for s in range(shiftnumber.size): prob += (Day1kiboutime.iloc[m,t] - shift.iloc[s,t] for t in range(time.size)) >= 0

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

prob += (Day1kiboutime.iloc[m,t] - shift.iloc[s,t] for t in range(time.size)) >= 0 TypeError: '>=' not supported between instances of 'generator' and 'int'

このエラーメッセージの意味、また、改善方法を教えていただきたく思い、質問させていただきました。ご教授いただけると幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

とりあえず質問にだけ答えますと、range というのは generator という型のオブジェクトを返しまして、それに対し 0int という値です。この間で使える演算子 >= の実装は定義されていませんよという意味です。'foo' >= 1 でも同じようなエラーが出ることがわかります。

それにしてもカッコの中に入った for はなんでしょうか。リスト内包表記?そちらのほうが気になりますが……。

投稿2020/12/15 06:18

A_kirisaki

総合スコア2853

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

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

K.takita

2020/12/15 08:08

A_kirisakiさん ご回答ありがとうございます。エラーが発生する理由は理解できました。 カッコ内のforについてですが、このプログラムでは、Day1kiboutimeのmember1とshiftのshift1の時刻tからtime.sizeの間実行し、それをmember1に対しshift1~6のすべて行い、それが終わったらmember2,3,・・・といった順に行うということをしたいです。 カッコ内でfor文を入れることで、すべての時刻に対して行ってくれると思い記載しました。 こういった時の正しい日本語での説明がわからず、自分のイメージでの説明になってしまいました。申し訳ありません。 この自分のイメージをプログラムにしようとしたとき、根本的にプログラムが間違っているのか、どこか一部が間違っているかの判断がつかない状態です。いろいろ分かりづらくなってしまい申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問