Както трябва да е очевидно от първия ми пост, най-важната част от моя проект е изграждането на метаевристични алгоритми, които ще захранват планирането. Преди прилагането на конкретните метаевристични алгоритми обаче е полезно да се дефинират интерфейсите, които ще представляват метаевристичен алгоритъм и проблем за комбинаторна оптимизация.

Проблемът с дефинирането на проблем е по-прост и затова първо ще се справя с него. Както може би си спомняте от следващата публикация в блога, проблемът с комбинаторната оптимизация се дефинира като набор от променливи върху набор от домейни. За целите на библиотеката на менажерията ще наречем потенциално решение „Геном“. Нашият „Геном“ ще бъде по същество обвивка около масив от цели числа. (Наистина масив от longs.) Въпреки това, за да има „Геномът“ някакво значение, човек трябва да знае проблема, който го придружава. Тъй като проблемът определя набор от геноми, ние ще го наречем „GenomeSpec“. „GenomeSpec“ дефинира домейна на всяка променлива в „Геном“. Тези домейни се съхраняват в друг масив от цели числа. (Отново, наистина иска.) В допълнение към това ограничение на домейна, „GenomeSpec“ ще посочи функцията за оценяване, която взема „Геном“ и произвежда неотрицателен резултат за него. По конвенция целта на метаевристика е да минимизира средния резултат, който „GenomeSpec“ връща за своя резултат.

Дефиницията на метаевристика е по-сложна за изразяване. Това е най-вече защото има два фундаментално различни вида метаевристики. Един вид, обикновено наричан „Популационна метахевристика“, работи върху набор от решения („Геноми“), докато другият вид работи върху единичен „Геном“ наведнъж. Вторият вид обикновено се наричат ​​„Индивидуални метаевристики“. Тази разлика изглежда фундаментална, така че засега ще дефинираме два интерфейса. Първият взема набор от „геноми“ и краен срок и се опитва да върне по-добър набор до този краен срок. Другият взема единичен „Геном“ и краен срок и се опитва да върне по-добър „Геном“ до този краен срок.

Ако искате да видите самия код, можете да го разгледате в моето Github репозиторий!