Alat OR: Menambahkan dimensi berdasarkan akumulasi dimensi lain dengan python (khususnya biaya kendaraan untuk setiap 24 jam penggunaan)

Saya ingin menambahkan biaya konstan untuk setiap 24 jam kendaraan digunakan (menggunakan alat OR versi python). Saya tidak tahu bagaimana melakukan pendekatan ini.


person Tigris    schedule 15.07.2020    source sumber


Jawaban (1)


Saya menerima ide solusi dari James E. Marca (tautan: https://groups.google.com/g/or-tools-discuss/c/zEZ8PaMsV6g/m/W5KwdQN3AAAJ)

Anda tidak dapat menggunakan dimensi dependen dengan python, seperti yang Anda temukan.

Saya menyarankan untuk membuat dimensi biaya harian yang eksplisit. Node reguler menambahkan nol pada dimensi biaya, namun membuat node akhir hari tiruan, satu node per hari per kendaraan, yang menambah biaya harian Anda. Jadi tangani logika ini dalam fungsi panggilan balik (periksa jenis simpul, jika bukan simpul akhir hari, kembalikan nol, jika tidak, kembalikan biaya harian).

Kemudian tambahkan semua node akhir hari ke minimalisasi solver dengan menggunakan panggilan ke routing.AddVariableMinimizedByFinalizer(daily_cost_dimension.CumulVar(day_i_vehicle_j_index))

Mungkin itu mengarahkan Anda ke arah yang benar?

[Pesan selanjutnya]

Saya baru saja memikirkan poin 1. Saya rasa Anda tidak perlu menggunakan dimensi biaya tambahan, melainkan cukup menggabungkannya dengan apa pun yang sudah diminimalkan modelnya (jarak atau waktu).

Yang saya maksud adalah membuat node harian seperti yang saya jelaskan (satu per kendaraan per hari), izinkan node tersebut dihilangkan (disjungsi nol) tetapi wajibkan node tersebut dikunjungi jika dimensi waktu untuk kendaraan lebih besar dari kelipatan 24 jam . Kemudian buat jarak ke node harian sama dengan biaya tambahan per hari yang ingin dikeluarkan.

Jadi misalnya, dalam contoh standar, Anda mendapatkan ini:

    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