Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Шаг З: вычисление оптимальной стоимости

Читайте также:
  1. Quot;Как определить норму и массу прибавочной стоимости.
  2. Автоматизированное проектирование здания СТОА с оптимизацией решений по критерию стоимости
  3. Алгоритм проведения и информационная база анализа себестоимости
  4. Анализ активов (структуры и стоимости имущества)
  5. Анализ взаимосвязи прибыли, себестоимости и объема продаж. Анализ безубыточности продаж.
  6. Анализ себестоимости продукции
  7. Анализ себестоимости, прибыли и рентабельности продукции

Пользуясь соотношениями (2), теперь легко написать рекурсивный алгоритм, определяющий минимальную стоимость вычисления произведения A1A2...An (т.е. число m[1,n]). Однако время работы такого алгоритма экспоненциально зависит от n, так что этот алгоритм не лучше полного перебора. Настоящий выигрыш во времени мы получим, если воспользуемся тем, что подзадач относительно немного: по одной задаче для каждой пары (i,j), для которой 1 ≤i≤ j≤n, а, а всего Сn2 + п = 0(n2). Экспоненциальное время работы возникает потому, что рекурсивный алгоритм решает каждую из подзадач по многу раз, на разных ветвях дерева рекурсии. Такое “перекрытие подзадач” характерный признак задач, решаемых методом динамического программирования.

Вместо рекурсии мы вычислим оптимальную стоимость “снизу вверх”. В нижеследующей программе предполагается, что матрица Аi имеет размер pi-1* pi-1 при i = 1,2,..., п. На вход подаётся последовательность p= (p0,p1,...,pn), length = п + 1. Программа использует вспомогательные таблицы m[1..n,1..n] (для хранения стоимостей m[i,j]) и s[1..n, 1..n] (в ней отмечается, при каком достигается оптимальная стоимость при вычислении m[i,j]).

float pp[z];

double Matrix_Chain_Order(float pp[z]);

{n=z-1;

for (i=1;i<=n;i++) {m[i][i]=0}

for (l=2;l<=n;l++)

{ for (i=1;i<=n-l+1;i++)

{j=i+l-1;

m[i][j]=1/0

for (k=i;i<=j-1;k++)

{q=m[i][k]+m[k+1][j]+p[i-1]*pp[k]*pp[j];

if (q<m[i][j]) {m[i][j]=q;

s[i][j]=k}}};

return m,s;}

Заполняя таблицу m, этот алгоритм последовательно решает задачи об оптимальной расстановке скобок для одного, двух,..., п сомножителей. В самом деле, соотношение (2) показывает, что число m[i,j] —стоимость перемножения j-i + 1 матриц — зависит только от стоимостей перемножения меньшего (чем j-i+1) числа матриц. Именно, для k=i,i+1,...,j-1 получается, что Ai..k —произведение k - i +1 < j-i+1 матриц, а Ak+1...j -произведение j- k < j- i + 1 матриц.

Сначала (в строках 2-3) алгоритм выполняет присваивания т[i,j]= 0 для i=1,2,...,n: стоимость перемножения последовательности из одной матрицы равна нулю. При первом исполнении цикла (строки 4-12) вычисляются (с помощью соотношений (2)) значения m[i,i +1] для i=1, 2,...,п -1 —это минимальные стоимости для последовательностей длины 2. При втором проходе вычисляются m[i, i+2] для i = 1,2,...,п -2- минимальные стоимости перемножения последовательностей длины 3, и так далее. На каждом шаге значение m[i,j], вычисляемое в строках 9-12, зависит только от вычисленных ранее значений т[i, k] и m[k + 1,j].

На рис. 1 показано, как это происходит при п = 6. Поскольку мы определяем m[i,j] только для i≤ j, используется часть таблицы, лежащая над главной диагональю. На рисунке таблицы повёрнуты (главная диагональ горизонтальна).

Внизу выписана последовательность матриц. Число m[i,j] --минимальная стоимость перемножения A i ...Aj находится на пересечении диагоналей, идущих вправо- вверх от матрицы Ai; и влево- вверх от матрицы Aj. В каждом горизонтальном ряду собраны стоимости перемножения подпоследовательностей фиксированной длины. Для заполнения клетки m[i,j] нужно знать произведения pi-1pkpj. Для k = i,i+1,...,j - 1 и содержимое клеток, лежащих слева- внизу и справа- внизу от m[i,j].

Простая оценка показывает, что время работы алгоритма matrix-chain-order есть 0(n3). В самом деле, число вложенных циклов равно трём, и каждый из индексов l, i и k принимает не более n значений. Oбъем памяти, необходимый для хранения таблиц m и s, есть 0(n2). Тем самым этот алгоритм значительно эффективнее, чем требующий экспоненциального времени перебор всех расстановок.

Рис. 1. Таблицы m и s, вычисляемые процедурой matirix-chain-order для n=6 матриц следующего размера:

 

Таблицы повёрнуты так, что главная диагональ горизонтальна. В таблице m используются только клетки, лежащие не ниже главной диагонали, в таблице s — только клетки, лежащие строго выше. Минимальное количество умножений, необходимое для перемножения всех матриц, равно m[1,6] = 15 125. Пары клеточек, заштрихованных одинаковой светлой штриховкой, совместно входят в правую часть формулы в процессе вычисления m[2,5]:


Дата добавления: 2015-12-08; просмотров: 88 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.008 сек.)