Алгоритм планирования / проблема

Шаблон "посетитель" является способом сделать двойную отправку объектно-ориентированным способом.

для того, полезно, когда Вы хотите выбрать который метод использовать для данного аргумента на основе его типа в а не время компиляции во время выполнения.

Двойная отправка является особым случаем , несколько диспетчеризируют .

, Когда Вы называете виртуальный метод на объекте, это рассмотрело единственную отправку, потому что то, которым называют фактический метод, зависит от типа отдельного объекта.

Для двойной отправки, и тип объекта и метод тип единственного аргумента принят во внимание. Это похоже на разрешение перегрузки метода, за исключением того, что тип аргумента определяется во времени выполнения в двойной отправке вместо статически во время компиляции.

В нескольких-отправках, метод может иметь несколько аргументов, переданных ему и какая реализация используется, зависит от типа каждого аргумента. Порядок, что типы оценены, зависит от языка. В LISP это проверяет каждый тип от начала до конца.

Языки с несколькими диспетчеризируют, используют родовые функции, которые являются просто функциональными объявлениями и не похожи на общие методы, которые используют параметры типа.

, Чтобы сделать двойную отправку в C#, можно объявить метод с единственным объектным аргументом и затем определенные методы с определенными типами:

using System.Linq;  

class DoubleDispatch
{ 
    public T Foo<T>(object arg)
    { 
        var method = from m in GetType().GetMethods()
                   where    m.Name == "Foo" 
                         && m.GetParameters().Length==1
                         && arg.GetType().IsAssignableFrom
                                           (m.GetParameters()[0].GetType())
                         && m.ReturnType == typeof(T)
                   select m;

        return (T) method.Single().Invoke(this,new object[]{arg});          
    }

    public int Foo(int arg) { /* ... */ }

    static void Test() 
    { 
        object x = 5;
        Foo<int>(x); //should call Foo(int) via Foo<T>(object).
    }
}       
6
задан dassouki 20 October 2009 в 22:04
поделиться

8 ответов

Это известная задача по информатике ( задача планирования экзаменов ), которая, как известно, является NP-сложной . Возможно, вам не удастся решить эту проблему за выходные.

17
ответ дан 8 December 2019 в 02:30
поделиться

Это пример проблемы удовлетворения ограничений , которая представляет собой сложный класс проблем. Некоторые из них относятся к классу NP. Существуют большие коммерческие программные пакеты для решения подобных проблем (например, CPLEX) - и, как правило, они используют некоторую математику и множество эвристик.

5
ответ дан 8 December 2019 в 02:30
поделиться

Я знаю, что это не по теме для SO, но мой университет просто планировал экзамены по блокам, которые соответствовали времени занятий. Итак, все, у кого был класс MWF в 13:20, были на экзамене 15-го числа в 13:00. Поскольку вы не можете посещать два класса одновременно, возникновение конфликтов на экзаменах невозможно.

7
ответ дан 8 December 2019 в 02:30
поделиться

Я использовал поиск табу во время моего мастера. Идея не слишком сложна:

  1. начните с одного возможного решения (любого) и проанализируйте его (например, дайте -1000 баллов, если один студент сдает два экзамена одновременно)
  2. измените это решение, просто изменив несколько присваивания и пересчитать взвешивание
  3. , если 2. лучше, чем 1. и повторить, начиная с 2. в качестве основного решения

, если вы заблокированы, вы можете «посетить» другие решения, внеся важные изменения в исходное решение. .

1
ответ дан 8 December 2019 в 02:30
поделиться

На самом деле проблема может быть немного более общей. Например, в моей школе экзамены назначаются по расписанию занятий - то есть для всех классов, которые обычно встречаются в одно и то же время в течение семестра, экзамен запланирован на определенный блок экзаменационной недели (не обязательно в то же время, что и однако обычное классное собрание). Таким образом, конфликтов обычно не существует, поскольку по очевидным причинам студенты не будут посещать два занятия в одно и то же время встречи и, следовательно, не будут сдавать два экзамена одновременно.

Однако это означает, что тогда вы все равно необходимо запланировать классы , чтобы они не конфликтовали. :)

1
ответ дан 8 December 2019 в 02:30
поделиться

Когда я учился в колледже, мы выполнили последний проект в нашем классе ИИ, похожий на этот. Мы написали (почти) работающую систему для планирования занятий в зданиях в определенное время. Некоторые правила нарушать нельзя: если проф. нужен был мультимедийный класс, он его получил. Если это был урок CS, то его нельзя было назначать в здании Art. У профессоров не должно быть более 2 часов между занятиями и т. Д.

Мы использовали генетический алгоритм.

1
ответ дан 8 December 2019 в 02:30
поделиться

A few things to make the problem simpler. You can probably shrink the number of "units to schedule" down from tens of thousands to a few hundred, by looking at people who are sitting the same set of exams. If you have 300 people who all are sitting "Introduction to Computer Science" and "Maths for CS students", you can schedule all 300 as a single unit, because they will all have the same constraints and you (probably) do not want identical exams to be given in multiple slots.

1
ответ дан 8 December 2019 в 02:30
поделиться

Это дорого, но я видел CPLEX , используемый для подобных проблем.

1
ответ дан 8 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: