Моя музыкальная школа проводит фестиваль, на котором все студенческие группы играют вместе. Поскольку некоторые члены семьи участвуют в разных группах, я пытаюсь найти решение для оптимизации расписания групп - пытаясь минимизировать сумму времени между группами, у которых есть родственники. Теперь я думаю, что нашел решение. Не знаю, лучший ли он, но похоже, что он работает. Теперь я пытаюсь найти лучший способ представить решение. Эта матрица «x» огромна, и, возможно, было бы лучше извлечь только «1» и составить таблицу расписания со слотами и полосами в хронологическом порядке. Но я не знаю, с чего начать. Надеюсь, кто-нибудь укажет направление.
Соответствующая информация:
Я использую код ниже. Не стесняйтесь критиковать и вносить любые предложения. Спасибо!
from gekko import GEKKO
import numpy as np
m = GEKKO()
#variables and constrains
n = 20 #n of bands
s = 37 #n of slots to play
t = 25 #time in minutes one band spend on the stage
x = m.Array(m.Var,(n,s),value=0,lb=0,ub=1,integer=True) #matrix of all bands(rows) x slots (columns)
for j in range(s):
m.Equation(m.sum([x[i,j] for i in range(n)])<=1) #since this is the decision i made it binary and sum=1 to 1 band only ocuppie one slot
for i in range(n):
m.Equation(m.sum([x[i,j] for j in range(s)])==1) #since this is the decision i made it binary and sum=1 to 1 band only ocuppie one slot
z = [k for k in range(1,s+1)] #array with slot index to use to calc time
w = z*x*t #time the band will perform ;; used in objetive function
#objective
#in this exemple the band (1,4) and the band (1,5) have a relationship, and so do (3,2) and (1,15), so the objetive function bellow will try to minimize the sum of the time between bands that have relationship
y = m.abs2(w.item(1, 4)-w.item(1, 5))+ m.abs2(w.item(3, 2)-w.item(1, 15))
m.Minimize(y)
#solver
m.options.SOLVER = 1
m.solve()
#print(w.item((1, 4)))
print('y')
print(y)
print('x')
print(x)






Вам нужно извлечь номера полос и слотов для каждого 1 в матрице и отсортировать расписание по номеру слота:
schedule = [(i+1, j+1) for i in range(n) for j in range(s) if x[i,j][0] == 1]
schedule.sort(key=lambda x: x[1])
for band, slot in schedule:
print(f"Band {band} is scheduled to play in slot {slot}")
Идеальный! Просто дайте мне понять лучше (потому что я изучаю Python сам и теперь думаю, может быть, мне стоит поискать какой-нибудь курс или что-то в этом роде...), но в любом случае, что делает «key = лямбда» в этой функции ? И если я не злоупотребляю вашей доброй волей помочь, могу ли я как-нибудь связать один новый массив с названиями групп с этой окончательной визуализацией?
Lambda создает «анонимную» функцию. Используется, когда вам нужна небольшая функция на короткий период времени и вы не хотите определять ее с помощью «def». Обычно наблюдается при работе с функциями, которые сортируют или упорядочивают данные. Что касается второго вопроса, я бы рекомендовал написать еще один вопрос и @me.
Спасибо. Я сделал, как вы предложили, и создал новый вопрос. Понятия не имею, правильно ли я сделал (чтобы отметить вас в моем новом вопросе). stackoverflow.com/questions/78486029/…
Я бы тоже не возражал, если бы вы отметили мой ответ как правильный 😁.