OR-tools: การเพิ่มมิติตามการสะสมของมิติอื่นใน python (โดยเฉพาะต้นทุนยานพาหนะสำหรับทุก ๆ 24 ชั่วโมงที่ใช้)

ฉันต้องการเพิ่มต้นทุนคงที่สำหรับแต่ละ 24 ชั่วโมงที่มีการใช้งานยานพาหนะ (โดยใช้ OR-tools เวอร์ชัน Python) ฉันไม่รู้ว่าจะเข้าใกล้สิ่งนี้อย่างไร


person Tigris    schedule 15.07.2020    source แหล่งที่มา


คำตอบ (1)


ฉันได้รับแนวคิดเกี่ยวกับวิธีแก้ปัญหานี้จาก James E. Marca (ลิงก์: https://groups.google.com/g/or-tools-discuss/c/zEZ8PaMsV6g/m/W5KwdQN3AAAJ)

คุณไม่สามารถใช้มิติข้อมูลที่ต้องพึ่งพาในหลามตามที่คุณค้นพบ

ฉันขอแนะนำให้สร้างมิติต้นทุนรายวันที่ชัดเจน โหนดปกติจะเพิ่มศูนย์ในมิติต้นทุน แต่สร้างโหนดจำลอง ณ สิ้นวัน หนึ่งโหนดต่อวันต่อยานพาหนะ ซึ่งจะเพิ่มต้นทุนรายวันของคุณ ดังนั้น จัดการตรรกะนี้ในฟังก์ชันการโทรกลับ (ตรวจสอบประเภทโหนด หากไม่ใช่โหนดสิ้นสุดของวัน ให้คืนค่าศูนย์ หรือส่งคืนต้นทุนรายวัน)

จากนั้นเพิ่มโหนดจุดสิ้นสุดของวันทั้งหมดไปยังการลดขนาดของตัวแก้ปัญหาโดยใช้การเรียกไปยังการกำหนดเส้นทางAddVariableMinimizedByFinalizer(daily_cost_size.CumulVar(day_i_vehicle_j_index))

บางทีนั่นอาจนำคุณไปในทิศทางที่ถูกต้อง?

[ข้อความต่อมา]

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

สิ่งที่ฉันหมายถึงคือสร้างโหนดรายวันตามที่ฉันอธิบาย (หนึ่งรายการต่อคันต่อวัน) ปล่อยให้พวกมันถูกทิ้ง (การแยกจากศูนย์) แต่ต้องการให้พวกมันเข้าเยี่ยมชมหากมิติเวลาสำหรับยานพาหนะมากกว่าผลคูณของ 24 ชั่วโมง . จากนั้นทำให้ระยะทางไปยังโหนดรายวันเท่ากับค่าใช้จ่ายเพิ่มเติมต่อวันที่คุณต้องการรับ

ตัวอย่างเช่น ในตัวอย่างมาตรฐาน คุณมีสิ่งนี้:

    def create_data_model():
"""Stores the data for the problem."""
data = {}
data['distance_matrix'] = [
...
# set distance from all nodes to dummy end-of-day nodes as daily cost
]

...

# Instantiate the data problem.
data = create_data_model()

def distance_callback(from_index, to_index):
"""Returns the distance between the two nodes."""
# Convert from routing variable Index to distance matrix NodeIndex.
from_node = manager.IndexToNode(from_index)
to_node = manager.IndexToNode(to_index)
#
# this next line will correctly add "cost" of visiting end-of-day nodes
# if the data was set up correctly earlier
#
return data['distance_matrix'][from_node][to_node]

transit_callback_index = routing.RegisterTransitCallback(distance_callback)
routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index) 
person Tigris    schedule 07.10.2020