Шаблон "посетитель" является способом сделать двойную отправку объектно-ориентированным способом.
для того, полезно, когда Вы хотите выбрать который метод использовать для данного аргумента на основе его типа в а не время компиляции во время выполнения.
Двойная отправка является особым случаем , несколько диспетчеризируют .
, Когда Вы называете виртуальный метод на объекте, это рассмотрело единственную отправку, потому что то, которым называют фактический метод, зависит от типа отдельного объекта.
Для двойной отправки, и тип объекта и метод тип единственного аргумента принят во внимание. Это похоже на разрешение перегрузки метода, за исключением того, что тип аргумента определяется во времени выполнения в двойной отправке вместо статически во время компиляции.
В нескольких-отправках, метод может иметь несколько аргументов, переданных ему и какая реализация используется, зависит от типа каждого аргумента. Порядок, что типы оценены, зависит от языка. В 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).
}
}
Это известная задача по информатике ( задача планирования экзаменов ), которая, как известно, является NP-сложной . Возможно, вам не удастся решить эту проблему за выходные.
Это пример проблемы удовлетворения ограничений , которая представляет собой сложный класс проблем. Некоторые из них относятся к классу NP. Существуют большие коммерческие программные пакеты для решения подобных проблем (например, CPLEX) - и, как правило, они используют некоторую математику и множество эвристик.
Я знаю, что это не по теме для SO, но мой университет просто планировал экзамены по блокам, которые соответствовали времени занятий. Итак, все, у кого был класс MWF в 13:20, были на экзамене 15-го числа в 13:00. Поскольку вы не можете посещать два класса одновременно, возникновение конфликтов на экзаменах невозможно.
Я использовал поиск табу во время моего мастера. Идея не слишком сложна:
, если вы заблокированы, вы можете «посетить» другие решения, внеся важные изменения в исходное решение. .
На самом деле проблема может быть немного более общей. Например, в моей школе экзамены назначаются по расписанию занятий - то есть для всех классов, которые обычно встречаются в одно и то же время в течение семестра, экзамен запланирован на определенный блок экзаменационной недели (не обязательно в то же время, что и однако обычное классное собрание). Таким образом, конфликтов обычно не существует, поскольку по очевидным причинам студенты не будут посещать два занятия в одно и то же время встречи и, следовательно, не будут сдавать два экзамена одновременно.
Однако это означает, что тогда вы все равно необходимо запланировать классы , чтобы они не конфликтовали. :)
Когда я учился в колледже, мы выполнили последний проект в нашем классе ИИ, похожий на этот. Мы написали (почти) работающую систему для планирования занятий в зданиях в определенное время. Некоторые правила нарушать нельзя: если проф. нужен был мультимедийный класс, он его получил. Если это был урок CS, то его нельзя было назначать в здании Art. У профессоров не должно быть более 2 часов между занятиями и т. Д.
Мы использовали генетический алгоритм.
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.
Это дорого, но я видел CPLEX , используемый для подобных проблем.