Сомик писал(а):
Имеется следующая задача
![$|\sum\limits_{i=1}^{n}a_{1,i}x_i|+ \dots + |\sum\limits_{i=1}^{n}a_{k,i}x_i|\rightarrow max$ $|\sum\limits_{i=1}^{n}a_{1,i}x_i|+ \dots + |\sum\limits_{i=1}^{n}a_{k,i}x_i|\rightarrow max$](https://dxdy-01.korotkov.co.uk/f/0/7/3/073adfde9806593055e0c03ba99fe77c82.png)
при
![$0 \leq x_i \leq 1$ $0 \leq x_i \leq 1$](https://dxdy-04.korotkov.co.uk/f/7/5/6/756e36c1e46daa901fc447a0a358d08e82.png)
Где бы можно было посмотреть алгоритмы ее решения?
Ясно, что можно раскрыть все модули, и тогда каждый раз будем получать задачу линейного программирования, но это дает экспоненциальный по
![$k$ $k$](https://dxdy-03.korotkov.co.uk/f/6/3/b/63bb9849783d01d91403bc9a5fea12a282.png)
перебор.
Можно делать тоже, что и в симплекс-методе: искать решения, с все более возрастающим значением целевой функции. Но даже в задачах ЛП максимальное число итераций оценивается сверху как
![$C^m_n$ $C^m_n$](https://dxdy-01.korotkov.co.uk/f/0/7/2/072935b1103ed7e91bbb08129ee121b982.png)
- что растет экспоненциально от числа равенств
![$m$ $m$](https://dxdy-01.korotkov.co.uk/f/0/e/5/0e51a2dede42189d77627c4d742822c382.png)
. Есть правда полиномиальные алгоритмы решения ЗЛП, но они сложны.
При фиксированном значении всех переменных, кроме одной
![$x_i$ $x_i$](https://dxdy-02.korotkov.co.uk/f/9/f/c/9fc20fb1d3825674c6a279cb0d5ca63682.png)
, целевая функция принимает вид
![$z=\sum\limits_{j=1}^{k}|b_{j,i}+a_{j,i}x_i|$ $z=\sum\limits_{j=1}^{k}|b_{j,i}+a_{j,i}x_i|$](https://dxdy-02.korotkov.co.uk/f/9/8/7/987da7a254a4a9a29e1ab9818f185b8482.png)
, где
Значит, график целевой функции от одной из переменных
![$x_i$ $x_i$](https://dxdy-02.korotkov.co.uk/f/9/f/c/9fc20fb1d3825674c6a279cb0d5ca63682.png)
представляет собой ломаную линию и достигает максимума, либо в крайней точке
![$x_i=0;1$ $x_i=0;1$](https://dxdy-01.korotkov.co.uk/f/0/e/0/0e0588ec41d323b580d340039139715a82.png)
, либо в одной из точек точке излома
![$x_i=-\frac{b_{j,i}}{a_{j,i}}$ $x_i=-\frac{b_{j,i}}{a_{j,i}}$](https://dxdy-03.korotkov.co.uk/f/2/1/c/21ccda8343cb2bee0f53730b292cc19282.png)
(
![$a_{j,i}\not=0$ $a_{j,i}\not=0$](https://dxdy-04.korotkov.co.uk/f/f/5/1/f5126a212660c7b7a1d1c09c949a607c82.png)
), то есть в некой точке
![$x_i^*$ $x_i^*$](https://dxdy-02.korotkov.co.uk/f/5/8/a/58a80953cbcb537fe917e27c9d79eda182.png)
. Сменяем значение (на
![$x_i^*$ $x_i^*$](https://dxdy-02.korotkov.co.uk/f/5/8/a/58a80953cbcb537fe917e27c9d79eda182.png)
) той переменной
![$x_i$ $x_i$](https://dxdy-02.korotkov.co.uk/f/9/f/c/9fc20fb1d3825674c6a279cb0d5ca63682.png)
, которая дает наибольшее увеличение целевой функции
![$\Delta z_i^*$ $\Delta z_i^*$](https://dxdy-01.korotkov.co.uk/f/4/d/4/4d45af55d47b1690b6a5ab4219b168c182.png)
, при условии, что оно больше нуля. И так повторяем итерации, пока это наибольшее увеличение целевой функции не станет равным нулю
![$\Delta z_i^*=0$ $\Delta z_i^*=0$](https://dxdy-03.korotkov.co.uk/f/a/4/5/a4504ffa8381b534f04c3bcc3ceda10c82.png)
. Значит, мы достигли локального максимума. Если между любыми двумя допустимыми точками
![$\vec x$ $\vec x$](https://dxdy-04.korotkov.co.uk/f/b/1/9/b19f8b934bff70ec5db8b828f645932b82.png)
и
![$\vec x'$ $\vec x'$](https://dxdy-02.korotkov.co.uk/f/1/b/f/1bfbf4da4e2d1ced0961d67013f0b63a82.png)
существует ограниченный условиями
![$0\leq x_i \leq 1$ $0\leq x_i \leq 1$](https://dxdy-01.korotkov.co.uk/f/4/5/1/4515080903520d51fab073870190747d82.png)
ломаный путь с отрезками параллельными осям
![$Ox_i$ $Ox_i$](https://dxdy-03.korotkov.co.uk/f/a/2/e/a2e752dbc67ac39219a991635e5349a182.png)
и монотонный по значениям целевой функции (это некий аналог условия выпуклости задачи), то локальный максимум является и глобальным.
Увы, не могу сформулировать для этой задачи понятие крайней точки по аналогии с ЗЛП, тогда можно было бы сформулировать условие выпуклости с произвольно направленными отрезками, и, вероятно, доказать выпуклость задачи для общего случая.
Вот процедура, написанная в
Мапле 8, от аргументов:
число переменных
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
, число модулей в целевой функции
![$k$ $k$](https://dxdy-03.korotkov.co.uk/f/6/3/b/63bb9849783d01d91403bc9a5fea12a282.png)
, матрица коэффициентов A=[seq([seq(A[j,i],i=1..n)],j=1..k)];
и дающая: число итераций
![$r$ $r$](https://dxdy-01.korotkov.co.uk/f/8/9/f/89f2e0d2d24bcf44db73aab8fc03252c82.png)
от начальных значений переменных
![$x_i=0$ $x_i=0$](https://dxdy-01.korotkov.co.uk/f/4/5/1/451393db7833b5c4c8630f7ce7320fd482.png)
до локально-максимального решения, решение
![$\vec x=(x_i|_{i=1}^n)$ $\vec x=(x_i|_{i=1}^n)$](https://dxdy-02.korotkov.co.uk/f/1/9/e/19e54a2a720fd94030200795592371ea82.png)
, значение максимума целевой функции
![$m$ $m$](https://dxdy-01.korotkov.co.uk/f/0/e/5/0e51a2dede42189d77627c4d742822c382.png)
:
> zklp:=proc(n,k,A)
> local a,b,c,i,j,l,m,r,u,v,x,y,z;
> a:=[seq([seq(convert(A[j,i],rational,exact),i=1..n)],j=1..k),seq([seq(1,i=1..n)],j=1..2)]; c:=[seq(0,i=1..k+2)]; x:=[seq(0,i=1..n)]; y:=[seq(0,i=1..n)]; z:=[seq(0,i=1..n)]; m:=0; r:=0;
> b:=false; for i to n do for j to k do if a[j,i]<>0 then b:=true; j:=k; i:=n fi od od;
> while b do for i to n do c[k+1]:=x[i]; c[k+2]:=x[i]-1; y[i]:=0; z[i]:=0; for j to k+2 do if a[j,i]<>0 then u:=-c[j]/a[j,i]; if 0<=u and u<=1 then v:=add(abs(c[l]+a[l,i]*u),l=1..k); if v>z[i] then y[i]:=u+x[i]; z[i]:=v fi fi fi od od; l:=0; v:=0; for i to n do if z[i]>v then l:=i; v:=z[i] fi od; if z[l]>m then for j to k do c[j]:=c[j]+a[j,l]*(y[l]-x[l]) od; x[l]:=y[l]; m:=z[l]; r:=r+1 else b:=false fi od;
> RETURN(r,x,m)
> end:
прим: функция
![$convert(a,rational,exact)$ $convert(a,rational,exact)$](https://dxdy-03.korotkov.co.uk/f/e/7/a/e7a0bd3a654b7973a685e077825350cc82.png)
преобразует числа
![$a$ $a$](https://dxdy-01.korotkov.co.uk/f/4/4/b/44bc9d542a92714cac84e01cbbb7fd6182.png)
вещественного типа в рациональную десятичную дробь, а рационального и целого типа не изменяет; использована, чтобы пресечь округления.