Стоимость решения, выводимая интерактивным решателем
зависимостей, является значением, используемым aptitude для определения
того, насколько «плохим» является некоторое
решение. «Более хорошие» решения отображаются перед
«более плохими» решениями. Стоимость решения определяется
параметром настройки Aptitude::ProblemResolver::SolutionCost
.
Некоторая типичная стоимость приведена в Пример 2.1, «Примеры стоимости решателя».
Пример 2.1. Примеры стоимости решателя
Стоимость по-умолчанию, сортировка по их стоимости безопасности, затем по их приоритету apt:
safety, priority
Удалить как можно меньше пакетов, затем отменить как можно меньше действий:
removals, canceled-actions
Отсортировать решения по числу удаляемых пакетов плюс двойное число отменяемых действий.
removals + 2 * canceled-actions
Как видно из приведённых выше примеров, стоимость не является с
необходимостью «единичным» числом. Фактически, стоимость
состоит из одного или более стоимостных компонентов,
каждый из которых является числом, ассоциированным с решением. Когда
решатель сортирует решения, он рассматривает стоимостные компоненты по
порядку, переходя к более поздним компонентам только в том случае, если
ранние компоненты равны. Например, в стоимости «removals,
canceled-actions
», решения с наименьшим числом удалений
всегда будут отображаться перед решениями с большим числом удалений
независимо от того, сколько в них отменяемых действий. Тем не менее, решения
с одинаковым числом удалений сортируются так, что решения с наименьшим
числом отменяемых действий отображаются первыми.
Стоимостные компоненты могут быть двух вариантов: базовые стоимостные компоненты и составные стоимостные компоненты.
Базовые компоненты просто именуют некоторое свойство решения, такое как
«обновления
» или
«удаления
». Список встроенных базовых
компонентов, предоставляемый aptitude может быть найден в Таблица 2.1, «Базовые стоимостные компоненты». Вы можете также создать свои
собственные стоимостные компоненты, используя подсказки
add-to-cost-component
и
raise-cost-component
; подробности см. в разделе «Настройка подсказок решателя».
Каждый базовый компонент является либо счётчиком, либо уровнем. Счётчики считают то, сколько действий решения удовлетворяют некоторому условию (такому как удаление пакетов или установка новых пакетов), в то время как уровни ассоциируют число со всяким действием и вычисляют наибольшее число, ассоциируемое со всяким действием в решении.
Таблица 2.1. Базовые стоимостные компоненты
Имя | Тип | Описание |
---|---|---|
broken-holds | Счётчик |
Считает число фиксаций, ломаемых решением, если решателю разрешено ломать
фиксации (Aptitude::ProblemResolver::Allow-Break-Holds ).
|
canceled-actions | Счётчик | Считает число ожидаемых действий, отменяемых решением (сохранение пакет в их текущих версиях). |
installs | Счётчик | Считает число пакетов, устанавливаемых решением. |
non-default-versions | Счётчик | Считает число версий, устанавливаемых или обновляемых из источников не по-умолчанию. |
priority | Уровень | Значение, которое возрастает при снижении у версии пакета приоритета apt. Точнее, оно вычисляется отрицанием приоритета (так, например, если приоритет равен 500, этот компонент будет равен -500). |
removals | Счётчик | Считает число пакетов, удаляемых решением. |
removals-of-manual | Счётчик | Считает число установленных вручную пакетов, удаляемых решением. |
safety | Уровень | Широкое эвристическое значение, которое возрастает в том случае, когда действия становятся наименее «безопасными»; подробности см. в разделе «Стоимости безопасности». |
upgrades | Счётчик | Считает число пакетов, обновляемых решением. |
Составные компоненты получаются путём комбинации значений базовых
компонентов. Например, removals + canceled-actions
складывает компоненты removal
и
canceled-actions
, в результате получается компонент,
который считает число удалений и отменяемых
действий. Сложные компоненты комбинируют счётчики, складывая их вместе, и
уровни, беря их максимальное значение, как это показано в Рисунок 2.11, «Синтаксис составных стоимостных компонент».
Примечание | |
---|---|
Складывать два уровня неправильно, а также брать максимум двух счётчиков или
каким-то образом комбинировать уровни и счётчики. Например, стоимость
|
Рисунок 2.11. Синтаксис составных стоимостных компонент
Сложить два или более значения стоимости:
[множитель1
]*стоимость1
+ [множитель2
]*стоимость2
+ ...
Принять максимальное значение двух или более базовых стоимости:
max([множитель1
]*стоимость1
, [множитель2
]*стоимость2
, ...)
Заметьте, что каждый отдельный базовый компонент может быть умножен на
коэффициент до его объединения с другими компонентами. Это может быть
использовано для управления компромиссами стоимости. Например, стоимость
2*removals + 3*upgrades
говорит о том, что три удаления в
точности так же «плохи» как два обновления. Решения, содержащие
четыре удаления и одно обновление, будут рассматриваться как эквивалентные
решениям, содержащим одно удаление и три обновления, поскольку стоимость
обоих типов решений равна одиннадцати.
Компонент стоимости безопасности
является эвристической
оценкой того, насколько «безопасно» или
«небезопасно» некоторое решение. Стоимости безопасности могут
рассматриваться как способ разделения решений на несколько нумерованных
«уровней», где «менее безопасным» уровням
назначаются более высокие числа. Рисунок 2.12, «Уровни стоимости безопасности»
демонстрирует, как это работает с настройками aptitude по-умолчанию.
Подсказка | |
---|---|
Уровни стоимости безопасности являются способом управления порядком, согласно которому выводятся решения зависимостей. Полное описание того, как изменять порядок сортировки решений aptitude, см. в разделе «Стоимость в интерактивном решателе зависимостей». |
По-умолчанию, aptitude инициализирует решатель с «приемлемым» набором уровней стоимости безопасности. Это следующие уровни:
Таблица 2.2. Уровни стоимости безопасности по-умолчанию
Уровень стоимости | Описание | Параметры настройки |
---|---|---|
10,000 | Решения, включающие лишь «безопасные» действия (установка для пакета цели по-умолчанию или сохранение текущей версии пакета) и удаления пакетов. | Aptitude::ProblemResolver::Safe-Level ,
Aptitude::ProblemResolver::Remove-Level |
10,000 |
Решение, отменяющее все действия пользователя. Оно обычно имеет больший вес,
чем Aptitude::ProblemResolver::Remove-Level ,
но удаление пакетов всегда имеет больший вес, чем сохранение тех же пакетов,
даже если этот пакет должен был быть обновлён.
| Aptitude::ProblemResolver::Keep-All-Level |
40,000 | Решения, которые ломают фиксации, установленные пользователем, или устанавливают запрещённые версии. | Aptitude::ProblemResolver::Break-Hold-Level |
50,000 |
Решения, которые устанавливают версии не по-умолчанию (такие, как например,
«экспериментальные »).
| Aptitude::ProblemResolver::Non-Default-Level |
60,000 | Действия, которые удаляют пакеты первой необходимости. | Aptitude::ProblemResolver::Remove-Essential-Level |
Если решение соответствует нескольким уровням стоимости безопасности, оно будет помещено на самый высокий уровень, то есть, тот, что появился последним. Например, решение, обновляющее один пакет до его версии по-умолчанию и ломающее фиксацию другого пакета, будет помещено на уровень 40,000. Вы можете настроить уровни индивидуальных версий, используя руководство по решателю; подробности см. в разделе «Настройка подсказок решателя». Уровни по-умолчанию иллюстрируются в Рисунок 2.12, «Уровни стоимости безопасности».
Помимо чисел для уровней стоимости можно использовать ключевые слова
«maximum
» и
«minimum
». Они обозначают, соответственно,
максимально и минимальное целочисленное значение, возможное на архитектуре
вашей системы.
[13] Был установлен этот предел, так как более комплексные стоимостные структуры могли бы затруднить оптимизацию решателя. В будущих версиях программы некоторые ограничения, если они окажутся излишними, могут быть удалены.