exponenta event banner

matchpairs

Решение задачи линейного назначения

Описание

пример

M = matchpairs(Cost,costUnmatched) решает задачу линейного назначения для строк и столбцов матрицы Cost. Каждая строка назначается столбцу таким образом, чтобы общая стоимость была сведена к минимуму. costUnmatched указывает стоимость за строку, не назначив каждой строке, а также стоимость за столбец, не имея строки, назначенной каждому столбцу.

[M,uR,uC] = matchpairs(Cost,costUnmatched) дополнительно возвращает индексы для несопоставленных строк в uR и индексы для несопоставленных столбцов в uC.

пример

[___] = matchpairs(Cost,costUnmatched,goal) задает цель оптимизации с использованием любой из комбинаций выходных аргументов в предыдущих синтаксисах. goal может быть 'min' или 'max' для получения совпадений, которые либо минимизируют, либо максимизируют общую стоимость.

Примеры

свернуть все

Назначьте продавцов рейсам таким образом, чтобы общая стоимость транспортировки была сведена к минимуму.

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

В этой таблице показаны затраты для каждого продавца на перелет в каждый ключевой город.

DallasChicagoNew Йоркский CitySt. Fred $600 $670 $960 $560Beth $900 $280 $970 $540Sue $310 $350 $950 $820Greg $325 $290 $600 $540

Каждый город представляет возможность продаж. Если город упущен, то компания теряет в среднем прибыль в размере 2000 долларов.

Создайте матрицу затрат для представления стоимости каждого продавца, летящего в каждый город.

C = [600 670 960 560
     900 280 970 540
     310 350 950 820
     325 290 600 540];

Использовать matchpairs назначить продавцов городам с минимальными затратами. Укажите стоимость отмены присвоения как 1000, поскольку стоимость отмены присвоения подсчитывается дважды, если строка и столбец остаются несопоставленными.

M = matchpairs(C,1000)
M = 4×2

     3     1
     2     2
     4     3
     1     4

matchpairs вычисляет наименее дорогостоящий способ получения продавца в каждом городе.

DallasChicagoNew Йоркский CitySt. Fred $600 $670 $960 $560Beth $900 $280 $970 $540Sue $310 $350 $950 $820Greg $325 $290 $600 $540

Сопоставьте строки со столбцами, если в матрице затрат имеется гораздо больше столбцов, чем строк.

Создайте матрицу затрат 3 на 8. Так как у вас только три строки, matchpairs может производить не более трех совпадений с восемью столбцами.

rng default % for reproducibility
C = randi([10 100], 3, 8)
C = 3×8

    84    93    35    97    97    22    82    13
    92    67    59    24    54    48    97    87
    21    18    97    98    82    93    69    94

Использовать matchpairs для соответствия строкам и столбцам матрицы затрат. Чтобы получить максимальное количество совпадений, используйте большую стоимость отмены присвоения (относительно величины записей в матрице затрат). Укажите три выхода для возврата индексов несопоставленных строк и столбцов.

[M,uR,uC] = matchpairs(C,1e4)
M = 3×2

     3     2
     2     4
     1     8

uR =

  0x1 empty double column vector
uC = 5×1

     1
     3
     5
     6
     7

Пять столбцов в C не соответствуют ни одной строке.

Назначьте такси маршрутам таким образом, чтобы прибыль была максимизирована.

У таксомоторной компании есть несколько запросов на поездку со всего города. Компания хочет отправить свое ограниченное количество такси таким образом, чтобы заработать больше всего денег.

В этой таблице приведены расчетные тарифы на проезд в такси по каждому из пяти запросов на проезд. Только три из пяти запросов на поездку могут быть заполнены.

Поездка 1Ride 2Ride 3Ride 4Ride 5Cab  такси такси за $5,80 B$6,40$ 3,30$ 4,70$ 3,20 за $5,70 A$6,30$ 3,10$ 4,80$ 3,50 $ 5,70 C$6,30$ 3,20$ 4,90$ 3,40

Создайте матрицу прибыли для представления прибыли каждой поездки на такси.

P = [5.7 6.3 3.1 4.8 3.5
     5.8 6.4 3.3 4.7 3.2
     5.7 6.3 3.2 4.9 3.4];

Использовать matchpairs сопоставить такси с самыми прибыльными аттракционами. Укажите три вывода для возврата всех несопоставленных строк и столбцов, а также 'max' возможность максимизировать прибыль. Укажите нулевую стоимость отмены присвоения, поскольку компания не получает денег от незаполненных такси или заявок на проезд.

costUnmatched = 0;
[M,uR,uC] = matchpairs(P,costUnmatched,'max')
M = 3×2

     1     1
     2     2
     3     4

uR =

  0x1 empty double column vector
uC = 2×1

     3
     5

matchpairs вычисляет наиболее выгодные для заполнения аттракционы. Раствор оставляет запросы на езду 3 и 5 незаполненными.

Поездка 1Ride 2Ride 3Ride 4Ride 5Cab  такси такси за $5,80 B$6,40$ 3,30$ 4,70$ 3,20 за $5,70 A$6,30$ 3,10$ 4,80$ 3,50 $ 5,70 C$6,30$ 3,20$ 4,90$ 3,40

Вычислите общую прибыль для рассчитанного решения. С тех пор costUnmatched равно нулю, нужно только сложить прибыль от каждого матча.

TotalProfits = sum(P(sub2ind(size(P), M(:,1), M(:,2))))
TotalProfits = 17

Использовать matchpairs для отслеживания перемещения нескольких точек путем минимизации общего изменения расстояния.

Постройте сетку точек в момент времени t = 0 зеленым цветом. В момент времени t = 1 некоторые точки перемещаются на небольшую величину в случайном направлении.

[x,y] = meshgrid(4:6:16);
x0 = x(:)';
y0 = y(:)';
plot(x0,y0,'g*')
hold on
rng default % for reproducibility
x1 = x0 + randn(size(x0));
y1 = y0 + randn(size(y0));
plot(x1,y1,'r*')

Figure contains an axes. The axes contains 2 objects of type line.

Использовать matchpairs для согласования точек в t = 0 с точками в t = 1. Для этого сначала вычислите матрицу затрат, гдеC(i,j) - евклидово расстояние от точки i указать j.

C = zeros(size(x).^2);
for k = 1:length(y1)
  C(k,:) = vecnorm([x1(k)-x0; y1(k)-y0],2,1)';
end
C
C = 9×9

    2.8211    3.2750    9.2462    6.1243    6.3461   10.7257   11.7922   11.9089   14.7169
    4.9987    2.2771    7.5752    6.2434    4.3794    8.4485   11.1792   10.2553   12.5447
   15.2037    9.3130    3.7833   17.1539   12.2408    8.7988   20.7211   16.8803   14.5783
    6.9004    8.6551   13.1987    1.1267    5.3446   11.3075    5.1888    7.3633   12.3901
    8.6703    6.3191    8.7571    5.9455    0.3249    6.0714    8.2173    5.6816    8.3089
   13.5530    8.1918    4.7464   12.7818    6.8409    1.4903   14.6652    9.9242    7.3426
   11.5682   13.1257   16.8150    5.5702    8.3359   13.4144    0.4796    6.2201   12.2127
   13.6699   12.3432   13.7784    8.6461    6.3438    8.8167    5.8858    0.3644    6.1337
   20.6072   17.2853   15.6495   16.5444   12.1590    9.6935   13.9562    8.3006    3.8761

Далее используйте matchpairs для соответствия строкам и столбцам в матрице затрат. Укажите стоимость отмены присвоения как 1. При такой низкой стоимости отмены присвоения по отношению к записям в матрице затрат, вероятно, matchpairs оставит некоторые моменты непревзойденными.

M = matchpairs(C,1)
M = 5×2

     4     4
     5     5
     6     6
     7     7
     8     8

Ценности M(:,2) соответствуют исходным точкам (x0, y0), в то время как значенияM(:,1) соответствуют перемещенным точкам (x1, y1).

Постройте график совпадающих пар точек. Точки, которые двигались дальше, чем 2*costUnmatched в стороне от исходной точки остаются несопоставимыми.

xc = [x0(M(:,2)); x1(M(:,1))];
yc = [y0(M(:,2)); y1(M(:,1))];
plot(xc,yc,'-o')

Figure contains an axes. The axes contains 7 objects of type line.

Входные аргументы

свернуть все

Матрица затрат. Каждая запись Cost(i,j) указывает стоимость назначения строки i к колонке j.

Типы данных: single | double

Стоимость несоответствия, указанная как скаляр. matchpairs сравнивает значение 2*costUnmatched к записям в Cost чтобы определить, является ли более выгодным, чтобы строка или столбец оставались несопоставимыми. Используйте этот параметр, чтобы сделать совпадения более или менее вероятными в алгоритме. Дополнительные сведения см. в разделе Проблема линейного назначения.

Пример: M = matchpairs(C,10) указывает стоимость 10 за несоответствие строки или столбца C.

Типы данных: single | double

Цель оптимизации, указанная как 'min' или 'max'. Цель оптимизации определяет, должны ли общие затраты быть минимизированы или максимизированы.

Пример: M = matchpairs(Cost,costUnmatched,'max') указывает, что строки и столбцы Cost должны сочетаться друг с другом для максимизации общих затрат.

Выходные аргументы

свернуть все

Совпадения, возвращенные в виде матрицы. M является pоколо-2 матрица, где M(i,1) и M(i,2) - индексы строки и столбца совпадающей пары в матрице затрат. Строки M сортируются со вторым столбцом в порядке возрастания.

  • Каждая строка и столбец могут быть сопоставлены только один раз, поэтому каждый M(i,1) значение и каждое M(i,2) значение уникально.

  • M содержит p совпадения, и p меньше или равно максимальному количеству совпадений min(size(Cost)).

  • Стоимость матчей в M является sum([Cost(M(1,1),M(1,2)), Cost(M(2,1),M(2,2)), ..., Cost(M(p,1),M(p,2))]).

Неназначенные строки, возвращаемые в виде вектора столбцов индексов. Записи в uR указать, какие строки в Cost не назначены. Каждая запись в uR и uC вносит вклад в общую стоимость решения в соответствии с costUnassigned.

Неназначенные столбцы, возвращаемые как вектор столбцов индексов. Записи в uC указать, какие столбцы в Cost не назначены. Каждая запись в uR и uC вносит вклад в общую стоимость решения в соответствии с costUnassigned.

Подробнее

свернуть все

Проблема линейного назначения

Проблема линейного назначения - это способ назначения строк столбцам таким образом, что каждая строка назначается столбцу и общая стоимость назначений минимизируется (или максимизируется). Стоимость назначения каждой строки каждому столбцу фиксируется в матрице затрат. Вход Cost(i,j) - стоимость присвоения строки i к колонке j.

Стоимость отмены присвоения присваивает стоимость любой строке или столбцу, которые не сопоставлены. Эта практика позволяет использовать решения с минимальными затратами, которые не назначают все строки или столбцы. Если строка и столбец не сопоставлены, это увеличивает общую стоимость на 2*costUnmatched.

Общая стоимость решения M - сумма стоимости всех сопоставленных пар, добавленная к стоимости всех несопоставленных пар:

TC=∑i=1pCost (M (i, 1), M (i, 2)) + стоимость несопоставленная (m + n − 2p)

В коде общая стоимость составляет

CostAssigned = sum(Cost(sub2ind(size(Cost), M(:,1), M(:,2))));
CostUnassigned = costUnmatched*(sum(size(Cost))-2*size(M,1));
TotalCost = CostAssigned + CostUnassigned;

  • Cost является mоколо-n матрица.

  • M является pоколо-2 матрица, где M(i,1) и M(i,2) - строка и столбец совпадающей пары.

  • (m+n-2*p) - общее число несопоставленных строк и столбцов.

Ссылки

[1] Дафф, И. С. и Дж. Костер. «О алгоритмах перестановки больших записей в диагональ разреженной матрицы». SIAM J. Matrix Anal. & Appl. 22 (4), 2001. pp 973-996.

Расширенные возможности

.

См. также

| |

Представлен в R2019a