Method: scheduling.solveShiftGeneration

แก้ปัญหาการสร้างกะการทำงานจาก SolveShiftGenerationRequest ที่ระบุด้วยการสร้างกะการทำงานจากเทมเพลตกะการทำงานที่กำหนดเพื่อให้ครอบคลุมความต้องการของพนักงาน

คำขอ HTTP

POST https://optimization.googleapis.com/v1/scheduling:solveShiftGeneration

URL ใช้ไวยากรณ์การแปลง gRPC

เนื้อหาของคำขอ

เนื้อหาของคำขอมีข้อมูลที่มีโครงสร้างต่อไปนี้

การแสดง JSON
{
  "solverConfig": {
    object (SolverConfig)
  },
  "shiftTemplates": [
    {
      object (ShiftTemplate)
    }
  ],
  "employeeDemands": [
    {
      object (EmployeeDemand)
    }
  ]
}
ช่อง
solverConfig

object (SolverConfig)

ไม่บังคับ พารามิเตอร์สําหรับเครื่องมือแก้โจทย์

shiftTemplates[]

object (ShiftTemplate)

ต้องระบุ ชุดของเทมเพลตกะที่ระบุกฎสำหรับการสร้างกะ

employeeDemands[]

object (EmployeeDemand)

ต้องระบุ ความต้องการของพนักงานทั้งหมดสำหรับการเปลี่ยนแปลงที่ shiftTemplates ต้องครอบคลุม

เนื้อหาการตอบกลับ

การตอบสนองสำหรับปัญหาการสร้างกะ หาก solutionStatus แสดงผลเป็น SOLVED ชุดของการเปลี่ยนแปลงที่ถูกต้องซึ่งเครื่องมือแก้โจทย์จะถูกส่งคืนใน employeeSchedules พร็อพเพอร์ตี้ต่อไปนี้จะมีการเก็บรักษาเพื่อกำหนดเวลากะการทำงานที่ถูกต้อง

  1. การปรับแต่ละครั้งที่สร้างใน employeeSchedules จะเป็นไปตามกฎที่ระบุไว้ใน ShiftTemplate ที่เกี่ยวข้อง
  2. แต่ละเหตุการณ์ที่เลือกไว้ในแต่ละกะจะเป็นไปตามกฎที่ระบุไว้ในShiftTemplate.Event ที่เกี่ยวข้อง
  3. จำนวนพนักงานทั้งหมดที่มอบหมายให้กับชุดกะที่สร้างจาก ShiftTemplate เดียวกันไม่เกิน maximumEmployeeCount ของเทมเพลตนั้น
  4. กลุ่มพนักงานที่ได้รับมอบหมายจะครอบคลุมความต้องการในทุกช่วงเวลา

หากทำสำเร็จ เนื้อหาการตอบกลับจะมีข้อมูลซึ่งมีโครงสร้างดังต่อไปนี้

การแสดง JSON
{
  "solutionStatus": enum (ShiftGenerationSolutionStatus),
  "employeeSchedules": [
    {
      object (EmployeeSchedule)
    }
  ],
  "demandCoverageViolations": [
    {
      object (DemandCoverageViolation)
    }
  ]
}
ช่อง
solutionStatus

enum (ShiftGenerationSolutionStatus)

สถานะของโซลูชันที่ส่งคืน หาก solutionStatus ไม่ใช่ SOLVED ค่า employeeSchedules จะว่างเปล่า

employeeSchedules[]

object (EmployeeSchedule)

ชุดกะการทำงานที่เกิดขึ้นจากเครื่องมือแก้โจทย์ควบคู่กับจำนวนพนักงานที่มอบหมายให้กับแต่ละกำหนดการ

demandCoverageViolations[]

object (DemandCoverageViolation)

การละเมิดความครอบคลุมของดีมานด์ซึ่งอิงตามemployee_countsที่กำหนดในemployeeSchedulesที่ระบุ employeeDemands ที่ระบุไว้ในคำขอจะเป็นผลรวม หากช่วงเวลา employee_demand 2 ช่วงทับซ้อนกัน ระบบจะรวมความต้องการในส่วนที่ทับซ้อนกันของช่วงเวลา

SolverConfig

ระบุพารามิเตอร์เพิ่มเติมเพื่อแก้โจทย์การสร้าง Shift

การแสดง JSON
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
ช่อง
timeLimit

string (Duration format)

ระยะเวลาสูงสุดที่เครื่องมือแก้โจทย์ควรใช้กับโจทย์ หากไม่ได้ตั้งค่า ค่าเริ่มต้นจะเป็น 1 นาที การเลือกการจำกัดเวลาควรขึ้นอยู่กับขนาดของปัญหา ตัวอย่างเช่น เมื่อแก้ปัญหาอินสแตนซ์ 7 วันด้วย ShiftTemplates 2 รายการ โดยแต่ละรายการมีเวลาเริ่มต้นที่เป็นไปได้ประมาณ 20 รายการและจัดกิจกรรม 2 รายการโดยมีเวลาเริ่มต้นที่เป็นไปได้ประมาณ 30 รายการ และมีวันหยุด 2 วันต่อสัปดาห์ ค่าที่แนะนําคือ <10 วินาทีสําหรับโซลูชันที่เร็ว (และน่าจะต่ำกว่าประสิทธิภาพ)) (10, 300 วินาที) สําหรับโซลูชันที่มีคุณภาพดี และ >300 วินาทีสำหรับการค้นหาแบบครอบคลุม อินสแตนซ์ขนาดใหญ่กว่าปกติอาจต้องใช้เวลานานขึ้น

ค่านี้ไม่ใช่ค่าจำกัดแบบเข้มงวด และไม่ได้พิจารณาค่าใช้จ่ายในการสื่อสาร เวลาในการตอบสนองที่คาดไว้ในการแก้ปัญหาอาจเกินค่านี้เล็กน้อย

ระยะเวลาเป็นวินาทีโดยมีเลขเศษส่วนไม่เกิน 9 หลัก ลงท้ายด้วย "s" ตัวอย่างเช่น "3.5s"

multiDaySchedule

boolean

หากเป็น "จริง" เครื่องมือแก้โจทย์จะสร้าง EmployeeSchedule ที่มีกะ (เช่น เพื่อสร้างกำหนดเวลา 1 สัปดาห์) มิเช่นนั้น EmployeeSchedule แต่ละรายการจะมี 1 Shift เท่านั้น กำหนดการแบบหลายวันจะถือว่าเวลาเริ่มต้นของกะเดียวกันในแต่ละวัน และจำนวนวันหยุดในกำหนดเวลาดังกล่าวจะกำหนดโดยเทมเพลตกะ ทั้งนี้ ระบบตั้งค่าเริ่มต้นไว้ที่ false

shiftEventsCanChange

boolean

หากเป็นจริง EmployeeScheduleแบบหลายวันอาจรวมกะที่เวลาเริ่มต้นและสิ้นสุดของกิจกรรมแตกต่างกันไปในแต่ละวัน มิฉะนั้น กะทั้งหมดของ EmployeeSchedule หนึ่งๆ จะต้องมีเวลาเริ่มต้นและเวลาสิ้นสุดของกิจกรรมเดียวกัน ไม่ว่ากรณีใด การเปลี่ยนแปลงทั้งหมดของกําหนดการแบบหลายวันจะมีเวลาเริ่มต้นและเวลาสิ้นสุดเท่ากัน ดังนั้นระบบจะไม่สนใจพารามิเตอร์นี้หาก multiDaySchedule เป็นเท็จ การตั้งค่าพารามิเตอร์นี้เป็น "จริง" อาจทำให้ใช้เวลาในการแก้ไขนานขึ้น ทั้งนี้ ระบบตั้งค่าเริ่มต้นไว้ที่ false

ShiftTemplate

เทมเพลตที่ระบุกฎสำหรับการสร้างกะการทำงาน กะคือหน่วยงานที่ระบุเวลาเริ่มต้น เวลาสิ้นสุด และอาจมีกิจกรรม (เช่น อาหารกลางวัน ช่วงพัก เป็นต้น) ในคำตอบจะมีการเปลี่ยนแปลงการทำงานในวันที่ที่เจาะจง

การแสดง JSON
{
  "id": string,
  "earliestStartTime": {
    object (TimeOfDay)
  },
  "latestStartTime": {
    object (TimeOfDay)
  },
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer,
  "daysOffCountPerWeek": integer,
  "eventTemplates": [
    {
      object (EventTemplate)
    }
  ],
  "minimumIntereventGapMinutes": integer,
  "maximumEmployeeCount": integer
}
ช่อง
id

string

รหัสที่ไม่ซ้ำกันของเทมเพลตนี้

earliestStartTime

object (TimeOfDay)

เวลาที่เร็วที่สุดในวันที่สามารถเริ่มต้นกะได้ ค่านี้ถูกระบุด้วยชั่วโมงและนาที ระบบจะไม่สนใจวินาทีและนาโน

latestStartTime

object (TimeOfDay)

เวลาล่าสุดในวันที่สามารถเริ่มต้นกะได้ ค่านี้ถูกระบุด้วยชั่วโมงและนาที ระบบจะไม่สนใจวินาทีและนาโน หากค่านี้น้อยกว่า earliestStartTime การเปลี่ยนแปลงที่สร้างโดยเทมเพลตนี้อาจเริ่มต้นก่อนหรือหลังเที่ยงคืน

durationMinutes

integer

ระยะเวลาคงที่ของการเปลี่ยนแปลงที่สร้างโดยเทมเพลตนี้

startTimeIncrementMinutes

integer

เวลาที่เพิ่ม (เป็นนาที) ที่ใช้ในการสร้างชุดเวลาเริ่มต้นที่เป็นไปได้ระหว่าง earliestStartTime ถึง latestStartTime ตัวอย่างเช่น ถ้าเวลาเริ่มต้นเร็วที่สุดคือ 8:00 น. เวลาเริ่มต้นช้าสุดคือ 8:30 น. และเวลาเริ่มต้นที่เพิ่มขึ้นคือ 10 นาที เวลาเริ่มต้นที่เป็นไปได้ทั้งหมดสำหรับเทมเพลตการเปลี่ยนแปลงนี้คือ 8:00, 8:10, 8:20 และ 8:30

daysOffCountPerWeek

integer

จำนวนวันที่แน่นอนต่อสัปดาห์ พนักงานจะมีวันหยุดให้หากไม่ได้รับมอบหมายให้เข้ากะที่เริ่มต้นในวันนั้น สัปดาห์คือ 7 วันและเริ่มต้นในวันอาทิตย์

eventTemplates[]

object (EventTemplate)

กฎสำหรับการสร้างเหตุการณ์สำหรับกะแต่ละรายการ จะมี 1 เหตุการณ์ที่แน่นอนในแต่ละกะของแต่ละเหตุการณ์ที่ระบุ

minimumIntereventGapMinutes

integer

จำนวนนาทีขั้นต่ำระหว่างการสิ้นสุดของเหตุการณ์หนึ่งและการเริ่มต้นเหตุการณ์ถัดไป

maximumEmployeeCount

integer

จำนวนพนักงานสูงสุดที่สามารถกำหนดให้กับกะทั้งหมดที่สร้างขึ้นโดยเทมเพลตนี้

TimeOfDay

แสดงช่วงเวลาของวัน วันที่และเขตเวลาไม่มีความสำคัญหรือมีการระบุไว้ที่อื่น API อาจเลือกอนุญาตการใช้เวลาไม่กี่วินาที ประเภทที่เกี่ยวข้องคือ google.type.Date และ google.protobuf.Timestamp

การแสดง JSON
{
  "hours": integer,
  "minutes": integer,
  "seconds": integer,
  "nanos": integer
}
ช่อง
hours

integer

ชั่วโมงของวันในรูปแบบ 24 ชั่วโมง ควรอยู่ในช่วง 0 ถึง 23 API อาจเลือกอนุญาตค่า "24:00:00" สำหรับสถานการณ์ต่างๆ เช่น เวลาปิดทำการ

minutes

integer

นาทีต่อชั่วโมง ต้องอยู่ระหว่าง 0 ถึง 59

seconds

integer

เวลาเป็นวินาที โดยปกติต้องอยู่ระหว่าง 0 ถึง 59 API อาจอนุญาตให้ใช้ค่า 60 หากอนุญาตให้มีวินาทีอธิกวาร

nanos

integer

เศษส่วนของวินาทีในหน่วยนาโนวินาที ต้องมีค่าตั้งแต่ 0 ถึง 999,999,999

EventTemplate

เทมเพลตที่ระบุกฎสำหรับการสร้างเหตุการณ์เดียวที่เกิดขึ้นระหว่างกะ กิจกรรมอาจเป็นการประชุม ช่วงพัก อาหารกลางวัน ฯลฯ

การแสดง JSON
{
  "id": string,
  "minimumMinutesAfterShiftStart": integer,
  "maximumMinutesAfterShiftStart": integer,
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer
}
ช่อง
id

string

รหัสที่ไม่ซ้ำกันของเทมเพลตนี้

minimumMinutesAfterShiftStart

integer

จำนวนนาทีขั้นต่ำหลังจากเริ่มกะที่กิจกรรมนี้สามารถเริ่มต้นได้

maximumMinutesAfterShiftStart

integer

จำนวนนาทีสูงสุดหลังจากเริ่มกะที่กิจกรรมนี้สามารถเริ่มต้นได้

durationMinutes

integer

ระยะเวลาคงที่เป็นนาทีสำหรับเหตุการณ์นี้

startTimeIncrementMinutes

integer

เวลาที่เพิ่มขึ้น (เป็นนาที) ที่ใช้ในการสร้างชุดเวลาเริ่มต้นของเหตุการณ์ที่เป็นไปได้ระหว่าง minimumMinutesAfterShiftStart ถึง maximumMinutesAfterShiftStart ตัวอย่างเช่น ถ้าจำนวนนาทีต่ำสุดหลังเริ่มต้นกะการทำงานคือ 30 นาทีสูงสุดหลังจากเริ่มกะการทำงานคือ 45 นาที ส่วนเวลาเริ่มต้นที่เพิ่มคือ 5 นาที เหตุการณ์อาจเกิดขึ้นหลังจากเริ่มกะ 30, 35, 40 หรือ 45 นาที

EmployeeDemand

ระบุจำนวนพนักงานที่ต้องการเพื่อรองรับความต้องการในช่วง DateTime ที่กำหนด

การแสดง JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "employeeCount": integer
}
ช่อง
startDateTime

object (DateTime)

จุดเริ่มต้นของช่วงเวลาสำหรับความต้องการที่ระบุ (รวม) ค่าเหล่านี้จะอ่านได้มากถึงนาที วินาที และหน่วยที่เล็กกว่าทั้งหมดจะถูกละเว้น

endDateTime

object (DateTime)

จุดสิ้นสุดของช่วงเวลาสำหรับความต้องการที่ระบุ (ไม่รวม) ค่าเหล่านี้จะอ่านได้มากถึงนาที วินาที และหน่วยที่เล็กกว่าทั้งหมดจะถูกละเว้น

employeeCount

integer

จำนวนพนักงานที่ต้องการเพื่อรองรับความต้องการในช่วงเวลานี้

ShiftGenerationSolutionStatus

สถานะโซลูชันที่ระบุในคำตอบของโปรแกรมแก้โจทย์

Enum
SHIFT_GENERATION_SOLUTION_STATUS_UNSPECIFIED สถานะที่ไม่ได้ระบุสำหรับคำตอบ
SHIFT_GENERATION_SOLVED โปรแกรมแก้โจทย์พบวิธีแก้โจทย์ภายในเวลาที่กำหนด
SHIFT_GENERATION_NOT_SOLVED ปัญหาป้องกันไม่ให้เครื่องมือแก้โจทย์สร้างการเปลี่ยนแปลงได้
SHIFT_GENERATION_NOT_SOLVED_DEADLINE_EXCEEDED ระบบไม่สามารถสร้างการเปลี่ยนแปลงเพื่อครอบคลุมความต้องการภายในระยะเวลาที่กำหนด

EmployeeSchedule

รายการกะการทำงานตามลำดับของ ShiftTemplate รายการเดียวที่มอบหมายให้พนักงานหลายคน

การแสดง JSON
{
  "shiftTemplateId": string,
  "shifts": [
    {
      object (ShiftWithEvents)
    }
  ],
  "employeeCount": integer
}
ช่อง
shiftTemplateId

string

รหัสของเทมเพลตที่ใช้ในการสร้างชุดกะนี้

shifts[]

object (ShiftWithEvents)

รายการกะงานที่มอบหมายให้กับพนักงาน employeeCount คน การเปลี่ยนแปลงและเหตุการณ์ที่เลือกสำหรับกำหนดการสร้างขึ้นจากเทมเพลตเดียว Shift จะจัดเรียงตามลำดับเวลาและไม่ทับซ้อนกัน หาก SolverConfig.multi_day_schedule เป็นจริง วันหยุดเทศกาลจะแสดงโดยนัยเมื่อไม่มีการเปลี่ยนแปลงที่เริ่มต้นในวันนั้น

employeeCount

integer

จำนวนพนักงานที่ควรกำหนดให้กะการทำงานชุดนี้ครอบคลุมความต้องการ

ShiftWithEvents

ระบุวันที่เริ่มต้นและวันที่สิ้นสุดพร้อมกับรายการเหตุการณ์คงที่ของกะการเปลี่ยนแปลงที่เครื่องมือแก้โจทย์สร้างขึ้น

การแสดง JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "events": [
    {
      object (Event)
    }
  ]
}
ช่อง
startDateTime

object (DateTime)

วันที่และเวลาเริ่มต้นของการเปลี่ยนแปลง ค่านี้ระบุถึงระดับนาที ไม่ได้ระบุหน่วยวินาทีและหน่วยที่เล็กกว่า

endDateTime

object (DateTime)

วันที่และเวลาสิ้นสุดของการเปลี่ยนแปลง ค่านี้ระบุถึงระดับนาที ไม่ได้ระบุหน่วยวินาทีและหน่วยที่เล็กกว่า

events[]

object (Event)

รายการเหตุการณ์ที่รวมอยู่ในการเปลี่ยนแปลงนี้ ซึ่งแมปกับส่วนที่ตรงกันทั้งหมด และอยู่ในลำดับเดียวกันกับ ShiftTemplate.Event หาก SolverConfig.shift_events_can_change เป็นจริง เวลาเริ่มต้นและสิ้นสุดของกิจกรรมอาจแตกต่างกันไปใน ShiftWithEvents ทั้งหมดของกำหนดการนี้

กิจกรรม

ระบุวันที่และเวลาเริ่มต้นและสิ้นสุดของเหตุการณ์ที่เฉพาะเจาะจงในกะที่เครื่องมือแก้โจทย์สร้างขึ้น

การแสดง JSON
{
  "eventTemplateId": string,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  }
}
ช่อง
eventTemplateId

string

รหัสของเทมเพลตที่ใช้สร้างเหตุการณ์นี้

startDateTime

object (DateTime)

วันที่และเวลาเริ่มต้นของกิจกรรม ค่านี้ระบุถึงระดับนาที ไม่ได้ระบุหน่วยวินาทีและหน่วยที่เล็กกว่า

endDateTime

object (DateTime)

วันที่และเวลาสิ้นสุดของเหตุการณ์ ค่านี้ระบุถึงระดับนาที ไม่ได้ระบุหน่วยวินาทีและหน่วยที่เล็กกว่า

DemandCoverageViolation

ระบุการละเมิดความครอบคลุมของดีมานด์สำหรับช่วงเวลาที่ระบุ ความต้องการของพนักงานจะเท่ากันตลอดช่วงเวลาที่ระบุ

การแสดง JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "coverageViolation": integer
}
ช่อง
startDateTime

object (DateTime)

วันที่และเวลาเริ่มต้นของช่วงความต้องการ (รวม) ค่านี้ถูกระบุจนถึงระดับนาที

endDateTime

object (DateTime)

วันที่และเวลาสิ้นสุดของช่วงดีมานด์ (ไม่รวม) ค่านี้ถูกระบุจนถึงระดับนาที

coverageViolation

integer

การละเมิดการครอบคลุมในช่วงระยะเวลาที่ระบุ ค่าบวกบ่งชี้ว่ามีดีมานด์ที่ครอบคลุมมากเกินไป และค่าลบบ่งบอกว่ามีดีมานด์ที่ครอบคลุม