Задача о порядке перемножения матриц

Задача о порядке перемножения матриц — классическая задача динамического программирования, в которой дана последовательность матриц и требуется минимизировать количество скалярных операций для вычисления их произведения. Матрицы предполагаются совместимыми по отношению к матричному умножению (то есть количество столбцов совпадает с количеством строк матрицы).

Подробное описание задачи

Произведение матриц — ассоциативная операция, которая принимает на вход две матрицы размером k×m и m×n и возвращает матрицу размером k×n, потратив на это kmn операций умножения[1].

Когда матрицы велики по одному измерению и малы по другому, количество скалярных операций может серьёзно зависеть от порядка перемножений матриц. Допустим, нам даны 3 матрицы размерами соответственно 10×100, 100×5 и 5×50. Существует 2 способа их перемножения (расстановки скобок): и . В первом случае нам потребуется 10·100·5 + 10·5·50 = 7500 скалярных умножений, а во втором случае 100·5·50 + 10·100·50 = 75000 умножений — разница налицо. Поэтому может быть выгоднее потратить некоторое время на предобработку, решив, в каком порядке лучше всего умножать, чем умножать сразу в лоб.

Таким образом, даны n матриц: , , …, . Требуется определить, в каком порядке перемножать их, чтобы количество операций умножения было минимальным.

Решение задачи

Разберём 2 способа решения задачи, чтобы показать, насколько выгодно динамическое программирование в данном случае.

Перебор всех вариантов расстановки скобок

Оценим, сколько же нужно перебрать вариантов расстановки. Обозначим через количество способов расстановки скобок в последовательности, состоящей из n матриц. Когда матрица одна, то расставлять нечего, вариант один. Если , то количество вариантов, которым можно расставить скобки является произведением количества вариантов, которым можно расставить скобки в составляющих результирующую матрицу произведениях (т.е. если , то количество вариантов, которым мы можем получить матрицу равно произведению количества способов получить матрицу на количество способов получить ). Разбиение на матрицы, и может производиться на границе k-й и (k + 1)-й матриц для . Получаем рекуррентное соотношение:

Решением аналогичного рекуррентного соотношения является последовательность чисел Каталана, возрастающая как . Зависимость получается экспоненциальная, непригодная для практического применения в программах. Разберём более перспективный способ.

Динамическое программирование

Сведение задачи к подзадачам

Обозначим результат перемножения матриц через , где i<=j. Если i<j, то существует такое k, которое разбивает между матрицами и , i<=k<j. То есть для вычисления надо сначала вычислить , потом и затем их перемножить. Выбор k является аналогом расстановки скобок между матрицами. Выбрав некоторое k мы свели задачу к двум аналогичным подзадачам для матриц и .

Рекурсивное решение

Обозначим через m[i, j] минимальное количество скалярных умножений для вычисления матрицы . Получаем следующее рекуррентное соотношение:

Объясняется оно просто: для того, чтобы найти произведение матриц при i=j не нужно ничего делать — это и есть сама матрица . При нетривиальном случае мы перебираем все точки разбиения матрицы на матрицы и , ищем кол-во операций, необходимое чтобы их получить и затем перемножаем для получения матрицы .(Оно будет равно кол-ву операций, потраченное на решение подзадач + стоимость умножения матриц ). Считаем, что размеры матриц заданы в массиве и размер матрицы равен . Как обычно рекурсивный метод нельзя использовать напрямую — он будет экспоненциальным из-за большого кол-ва перекрывающихся подзадач.

Динамическое программирование

Будем запоминать в двумерном массиве m результаты вычислений для подзадач, чтобы избежать пересчета для уже вычислявшихся подзадач. После вычислений ответ будет в m[1,n](Сколько перемножений требуется для последовательности матриц от 1 до n — то есть ответ на поставленную задачу).Сложность алгоритма будет O, так как у нас вариантов выбора i, j : и точек разделения для каждого варианта. Детали станут понятны из реализации.

Реализация

Java

В методе main – пример из начала статьи. Если запустить, выведет 7500, как и ожидается.

public class MatrixChain {
     /*
	 * Возвращает ответ на задачу об оптимальном перемножении матриц, используя
     * динамическое программирование.
	 * Асимптотика решения - O(N^3) время и O(N^2) память.
	 * 
	 * @param p массив размеров матриц, см.статью 
	 * @return минимальное количество скалярных умножений, необходимое для решения задачи
	 */	
    public static int multiplyOrder(int[] p) {
		int n = p.length - 1;
		int[][] dp = new int[n][n];
		
		for (int i = 0; i < n; ++i) {
			dp[i][i] = 0;
		}
		
		for (int l = 1; l < n; ++l) {
			for (int i = 0; i < n - l; ++i) {
				int j = i + l;
				dp[i][j] = Integer.MAX_VALUE;
				for (int k = i; k < j; ++k) {
					dp[i][j] = Math.min(dp[i][j],
                                        dp[i][k] + dp[k + 1][j] + p[i] * p[k + 1] * p[j + 1]);
				}
			}
		}
		return dp[0][n - 1]; 
	}
	
	public static void main(String[] args) {
		int[] test = { 10, 100, 5, 50 };
		System.out.println(MatrixChain.multiplyOrder(test));
	}
}


C#

Приведены только методы, которые непосредственно выполняют необходимые расчеты

dataStore — объект класса, который хранит все данные

Его атрибуты:

public List<List<int>> m;		            //матрица m
public List<List<int>> s;				    //матрица s
public List<List<int>> result;			    //результат всех перемножений
public List<List<List<int>>> source;	    //массив из 2-мерных матриц (A0,A1,...,An) которые нужно перемножить
public List<int> sizes = new List<int>();	//размеры матриц (записаны таким образом - 12,10,7,4 => значит 3 матрицы размерами 12x10,10x7,7x4)
public string order = new string('a', 0);	//правильное расположение скобок

Функциональные участки кода:

//© Paulskit 27.03.2010
//метод который находит матрицу m и s (там же под них и выделяется память)
private void matrixChainOrder(){
	int n = dataStore.sizes.Count - 1;

	//выделяем память под матрицы m и s
	dataStore.m = new List<List<int>>();
	dataStore.s = new List<List<int>>();
	for (int i = 0; i < n; i++){
	    dataStore.m.Add(new List<int>());
	    dataStore.s.Add(new List<int>());
	    //заполняем нулевыми элементами
	    for (int a = 0; a < n; a++) {
	        dataStore.m[i].Add(0);
	        dataStore.s[i].Add(0);
	    }
	}
	//выполняем итерационный алгоритм
	int j;
	for (int l = 1; l < n; l++) {
	    for (int i = 0; i < n - l; i++) {
	        j = i + l;
	        dataStore.m[i][j] = int.MaxValue;
	        for (int k = i; k < j; k++) {
                int q = dataStore.m[i][k] + dataStore.m[k + 1][j] +
	                    dataStore.sizes[i] * dataStore.sizes[k + 1] * dataStore.sizes[j + 1];
	            if (q < dataStore.m[i][j]) {
	                dataStore.m[i][j] = q;
	                dataStore.s[i][j] = k;
	            }
	        }
	    }
    }
}
//метод - простое перемножение 2-х матриц
private List<List<int>> matrixMultiply(List<List<int>> A, List<List<int>> B) {
    int rowsA = A.Count;
    int columnsB = B[0].Count;
    //column count of A == rows count of B
    int columnsA = B.Count;

    //memory alloc for "c"
    List<List<int>> c = new List<List<int>>();
    for (int i = 0; i < rowsA; i++) {
        c.Add(new List<int>());
        for (int a = 0; a < columnsB; a++) {
            c[i].Add(0);
        }
    }

    //do multiplying
    for (int i = 0; i < rowsA; i++) {
        for (int j = 0; j < columnsB; j++) {
            for (int k = 0; k < columnsA; k++) { 
                c[i][j] += A[i][k] * B[k][j];
            }
        }
    }

    //return value
    return c;
}

//метод, который непосредственно выполняет перемножение в правильном порядке
//первоначально вызывается таким образом
//dataStore.result = matrixChainMultiply(0, dataStore.sizes.Count - 2); 
private List<List<int>> matrixChainMultiply(int i, int j) {
	if (j > i) {
        List<List<int>> x = matrixChainMultiply(i, dataStore.s[i][j]);
        List<List<int>> y = matrixChainMultiply(dataStore.s[i][j] + 1, j);
        return matrixMultiply(x, y);
    }
    else return dataStore.source[i];
}

//метод печатающий строку с правильной расстановкой скобок

private void printOrder(int i, int j){
    if (i == j) {
        order += "A" + i.ToString();
    } else {
        order += "(";
        printOrder(i, dataStore.s[i][j]);
        order += "*";
        printOrder(dataStore.s[i][j] + 1, j);
        order += ")";
    }
}

Примечания

К данной задаче сводится задача оптимизации свободной энергии молекулы РНК в биоинформатике (здесь пара скобок в строке мономеров РНК определяет их спаривание). Подобное динамическое программирование реализовано в алгоритмах Nussinov или Zucker.

  1. Существуют и более быстрые, чем kmn, алгоритмы умножения заполненных матриц, но они применяются крайне редко — прирост скорости наблюдается только на матрицах 100×100 и крупнее. Разреженные же матрицы умножают особыми алгоритмами, оптимизированными под ту или иную форму матрицы.

Литература

  • Томас Х. Кормен и др. Алгоритмы: построение и анализ = INTRODUCTION TO ALGORITHMS. — 2-е изд. — М.: «Вильямс», 2006. — С. 1296. — ISBN 0-07-013151-1.
  • Sanjoy Dasgupta , Christos H. Papadimitriou, Umesh Vazirani. Algorithms = Algorithms. — 1-е изд. — McGraw-Hill Science/Engineering/Math, 2006. — С. 336. — ISBN 0073523402.

Read other articles:

بيمور   الإحداثيات 52°27′18″N 0°12′04″E / 52.455°N 0.20111111111111°E / 52.455; 0.20111111111111  تقسيم إداري  البلد المملكة المتحدة[1]  رمز جيونيمز 12265903  تعديل مصدري - تعديل   بيمور (بالإنجليزية: Pymoor)‏ هي قرية تقع في المملكة المتحدة في كامبريدجشير.[2] انظر أيضاً قائمة...

 

Quản trị kinh doanh  • Công ty  • Doanh nghiệp  • Tập đoàn Nhân cách pháp lý · Nhóm công ty  · Tổng công ty  · Công ty cổ phần  · Công ty trách nhiệm hữu hạn  · Công ty hợp danh  · Doanh nghiệp nhà nước  · Doanh nghiệp tư nhân  · Hợp tác xã  · Hộ kinh doanh cá thể Quản trị c...

 

Stasiun Towata戸綿駅Stasiun Towata pada Agustus 2006LokasiMutsumi, Mori-machi, Shūchi-gun, Shizuoka-kenJepangKoordinat34°49′53.23″N 137°55′50.80″E / 34.8314528°N 137.9307778°E / 34.8314528; 137.9307778Koordinat: 34°49′53.23″N 137°55′50.80″E / 34.8314528°N 137.9307778°E / 34.8314528; 137.9307778PengelolaTenryū Hamanako RailroadJalur■ Jalur Tenryū HamanakoLetak dari pangkal12.0 kilometer dari KakegawaJumlah peron1 p...

هذه المقالة تحتاج للمزيد من الوصلات للمقالات الأخرى للمساعدة في ترابط مقالات الموسوعة. فضلًا ساعد في تحسين هذه المقالة بإضافة وصلات إلى المقالات المتعلقة بها الموجودة في النص الحالي. (سبتمبر 2017) جزء من سلسلة مقالات حولالقانون الجنائي عناصر القانون عنصر (القانون الجنائي) ف...

 

モザンビーク独立戦争ポルトガルの植民地戦争中ベイラ付近を移動中のポルトガル軍。時1964年9月25日 – 1974年9月8日(停戦)1975年6月25日(独立)場所ポルトガル領モザンビーク発端近隣植民地の独立、ポルトガルの植民地に対する苛烈な政策結果 停戦・カーネーション革命の結果としてモザンビーク人民共和国の独立。衝突した勢力 FRELIMO 援助国 ソビエト連邦 中華

 

BG Klinik in Tübingen Eine Berufsgenossenschaftliche Unfallklinik ist ein Spezialkrankenhaus für die medizinische Behandlung von Folgen aus Arbeitsunfällen. Träger sind die Träger der gesetzlichen Unfallversicherung, die Berufsgenossenschaften, die zu diesem Zwecke im Jahre 2016 den Konzern BG Kliniken – Klinikverbund der gesetzlichen Unfallversicherung gGmbH gegründet haben. Bereits im 19. Jahrhundert waren z. B. das Bergmannsheil in Bochum 1890 als erstes Unfallkrankenhaus der ...

Freie-Pyramide-Weltmeisterschaft 2011 Austragungsort Kiew, Ukraine Eröffnung 20. Oktober 2011 Endspiel 23. Oktober 2011 Disziplin Freie Pyramide Sieger Ukraine Jaroslaw Wynokur ← 2010 2012 → Die Freie-Pyramide-Weltmeisterschaft 2011 war die 13. Austragung der Weltmeisterschaft in der Freien Pyramide, einer Disziplin des Russischen Billards. Sie fand vom 20. bis 23. Oktober 2011 in Kiew statt. Die ukrainische Hauptstadt war nach 2007 zum zweiten Mal Austragungsort d...

 

Airport in Annette IslandAnnette Island AirportIATA: ANNICAO: PANTFAA LID: ANNWMO: 70398SummaryAirport typePrivateOwnerUnited States ArmyServesMetlakatla, AlaskaLocationAnnette IslandBuilt1941Elevation AMSL119 ft / 36 mCoordinates55°02′33″N 131°34′20″W / 55.04250°N 131.57222°W / 55.04250; -131.57222MapANNLocation of airport in AlaskaRunways Direction Length Surface ft m 12/30 7,493 2,284 Asphalt 2/20 5,709 1,740 Gravel Statistics (1990)Aircra...

 

16/17th-century English antiquarian scholar William Somner (1598–1669) was an English antiquarian scholar, the author of the first dictionary of the Anglo-Saxon language. William Somner, 1693 engraving by Michael Burghers. Life He was baptised in the church of St. Margaret, Canterbury, on 5 November 1598, but according to a statement of his widow and surviving relatives, the date of his birth was 30 March 1606. His father held the office of registrary of the court of Canterbury, under Sir N...

City in Utah, United States City in Utah, United StatesBlanding, UtahCityLDS Church South ChapelMotto: Basecamp to AdventureLocation in San Juan County and the state of Utah.Coordinates: 37°37′24″N 109°28′44″W / 37.62333°N 109.47889°W / 37.62333; -109.47889CountryUnited StatesStateUtahCountySan JuanFounded1905Founded byWalter C. LymanNamed forAmelia Blanding BicknellGovernment • MayorLogan MonsonArea[1] • Total13.22 ...

 

This article is an orphan, as no other articles link to it. Please introduce links to this page from related articles; try the Find link tool for suggestions. (April 2021) Japanese baseball player Baseball player Shinji OharaOhara with the Yokohama DeNA BayStarsYokohama DeNA BayStars – No. 79Pitcher / CoachBorn: (1985-06-30) June 30, 1985 (age 38)Hitachi, Ibaraki, JapanBats: LeftThrows: LeftdebutApril 30, 2011, for the Yokohama BayStars TeamsAs player Yokohama BayStars/Y...

 

Kampanye Bougainville (1943–45)Bagian dari Perang Pasifik dari Perang Dunia IIPrajurit Tentara Amerika memburu infiltrasi Jepang di Bougainville pada Maret 1944.Tanggal1 November 1943 – 21 Augustus 1945Lokasi6°8′S 155°18′E / 6.133°S 155.300°E / -6.133; 155.300Koordinat: 6°8′S 155°18′E / 6.133°S 155.300°E / -6.133; 155.300Bougainville, Wilayah New Guinea (geographically part of theSolomon Islands)Hasil Kemenangan SekutuPi...

Unix signal On POSIX-compliant platforms, SIGHUP (signal hang up) is a signal sent to a process when its controlling terminal is closed. It was originally designed to notify the process of a serial line drop. SIGHUP is a symbolic constant defined in the header file signal.h. History A hangup was often the result of a connected user physically hanging up the modem Access to computer systems for many years consisted of connecting a terminal to a mainframe system via a serial line and the RS-232...

 

Not to be confused with AI YoungBoy. 2019 mixtape by YoungBoy Never Broke AgainAI YoungBoy 2Mixtape by YoungBoy Never Broke AgainReleasedOctober 11, 2019 (2019-10-11)GenreHip hopLength55:04LabelNever Broke AgainAtlanticProducerSkynny17OnDaTrackAuraBeatmonster MarcBeezoBuddah BlessCashMoneyAPD-RocDmacDremusiqDJ SwiftDrum DummieDubba AAGibboGuwapsIndia Got Them BeatsJ-BoJetsonMadeKK McFlyLouie BandzMarcussMuzikMike LauryMike Will Made ItMoney MontageSidepceTahj MoneyTnTXD...

 

Indian singer Not to be confused with Shweta Pandit or Shweta Shetty, who are also Indian singers. Shweta MohanBorn (1985-11-19) 19 November 1985 (age 38)Chennai, Tamil Nadu, IndiaAlma materStella Maris College, ChennaiOccupationsSingermusic producerYears active2003–presentSpouse Aswin Sasi ​(m. 2011)​Children1[1]Parent(s)Krishna MohanSujatha Mohan (singer)Musical careerGenres Filmi Pop Ghazal Classical Bhajan Instrument(s)VocalsLabelsInd...

City in California, United States For the county, see Imperial County, California. City in California, United StatesImperial, CaliforniaCityCity of Imperial Top:Imperial City Hall ; Bottom: Worthington Square Imperial SealLocation of Imperial in Imperial County, California.Imperial, CaliforniaLocation in the United StatesCoordinates: 32°50′51″N 115°34′10″W / 32.84750°N 115.56944°W / 32.84750; -115.56944[1]CountryUnited StatesStateCaliforniaCoun...

 

New CastlecityNew Castle – Veduta LocalizzazioneStato Stati Uniti Stato federato Delaware ConteaNew Castle AmministrazioneSindacoJohn F. Klingmeyer TerritorioCoordinate39°39′53″N 75°33′55″W / 39.664722°N 75.565278°W39.664722; -75.565278 (New Castle)Coordinate: 39°39′53″N 75°33′55″W / 39.664722°N 75.565278°W39.664722; -75.565278 (New Castle) Altitudine3 m s.l.m. Superficie8,3 km² Abitanti4 862 (01-07-2...

 

Coat of Arms of Sancho of Noronha, 1st Count of Odemira. Count of Odemira (in Portuguese Conde de Odemira) was a Portuguese title of nobility granted to D. Sancho de Noronha by royal decree issued on 9 October 1446, by King Afonso V of Portugal. Sancho de Noronha was the third son of Alfonso, Count of Gijón and Noroña (natural son of King Henry II of Castile) and of his wife Isabel of Portugal (natural daughter of King Fernando I of Portugal). List of title-holders Sancho de Noronha (c.1390...

Templat:Pp-blp Andriy ParubiyАндрій Володимирович Парубій Sekretaris Dewan Pertahanan dan Keamanan Nasional Ukraina ke 10PetahanaMulai menjabat 27 February,2014PresidenOleksandr TurchynovWakilDmytro Yarosh PendahuluAndriy KlyuyevPenggantiPetahanaDeputi Rakyat UkrainaPetahanaMulai menjabat 23 November 2007[1] Informasi pribadiLahir31 Januari 1971 (umur 53)Chervonohrad, Ukraina, Uni SovietKebangsaanUkrainaPartai politikIndependenAfiliasi politiklai...

 

French painter (1770–1837) Francois GérardFrancois Gérard aged 54, by Sir Thomas LawrenceBornFrançois Pascal Simon Gérard(1770-03-12)12 March 1770[a]Rome, Papal StatesDied11 January 1837(1837-01-11) (aged 66)Paris, FranceNationalityFrenchEducationPajou, Brenet, DavidKnown forPortrait painting François Pascal Simon Gérard (French pronunciation: [fʁɑ̃swa paskal simɔ̃ ʒeʁaʁ], 4 May 1770 – 11 January 1837),[a] titled as Baron Gérard in 1809, wa...

 

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!