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

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

新規登録して質問してみよう
ただいま回答率
85.46%
最適化

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

Python

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

Q&A

0回答

632閲覧

制約条件が守られません。結果ではoptimalが出ていますが出力された表がおかしいです。

neiber

総合スコア1

最適化

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

Python

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

0グッド

0クリップ

投稿2020/08/19 00:56

前提・実現したいこと

シフトの割り当てを自動化しようとしています。

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

python

1#制約条件:遅番の次は早番ダメ 2for m in member: 3 for d in day: 4 if (d != D): 5 ShiftScheduling += x[m,"早番",d+1] + x[m,"遅番",d] != 2, "oso_haya_NG{:}_{:}".format(m,d)

上記の制約条件が守られていなく出力の表で見ると遅番の次に早番が来てしまっています。そこを直したいです。

該当のソースコード

pyton

1# -*- coding: utf-8 -*- 2import numpy as np, pandas as pd 3from pulp import * 4import random 5import xlrd 6import openpyxl 7 8df = xlrd.open_workbook('name.xlsx') 9sheet = df.sheet_by_name('シート1') 10number_of_syain = sheet.cell(2,19) 11number_of_morCS = sheet.cell(5,19) 12number_of_nigCS = sheet.cell(8,19) 13number_of_member = number_of_syain.value+number_of_morCS.value+number_of_nigCS.value 14kari_member_syain = sheet.col_values(2) 15member_syain = kari_member_syain[4:int(number_of_syain.value)+4] 16kari_member_morCS = sheet.col_values(8) 17member_morCS = kari_member_morCS[4:int(number_of_morCS.value)+4] 18kari_member_nigCS = sheet.col_values(14) 19member_nigCS = kari_member_nigCS[4:int(number_of_nigCS.value)+4] 20member = member_syain 21member.extend(member_morCS) 22member.extend(member_nigCS) 23D = 31 #クール内の日数 24day1 = list(range(11,D+1)) 25day2 = list(range(1,11)) 26day1.extend(day2) 27day = day1 28print(day) 29need_mor = {}#早番の必要人数 30for d in day: 31 need_mor[d] = 8 32need_nig = {}#遅番の必要人数 33for d in day: 34 need_nig[d] = 8 35 36time = ["早番","遅番"]#時間帯の属性 37 38hope_day = {}#希望休のリスト 39for m in member: 40 hope_day[m] = random.randint(1,31) 41 42o_rest = {}#公休の数 43for m in member: 44 o_rest[m] = 8 45 46#希望休を公休から引く 47for m in member: 48 o_rest[m] = o_rest[m] - 1 #len(hope_day[m]) 49 50ShiftScheduling = LpProblem("ShiftScheduling", LpMinimize) 51 52#変数 53x = {} 54for m in member: 55 for t in time: 56 for d in day: 57 x[m, t, d] = LpVariable('x({:},{:},{:})'.format(m,t,d), 0, 1, LpInteger)#バイナリ 58 59#目的関数:希望休の確保を最大にする 60ShiftScheduling += lpSum(x[m,t,d]for m in member for t in time for d in day),"Target" 61 62#制約条件:遅番の次は早番ダメ 63for m in member: 64 for d in day: 65 if (d != D): 66 ShiftScheduling += x[m,"早番",d+1] + x[m,"遅番",d] != 2, "oso_haya_NG{:}_{:}".format(m,d) 67#制約条件:希望休の確保 68for m in member: 69 ShiftScheduling += lpSum(x[m,t,hope_day[m]] for t in time) == 0, "Save_hope_{:}".format(m) 70 71#制約条件:1日の必要人員 72for d in day: 73 ShiftScheduling += lpSum(x[m, "早番", d] for m in member) >= need_mor[d], "Constraint_mor_{:}_早番".format(d) 74 75for d in day: 76 ShiftScheduling += lpSum(x[m, "遅番", d] for m in member) >= need_nig[d], "Constraint_nig_{:}_遅番".format(d) 77 78#制約条件:1日に片方だけ 79for d in day: 80 for m in member: 81 ShiftScheduling += lpSum(x[m,t,d] for t in time) <= 1, "Mor_or_Nig_{:}_{:}".format(m,d) 82 83 84#制約条件:公休の確保 85for m in member: 86 ShiftScheduling += lpSum(x[m,t,d] for t in time for d in day) == D - o_rest[m],"Save_rest_{:}".format(m) 87 88#制約条件:早番のCSキャスト 89for m in member_morCS: 90 ShiftScheduling += lpSum(x[m,"遅番",d] for d in day) == 0 ,"Mor_only_member_{:}".format(m) 91 92#制約条件:遅番のCSキャスト 93for m in member_nigCS: 94 ShiftScheduling += lpSum(x[m,"早番",d] for d in day) == 0 ,"Nig_only_member_{:}".format(m) 95 96#制約条件:希望休の確保 97#for m in member: 98# ShiftScheduling += lpSum(x[m,t,rest_day]) 99 100#制約条件:6勤はさせない 101for m in member: 102 for d in day: 103 if (d <= D-5): 104 ShiftScheduling += lpSum(x[m,t,dk] for t in time for dk in range(d,d+6)) <= 5 105 else: 106 kari1=D-d 107 kari=6 - kari1 108 ShiftScheduling += (lpSum(x[m,t,d1] for t in time for d1 in range(d,D+1)) + lpSum(x[m,t,d2] for t in time for d2 in range(1,kari))) <= 5 109 110 111 112#for d in day: 113# ShiftScheduling += lpSum(x[m,t,d] for m in member for t in time) >= 6 114 115#ソルバーの実行 116results = ShiftScheduling.solve() 117 118#optimaliyがoptimalであれば最適化されているだろう 119print("optimality = {:}, target value = {:}".format(LpStatus[results], value(ShiftScheduling.objective))) 120for d in day: 121 print(d + sum(value(x[m,t,d])for m in member for t in time)) 122 123shift_mli = {} 124kari_Shift = pd.DataFrame({}) 125Shift = pd.DataFrame({}) 126for m in member: 127 for d in day: 128 if(value(x[m,"早番",d])==1): 129 shift_mli[d] = "早番" 130 elif(value(x[m,"遅番",d])==1): 131 shift_mli[d] = "遅番" 132 else: 133 shift_mli[d] = "公休" 134 else: 135 kari_Shift[m] = shift_mli.values() 136 137Shift = kari_Shift.T 138Shift.columns = day 139 140print(Shift) 141 142Shift.to_csv('out.csv') 143 144with pd.ExcelWriter('pandas_to_excel_multi.xlsx') as writer: 145 Shift.to_excel(writer, sheet_name='sheet1') 146

入力データなどのファイルを添付します

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問