Если вы предпочитаете не объектно-ориентированный подход, переместите plt.xticks (rotation = 70) вправо перед двумя вызовами avail_plot, например
plt.xticks(rotation=70)
avail_plot(axs[0], dates, s1, 'testing', 'green')
avail_plot(axs[1], dates, s1, 'testing2', 'red')
. задает свойство вращения перед настройкой меток. Поскольку у вас есть две оси, plt.xticks запутывается после того, как вы сделали два сюжета. В тот момент, когда plt.xticks ничего не делает, plt.gca () делает not , чтобы дать вам оси, которые вы хотите изменить, и поэтому plt.xticks, который действует на текущие оси, является не будет работать.
Для объектно-ориентированного подхода, не использующего plt.xticks, вы можете использовать
plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )
после два вызова avail_plot. Это задает вращение в соответствующих точках.
Из Википедии :
Хотя эти простые стратегии часто достаточно хороши, были продемонстрированы эффективные алгоритмы аппроксимации, которые могут решить проблему упаковки бина в пределах любой фиксированный процент оптимального решения для достаточно больших входов
Вот два источника, которые они дают для этого:
Я написал программу , которая тестирует три различных алгоритма. Также это хороший источник информации: Тысяча способов упаковать мусорное ведро - практический подход к упаковке двухмерного прямоугольного мусорного ведра . Он предназначен для двумерного прямоугольника, но вы всегда можете преобразовать его в 3D.
3dbinpacking - это коммерческое решение (, а не алгоритм ), открывающее API для потребителя с приятной визуализацией. Он предлагает:
Ваш вопрос похож на: Алгоритм трехмерной упаковки бинов
Хотя, поскольку вы запрещаете вращение, вы можете получить довольно хорошие результаты. Я предлагаю больше взглянуть на решение, которое поможет уменьшить вес.
Что касается готовых решений, обратите внимание на MAXLOADPRO для загрузки грузовиков. Его можно настроить для загрузки любого прямоугольного тома, но я еще не пробовал. В общем, проблемы с трехмерной упаковкой в бункеры имеют дополнительную сложность, заключающуюся в том, что объекты можно поворачивать в разные положения, поэтому для любого объекта с заданной длиной, шириной и высотой вам фактически нужно создать три переменные, представляющие каждую позицию, но вы используете только одну в решение.
В общем, автономные формулировки MIP (или ветвление и граница) не работают хорошо для двумерной или трехмерной проблемы, но программирование с ограничениями добилось определенного успеха, дав точные решения для двумерной проблемы. Посмотрите эту аннотацию . Не глядя на бумагу, мне нравится метод декомпозиции для проблемы, когда вы пытаетесь минимизировать количество бинов одинакового размера. Я не видел так много результатов для 3D-задачи, но дайте нам знать, если вы найдете какие-либо из них, которые можно реализовать.
Удачи!
Лучший точный решатель: используйте динамическое программирование .
Переменные состояния:
Если контейнер представляет собой сетку в виде параллелепипеда, а элементы «помещаются» в точные ячейки сетки, вы можете использовать трехмерный массив для представления переменной состояния 2. В противном случае вам придется использовать более сложные структуры данных.
Лучшие эвристические решатели
Не знаю. Возможно Поиск переменного окружения . Есть некоторое сходство между вашей проблемой и проблемой построения расписания (над которой я работаю), поэтому одна и та же эвристика может быть полезна для обоих.
Готовые решения для проведения экспериментов
Извините, я даже понятия не имею.