Как построить промежуточные решения or-tools с помощью сюжета - PullRequest
1 голос
/ 17 октября 2019

В последнее время я много боролся с заговором, казалось, что я приручил его, чтобы он соответствовал моим потребностям, пока эта проблема не возникла. Я решаю проблему Job Shop с помощью решателя or-tools и использую график для создания интерактивной диаграммы Ганта. Все сработало довольно хорошо, но есть еще одна вещь, которая сделает его идеальным. Я не хочу просто представить конечный результат этой математической задачи, но также и промежуточные этапы, означающие все решение, которое решатель находит, прежде чем он найдет оптимальное решение. Or-Tools предоставляет на своем веб-сайте код для решения принтера, который отвечал моим требованиям: он печатает промежуточные решения найдены. Единственная проблема, с которой я сталкиваюсь: я не могу построить промежуточные решения с помощью plotly.

Ниже вы можете увидеть код, предоставленный Or-Tools, я изменил его для своей проблемы, и он работает просто отлично. Он печатает промежуточные решения. Как только решатель нашел оптимальное решение, он продолжает свою графическую функцию и строит диаграмму Ганта. Я попытался поместить функцию plot в функцию on_soltuion_callback класса VarArraySolutionPrinter. Что происходит, он строит самое первое найденное решение и останавливает выполнение кода. Есть ли какой-нибудь способ, с помощью которого я могу построить все решения, которые мой решатель найдет на пути к оптимальности?

Это код из or-tools: Источник: https://developers.google.com/optimization/cp/cp_solver

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from ortools.sat.python import cp_model


class VarArraySolutionPrinter(cp_model.CpSolverSolutionCallback):
    """Print intermediate solutions."""

    def __init__(self, variables):
        cp_model.CpSolverSolutionCallback.__init__(self)
        self.__variables = variables
        self.__solution_count = 0

    def on_solution_callback(self):
        self.__solution_count += 1
        for v in self.__variables:
            print('%s=%i' % (v, self.Value(v)), end=' ')
        print()

    def solution_count(self):
        return self.__solution_count


def SearchForAllSolutionsSampleSat():
    """Showcases calling the solver to search for all solutions."""
    # Creates the model.
    model = cp_model.CpModel()

    # Creates the variables.
    num_vals = 3
    x = model.NewIntVar(0, num_vals - 1, 'x')
    y = model.NewIntVar(0, num_vals - 1, 'y')
    z = model.NewIntVar(0, num_vals - 1, 'z')

    # Create the constraints.
    model.Add(x != y)

    # Create a solver and solve.
    solver = cp_model.CpSolver()
    solution_printer = VarArraySolutionPrinter([x, y, z])
    status = solver.SearchForAllSolutions(model, solution_printer)

    print('Status = %s' % solver.StatusName(status))
    print('Number of solutions found: %i' %solution_printer.solution_count())


SearchForAllSolutionsSampleSat()

1 Ответ

0 голосов
/ 31 октября 2019

Я наконец понял это. Я просто глубоко скопировал свой объект и нарисовал версию своего объекта с глубокой копией.

...