[[OptaPlanner]] * 目次 [#g14bdacb] #contents * OptaPlanner: AIパワードの制約ソルバーで最適化問題を解決 [#z78e9e57] ** OptaPlannerとは [#s8f171e1] OptaPlanner https://www.optaplanner.org/ は、ソフトウェア開発者向けの高速で使いやすいオープンソースAI制約ソルバーです。複雑な計画立案やスケジューリング問題を効率的に解決するツールとして設計されています。 *** もっとまとめられた日立の資料 [#ie50b364] https://www.hitachi-solutions.co.jp/redhat/asset/pdf/download/osc2015-kyoto.pdf ** 主な特徴 [#t2c4b8f3] - 軽量で埋め込み可能な計画エンジン - 平易なドメインオブジェクトに制約を適用可能 - 数式入力不要で直感的に使用可能 - Java、Kotlin、Scala、Python(実験的)との互換性 - QuarkusやSpring Bootとのシームレスな統合 ** 対応可能な問題 [#u5d7e9a2] - 車両ルーティング問題(VRP) - 従業員のシフトスケジューリング - メンテナンススケジューリング - 会議スケジューリング - 学校の時間割作成 - タスク割り当て - クラウドリソースの最適化 - ジョブショップスケジューリング ** 主要機能 [#v6f0c4b8] - 継続的計画:実行3週間前にスケジュールを公開 - 非破壊的な再計画:公開済みスケジュールの変更に対応 - リアルタイム計画:ミリ秒単位で計画の乱れに対応 - 過剰制約計画:リソース不足時の最適化 - ピン留め:ユーザーによるスケジュール制御 ** 技術的特徴 [#w7g1d5e9] - 高度なAI最適化アルゴリズムの使用 - タブーサーチ - シミュレーテッドアニーリング - 遅延受理法 - その他のメタヒューリスティクス - 効率的なスコア計算 - NP完全問題やNP困難問題に対する最先端の制約解決技術 ** 紹介記事 [#wd84c599] *** QuickStartの始め方 [#m7752a73] 本家のデモをローカルで動かすやりかた https://rheb.hatenablog.com/entry/optaplanner8_orderpicking *** Eclipseでの設定 [#p5b7adb4] https://www.ogis-ri.co.jp/otc/hiroba/technical/optaplanner/chap3.html *** 組み合わせ最適化で配送・集荷経路を作ってみる [#wbdf5048] https://www.ogis-ri.co.jp/otc/hiroba/technical/optaplanner/chap4.html ** 使用例 [#x8h2f6a0] 以下は、Java™コードでOptaPlannerを使用する簡単な例です。 SolverFactory<MyRoster> factory = SolverFactory.create(...); // 入力として自分のドメイン固有のクラスを使用 MyRoster problem = ...; Solver<MyRoster> solver = factory.buildSolver(); // 出力として自分のドメイン固有のクラスを使用 MyRoster solution = solver.solve(problem); for (MyShift shift : solution.getShifts()) { // 各シフトが従業員に割り当てられていることを確認 assertNotNull(shift.getEmployee()); } * 車両ルーティング問題(VRP)のOptaPlannerによる解決 [#a1b2c3d4] 車両ルーティング問題(VRP)は、複数の車両を使って効率的に顧客に商品を配送するための最適なルートを見つける問題です。OptaPlannerを使用することで、以下のような制約を考慮しながら最適なルートを計算できます。 - 各車両の積載容量 - 顧客の時間枠制約(配送可能時間) - 運転手の勤務時間制限 - 交通状況や道路の制約 ** OptaPlannerの適用例 [#n2749eb9] SolverFactory<VehicleRoutingSolution> factory = SolverFactory.createFromXmlResource("vrpSolverConfig.xml"); VehicleRoutingSolution problem = ... // 問題のインスタンスを作成 VehicleRoutingSolution solution = factory.buildSolver().solve(problem); for (Vehicle vehicle : solution.getVehicleList()) { System.out.println("Vehicle " + vehicle.getId() + " route:"); for (Customer customer : vehicle.getRoute()) { System.out.println(" - " + customer.getLocation()); } } OptaPlannerを使用することで、燃料コストの削減、配送時間の短縮、顧客満足度の向上など、多くのメリットが得られます。 * 従業員のシフトスケジューリングのOptaPlannerによる最適化 [#e5f6g7h8] 従業員のシフトスケジューリングは、従業員の希望、スキル、労働法規制などを考慮しながら、効率的な勤務スケジュールを作成する問題です。OptaPlannerを使用することで、以下のような制約を満たすスケジュールを自動生成できます。 - 必要な人員数の確保 - 従業員の希望するシフトの考慮 - 連続勤務日数の制限 - スキルに応じた適切な配置 ** OptaPlannerの適用例 [#xdcd63df] SolverFactory<ShiftSchedule> factory = SolverFactory.createFromXmlResource("shiftScheduleSolverConfig.xml"); ShiftSchedule problem = ... // 問題のインスタンスを作成 ShiftSchedule solution = factory.buildSolver().solve(problem); for (Employee employee : solution.getEmployeeList()) { System.out.println("Employee " + employee.getName() + " schedule:"); for (Shift shift : employee.getAssignedShifts()) { System.out.println(" - " + shift.getDate() + ": " + shift.getType()); } } OptaPlannerを活用することで、従業員の満足度向上、労働法規制の遵守、人件費の最適化などが実現できます。 * メンテナンススケジューリングのOptaPlannerによる効率化 [#i9j0k1l2] メンテナンススケジューリングは、機器や設備の定期点検や修理を効率的に計画する問題です。OptaPlannerを使用することで、以下のような制約を考慮しながら最適なスケジュールを作成できます。 - 機器ごとの点検間隔 - 技術者のスキルと可用性 - 部品の在庫状況 - 生産ラインへの影響の最小化 ** OptaPlannerの適用例 [#f0615a99] SolverFactory<MaintenanceSchedule> factory = SolverFactory.createFromXmlResource("maintenanceScheduleSolverConfig.xml"); MaintenanceSchedule problem = ... // 問題のインスタンスを作成 MaintenanceSchedule solution = factory.buildSolver().solve(problem); for (Equipment equipment : solution.getEquipmentList()) { System.out.println("Equipment " + equipment.getName() + " maintenance schedule:"); for (MaintenanceTask task : equipment.getScheduledTasks()) { System.out.println(" - " + task.getDate() + ": " + task.getType()); } } OptaPlannerを導入することで、ダウンタイムの削減、コスト削減、機器の寿命延長などの利点が得られます。 * 会議スケジューリングのOptaPlannerによる最適化 [#m3n4o5p6] 会議スケジューリングは、参加者の都合、会議室の利用可能性、議題の優先順位などを考慮しながら、効率的な会議スケジュールを作成する問題です。OptaPlannerを使用することで、以下のような制約を満たすスケジュールを自動生成できます。 - 参加者の空き時間の調整 - 会議室の重複予約の回避 - 議題に応じた適切な時間配分 - 移動時間の考慮 ** OptaPlannerの適用例 [#o839b2f3] SolverFactory<ConferenceSchedule> factory = SolverFactory.createFromXmlResource("conferenceScheduleSolverConfig.xml"); ConferenceSchedule problem = ... // 問題のインスタンスを作成 ConferenceSchedule solution = factory.buildSolver().solve(problem); for (Meeting meeting : solution.getMeetingList()) { System.out.println("Meeting: " + meeting.getTopic()); System.out.println(" Time: " + meeting.getStartTime() + " - " + meeting.getEndTime()); System.out.println(" Room: " + meeting.getRoom().getName()); System.out.println(" Participants: " + meeting.getParticipants()); } OptaPlannerを活用することで、会議の効率化、参加者の満足度向上、リソースの有効活用などが実現できます。 * 学校の時間割作成のOptaPlannerによる自動化 [#q7r8s9t0] 学校の時間割作成は、教師の空き時間、教室の利用可能性、科目の制約などを考慮しながら、効率的な授業スケジュールを作成する問題です。OptaPlannerを使用することで、以下のような制約を満たす時間割を自動生成できます。 - 教師の担当科目と空き時間の調整 - 教室の収容人数と設備の考慮 - 科目ごとの週間授業時間数の遵守 - 連続授業の制限 ** OptaPlannerの適用例 [#m0de7a91] SolverFactory<SchoolTimetable> factory = SolverFactory.createFromXmlResource("schoolTimetableSolverConfig.xml"); SchoolTimetable problem = ... // 問題のインスタンスを作成 SchoolTimetable solution = factory.buildSolver().solve(problem); for (SchoolClass schoolClass : solution.getClassList()) { System.out.println("Class " + schoolClass.getName() + " timetable:"); for (Lesson lesson : schoolClass.getLessons()) { System.out.println(" " + lesson.getTimeslot() + ": " + lesson.getSubject() + " (" + lesson.getTeacher().getName() + ")"); } } OptaPlannerを導入することで、時間割作成の工数削減、教育の質の向上、リソースの効率的な活用などが可能になります。 * タスク割り当てのOptaPlannerによる最適化 [#u1v2w3x4] タスク割り当ては、プロジェクトのタスクを適切な従業員に割り当てる問題です。OptaPlannerを使用することで、以下のような制約を考慮しながら最適な割り当てを行うことができます。 - 従業員のスキルセット - タスクの優先度と締め切り - 従業員の現在の作業負荷 - プロジェクト間の依存関係 ** OptaPlannerの適用例 [#s6775d16] SolverFactory<TaskAssignment> factory = SolverFactory.createFromXmlResource("taskAssignmentSolverConfig.xml"); TaskAssignment problem = ... // 問題のインスタンスを作成 TaskAssignment solution = factory.buildSolver().solve(problem); for (Employee employee : solution.getEmployeeList()) { System.out.println("Employee " + employee.getName() + " assigned tasks:"); for (Task task : employee.getAssignedTasks()) { System.out.println(" - " + task.getName() + " (Due: " + task.getDueDate() + ")"); } } OptaPlannerを活用することで、プロジェクトの効率化、従業員のスキル活用の最大化、納期遵守率の向上などが実現できます。 * クラウドリソースの最適化におけるOptaPlannerの活用 [#y5z6a7b8] クラウドリソースの最適化は、仮想マシン(VM)やコンテナの配置を効率的に行い、コストを削減しつつパフォーマンスを最大化する問題です。OptaPlannerを使用することで、以下のような制約を考慮しながら最適な配置を決定できます。 - 物理サーバーの処理能力と容量 - VMやコンテナのリソース要件 - ネットワーク帯域幅の制約 - 高可用性要件 ** OptaPlannerの適用例 [#p8fb5956] SolverFactory<CloudResourceAllocation> factory = SolverFactory.createFromXmlResource("cloudResourceSolverConfig.xml"); CloudResourceAllocation problem = ... // 問題のインスタンスを作成 CloudResourceAllocation solution = factory.buildSolver().solve(problem); for (PhysicalServer server : solution.getServerList()) { System.out.println("Server " + server.getId() + " allocated resources:"); for (VirtualMachine vm : server.getAllocatedVMs()) { System.out.println(" - VM " + vm.getId() + " (CPU: " + vm.getCpuUsage() + ", Memory: " + vm.getMemoryUsage() + ")"); } } OptaPlannerを導入することで、クラウドリソースの使用効率向上、コスト削減、パフォーマンス最適化などが可能になります。 * ジョブショップスケジューリングのOptaPlannerによる効率化 [#c9d0e1f2] ジョブショップスケジューリングは、複数の機械で複数のジョブを処理する際の最適な順序と時間割り当てを決定する問題です。OptaPlannerを使用することで、以下のような制約を考慮しながら最適なスケジュールを作成できます。 - 各ジョブの処理順序の制約 - 機械ごとの処理能力 - セットアップ時間の最小化 - 納期遵守 ** OptaPlannerの適用例 [#q4c18a90] SolverFactory<JobShopSchedule> factory = SolverFactory.createFromXmlResource("jobShopScheduleSolverConfig.xml"); JobShopSchedule problem = ... // 問題のインスタンスを作成 JobShopSchedule solution = factory.buildSolver().solve(problem); for (Machine machine : solution.getMachineList()) { System.out.println("Machine " + machine.getName() + " schedule:"); for (Operation operation : machine.getScheduledOperations()) { System.out.println(" - Job " + operation.getJob().getId() + ", Operation " + operation.getId() + " (Start: " + operation.getStartTime() + ", End: " + operation.getEndTime() + ")"); } } OptaPlannerを活用することで、生産効率の向上、リードタイムの短縮、設備稼働率の最適化などが実現できます。 ** まとめ [#y9i3g7b1] OptaPlannerは、複雑な最適化問題を効率的に解決するための強力なツールです。オープンソースで、幅広い互換性を持ち、様々な産業分野で活用できる柔軟性を備えています。AI技術を活用した最適化ソリューションを探している開発者にとって、OptaPlannerは非常に魅力的な選択肢となるでしょう。 * その他参考 [#g5636c88] ** OptaPlanner コミュニティサイト [#m8c89095] http://www.optaplanner.org/ ** OptaPlannerによる組み合わせ最適化 [#l972c7f3] http://www.ogis-ri.co.jp/otc/hiroba/technical/optaplanner/ ** tokobayashiの日記 [#de8fbe65] http://d.hatena.ne.jp/tokobayashi/searchdiary?word=%2A%5BOptaPlanner%5D ** Play Integration [#y2e06dd3] http://playintegration.blogspot.jp/search?q=OptaPlanner ** 簡単そうで難しい組合せ最適化 [#g420393d] http://www-or.amp.i.kyoto-u.ac.jp/open-campus-04.pdf ** 久保 幹雄, J.P.ペドロソ(2009) 『メタヒューリスティクスの数理』 共立出版. [#ra013dcb] ** 穴井 宏和(2013) 『数理最適化の実践ガイド』 講談社 [#i9195257]