OptaPy adalah pemecah kendala AI untuk Python untuk mengoptimalkan Masalah Perutean Kendaraan, Daftar Karyawan, Penjadwalan Pemeliharaan, Penugasan Tugas, Penjadwalan Sekolah, Optimasi Cloud, Penjadwalan Konferensi, Penjadwalan Job Shop, Pengepakan Bin, dan banyak lagi masalah perencanaan lainnya.
OptaPy membungkus mesin OptaPlanner secara internal, tetapi menggunakan OptaPy dengan Python jauh lebih lambat dibandingkan menggunakan OptaPlanner di Java atau Kotlin.
Coba buku catatan OptaPy Jupyter.
JAVA_HOME
yang dikonfigurasi ke direktori instalasi JDK. Di OptaPy, domain memiliki tiga bagian:
Untuk mendeklarasikan Fakta Masalah, gunakan dekorator @problem_fact
from optapy import problem_fact
@ problem_fact
class Timeslot :
def __init__ ( self , id , day_of_week , start_time , end_time ):
self . id = id
self . day_of_week = day_of_week
self . start_time = start_time
self . end_time = end_time
Untuk mendeklarasikan Entitas Perencanaan, gunakan dekorator @planning_entity
from optapy import planning_entity , planning_id , planning_variable
@ planning_entity
class Lesson :
def __init__ ( self , id , subject , teacher , student_group , timeslot = None , room = None ):
self . id = id
self . subject = subject
self . teacher = teacher
self . student_group = student_group
self . timeslot = timeslot
self . room = room
@ planning_id
def get_id ( self ):
return self . id
@ planning_variable ( Timeslot , value_range_provider_refs = [ "timeslotRange" ])
def get_timeslot ( self ):
return self . timeslot
def set_timeslot ( self , new_timeslot ):
self . timeslot = new_timeslot
@ planning_variable ( Room , value_range_provider_refs = [ "roomRange" ])
def get_room ( self ):
return self . room
def set_room ( self , new_room ):
self . room = new_room
@planning_variable
dekorator metode digunakan untuk menunjukkan bidang apa yang dapat diubah. HARUS dimulai dengan get dan memiliki metode set yang sesuai (yaitu get_room(self)
, set_room(self, newRoom)
). Parameter pertama dekorator adalah jenis Variabel Perencanaan (wajib). Parameter value_range_provider_refs
memberi tahu OptaPlanner penyedia rentang nilai apa pada Solusi Perencanaan yang dapat diambil nilainya oleh Variabel Perencanaan ini.
@planning_id
digunakan untuk mengidentifikasi secara unik suatu objek entitas dari kelas tertentu. Id Perencanaan yang sama dapat digunakan pada entitas kelas yang berbeda, namun id semua entitas dalam kelas yang sama harus berbeda.
Untuk mendeklarasikan Solusi Perencanaan, gunakan dekorator @planning_solution
from optapy import planning_solution , problem_fact_collection_property , value_range_provider , planning_entity_collection_property , planning_score
@ planning_solution
class TimeTable :
def __init__ ( self , timeslot_list , room_list , lesson_list , score = None ):
self . timeslot_list = timeslot_list
self . room_list = room_list
self . lesson_list = lesson_list
self . score = score
@ problem_fact_collection_property ( Timeslot )
@ value_range_provider ( range_id = "timeslotRange" )
def get_timeslot_list ( self ):
return self . timeslot_list
@ problem_fact_collection_property ( Room )
@ value_range_provider ( range_id = "roomRange" )
def get_room_list ( self ):
return self . room_list
@ planning_entity_collection_property ( Lesson )
def get_lesson_list ( self ):
return self . lesson_list
@ planning_score ( HardSoftScore )
def get_score ( self ):
return self . score
def set_score ( self , score ):
self . score = score
@value_range_provider(range_id)
digunakan untuk menunjukkan metode mengembalikan nilai yang dapat diambil oleh Variabel Perencanaan. Itu dapat direferensikan dengan idnya di parameter value_range_provider_refs
@planning_variable
. Itu juga harus memiliki @problem_fact_collection_property
atau @planning_entity_collection_property
.
@problem_fact_collection_property(type)
digunakan untuk menunjukkan metode mengembalikan Fakta Masalah. Parameter pertama dekorator adalah jenis Pengumpulan Fakta Masalah (wajib). Ini harusnya berupa daftar.
@planning_entity_collection_property(type)
digunakan untuk menunjukkan metode mengembalikan Entitas Perencanaan. Parameter pertama dekorator adalah jenis Koleksi Entitas Perencana (wajib). Ini harusnya berupa daftar.
@planning_score(scoreType)
digunakan untuk memberi tahu OptaPlanner bidang apa yang menyimpan skor. Metode HARUS dimulai dengan get dan memiliki metode set yang sesuai (yaitu get_score(self)
, set_score(self, score)
). Parameter pertama dekorator adalah jenis skor (wajib).
Anda menentukan batasan Anda dengan menggunakan ConstraintFactory
from domain import Lesson
from optapy import constraint_provider
from optapy . types import Joiners , HardSoftScore
@ constraint_provider
def define_constraints ( constraint_factory ):
return [
# Hard constraints
room_conflict ( constraint_factory ),
# Other constraints here...
]
def room_conflict ( constraint_factory ):
# A room can accommodate at most one lesson at the same time.
return constraint_factory . for_each_unique_pair ( Lesson ,
# ... in the same timeslot ...
Joiners . equal ( lambda lesson : lesson . timeslot ),
# ... in the same room ...
Joiners . equal ( lambda lesson : lesson . room ))
. penalize ( "Room conflict" , HardSoftScore . ONE_HARD )
untuk detail selengkapnya tentang Aliran Kendala, lihat https://www.optaplanner.org/docs/optaplanner/latest/constraint-streams/constraint-streams.html
from optapy import solver_factory_create
from optapy . types import SolverConfig , Duration
from constraints import define_constraints
from domain import TimeTable , Lesson , generate_problem
solver_config = SolverConfig (). withEntityClasses ( Lesson )
. withSolutionClass ( TimeTable )
. withConstraintProviderClass ( define_constraints )
. withTerminationSpentLimit ( Duration . ofSeconds ( 30 ))
solver = solver_factory_create ( solver_config ). buildSolver ()
solution = solver . solve ( generate_problem ())
solution
akan menjadi contoh TimeTable
dengan variabel perencanaan yang ditetapkan ke solusi terbaik akhir yang ditemukan.
Untuk memulai cepat, kunjungi repositori mulai cepat optapy. Untuk spesifikasi API lengkap, kunjungi Dokumentasi OptaPy.