Проблема оптимизации расписания не знаю лучшего способа представить решение — Python/Gekko

Моя музыкальная школа проводит фестиваль, на котором все студенческие группы играют вместе. Поскольку некоторые члены семьи участвуют в разных группах, я пытаюсь найти решение для оптимизации расписания групп - пытаясь минимизировать сумму времени между группами, у которых есть родственники. Теперь я думаю, что нашел решение. Не знаю, лучший ли он, но похоже, что он работает. Теперь я пытаюсь найти лучший способ представить решение. Эта матрица «x» огромна, и, возможно, было бы лучше извлечь только «1» и составить таблицу расписания со слотами и полосами в хронологическом порядке. Но я не знаю, с чего начать. Надеюсь, кто-нибудь укажет направление.

Соответствующая информация:

  1. Английский не мой родной язык;
  2. Я не программист, и все, что я делал в приведенном ниже коде, — это то, что мне удалось узнать о Python за последние 2 дня.

Я использую код ниже. Не стесняйтесь критиковать и вносить любые предложения. Спасибо!

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)

Я бы тоже не возражал, если бы вы отметили мой ответ как правильный 😁.

Laszlo Hunyadi 15.05.2024 20:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
1
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно извлечь номера полос и слотов для каждого 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 = лямбда» в этой функции ? И если я не злоупотребляю вашей доброй волей помочь, могу ли я как-нибудь связать один новый массив с названиями групп с этой окончательной визуализацией?

Lucas Catharino 15.05.2024 19:07

Lambda создает «анонимную» функцию. Используется, когда вам нужна небольшая функция на короткий период времени и вы не хотите определять ее с помощью «def». Обычно наблюдается при работе с функциями, которые сортируют или упорядочивают данные. Что касается второго вопроса, я бы рекомендовал написать еще один вопрос и @me.

Laszlo Hunyadi 15.05.2024 20:32

Спасибо. Я сделал, как вы предложили, и создал новый вопрос. Понятия не имею, правильно ли я сделал (чтобы отметить вас в моем новом вопросе). stackoverflow.com/questions/78486029/…

Lucas Catharino 15.05.2024 21:06

Другие вопросы по теме