質問するログイン新規登録
Python

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

Q&A

解決済

2回答

824閲覧

int関数の引数の指定について

sdsd1024sdsd

総合スコア4

Python

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

1グッド

1クリップ

投稿2020/04/13 07:03

1

1

前提・実現したいこと

現在Pythonにてシフト作成のプログラムを作りたいと思い、下記サイトを参照してとりあえずソースコードをそのままコピペして実行しました。ソースコードをそのままコピペしたのですが以下のエラーメッセージが発生しました。
ファイル名はsd2.pyです。下記サイトの実行結果の通りにしたいです。
https://qiita.com/SaitoTsutomu/items/a33aba1a95828eb6bd3f

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

Traceback (most recent call last): File "sd2.py", line 57, in <module> R結果 = np.vectorize(value)(V割当).astype(int) TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

該当のソースコード

import numpy as np, pandas as pd from pulp import * from ortoolpy import addvars, addbinvars from io import StringIO a = pd.read_table(StringIO("""\ 曜日\t月\t月\t月\t火\t火\t火\t水\t水\t水\t木\t木\t木\t金\t金\t金\t土\t土\t土\t日\t日\t日 時間帯\t朝\t昼\t夜\t朝\t昼\t夜\t朝\t昼\t夜\t朝\t昼\t夜\t朝\t昼\t夜\t朝\t昼\t夜\t朝\t昼\t夜 必要人数\t2\t3\t3\t2\t3\t3\t2\t3\t3\t1\t2\t2\t2\t3\t3\t2\t4\t4\t2\t4\t4 従業員0\t○\t\t\t○\t\t\t○\t\t\t○\t\t\t○\t\t\t○\t\t\t○\t\t 従業員1\t○\t○\t○\t\t\t\t○\t○\t○\t\t\t\t○\t○\t○\t\t\t\t\t\t 従業員2\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t○\t○\t○\t○\t○\t○ 従業員3\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○ 従業員4\t\t\t○\t\t\t○\t\t\t○\t\t\t○\t\t\t○\t\t\t○\t\t\t○ 従業員5\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t\t 従業員6\t\t\t\t\t\t\t\t\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○ 従業員7\t\t○\t\t\t○\t\t\t○\t\t\t○\t\t\t○\t\t\t○\t\t\t○\t 従業員8\t\t\t○\t\t\t○\t\t\t○\t\t\t○\t\t\t○\t\t\t○\t\t\t○ 従業員9\t\t\t\t\t\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○""")).T a,a.columns = a.iloc[1:],a.iloc[0].tolist() a.必要人数 = a.必要人数.astype(int) a.iloc[:,2:] = ~a.iloc[:,2:].isnull() a.insert(0, '曜日', a.index.str[0]) a.reset_index(drop=True, inplace=True) a = a.iloc[:,list(range(3,a.shape[1]))+[0,1,2]] print(a[:3]) # 最初の3行表示 Nコマ,N従業員 = a.shape[0],a.shape[1]-3 L従業員 = list(range(N従業員)) L管理者 = [3,5,9] # 管理者は従業員3, 5, 9 C必要人数差 = 10 C希望不可 = 100 C最低コマ数 = 1 C管理者不足 = 100 C1日2コマ = 10 m = LpProblem() # 数理モデル V割当 = np.array(addbinvars(Nコマ, N従業員)) a['V必要人数差'] = addvars(Nコマ) V最低コマ数 = addvars(N従業員) a['V管理者不足'] = addvars(Nコマ) V1日2コマ = addvars(N従業員) m += (C必要人数差 * lpSum(a.V必要人数差) + C希望不可 * lpSum(a.apply(lambda r: lpDot(1-r[L従業員],V割当[r.name]), 1)) + C最低コマ数 * lpSum(V最低コマ数) + C管理者不足 * lpSum(a.V管理者不足) + C1日2コマ * lpSum(V1日2コマ)) # 目的関数 for _,r in a.iterrows(): m += r.V必要人数差 >= (lpSum(V割当[r.name]) - r.必要人数) m += r.V必要人数差 >= -(lpSum(V割当[r.name]) - r.必要人数) m += lpSum(V割当[r.name,L管理者]) + r.V管理者不足 >= 1 for j,n in enumerate((a.iloc[:,L従業員].sum(0)+1)//2): m += lpSum(V割当[:,j]) + V最低コマ数[j] >= n # 希望の半分以上 for _,v in a.groupby('曜日'): for j in range(N従業員): m += lpSum(V割当[v.index,j]) - V1日2コマ[j] <= 2 # 各曜日で2コマまで %time m.solve() R結果 = np.vectorize(value)(V割当).astype(int) a['結果'] = [''.join(i*j for i,j in zip(r,a.columns)) for r in R結果] print('目的関数', value(m.objective)) print(a[['曜日','時間帯','結果']])

試したこと

エラーメッセージには、intの引数はstring,bytes-like object,numberにしろと出てますがそもそものソースコードには引数が省略されていました。なので引数をいろいろ指定してみたのですがうまくいきませんでした。

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

動作環境
OS:Windows 10 64bit
Wibdows Subsystem for Linux Ubuntu
Python 3.8

DrqYuto👍を押しています

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

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

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

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

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

quickquip

2020/04/13 09:35 編集

valueがコードに含まれていないのであなた以外に再現できません。解決出来ない理由は、再現できる最小限のコードを書けないからではないでしょうか。 あと R結果 = np.vectorize(value)(V割当).astype(int) を R結果 = np.vectorize(value)(V割当) に変えたら結果はどうなりますか?
guest

回答2

0

自己解決

%time m.solve()の部分でうまく最適化が動作せず、ソルバが実行できていませんでした。m.solve()に書き換えたところ最適化をソルバが解いてくれました。int関数は関係ありませんでした。回答していただいた皆様ありがとうございました。

投稿2020/04/13 11:03

sdsd1024sdsd

総合スコア4

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

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

0

int関数の引数がカラです、ってエラーです。
なにがはいってるのか調べてみては。

投稿2020/04/13 07:37

y_waiwai

総合スコア88180

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

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

sdsd1024sdsd

2020/04/13 07:57

回答ありがとうございます。なにが入っているかとは、どういうことでしょうか?
y_waiwai

2020/04/13 08:11

どういうことと言われてもw 何を入れてint関数呼んでるんでしょうか
shiracamus

2020/04/13 08:59 編集

>>> int("123") 123 >>> int(456.789) 456 >>> int(None) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
sdsd1024sdsd

2020/04/13 09:19

お二方回答ありがとうございます。int関数がわからないのではなくて、上記サイトのソースコードのintが()のみとなっているにも関わらず実行できているのは何故なのかわからなかったので質問させていただきました。
shiracamus

2020/04/13 09:26 編集

引数を省略すると 0 です。 >>> int() 0 >>> float() 0.0 >>> str() '' >>> list() [] >>> tuple() ()
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問