===== Cvičení 2 =====
==== LinProg 101 ====
==== Úloha 1 ====
f = [ 0; 0; 0; 0; 0; -1 ]
% f [ x1; x2; x3; x4; x5; lambda ]
A = [ -1.27 -1.02 0 0 0 1; 0 -1.02 -4.7 -3.09 0 1; 0 0 0 -3.09 -9 1 ]
b = [ 0; 0; 0; ]
Aeq = [ 1 1 1 1 1 0 ]
beq = [ 3000 ]
lb = [ 0; 0; 0; 0; 0; -inf ]
[x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb)
--- //[[sachamar@fel.cvut.cz|Marek Sacha]] 2009/10/01 01:54//
==== Úloha 1 - Bonus ====
f = [ 0; 0; 0; -1 ];
A = [ -1.27 0 0 1; 0 -4.7 0 1; 0 0 -9 1; -1 -1 0 0; 0 -1 -1 0; -1 0 -1 0; -1 0 0 0; 0 -1 0 0; 0 0 -1 0];
b = [ 0; 0; 0; -400; -400; -400; -400; -400; -400];
Aeq = [ 1 1 1 0 ];
beq = [ 3000 ];
lb = [ 0; 0; 0; -inf ];
res = linprog(f,A,b,Aeq,beq,lb)
--- //[[latalto2@fel.cvut.cz|Tomáš Látal]] 2009/10/07 23:25//
==== Úloha 2 ====
%opet pridani pomocne promenne
f = [0;0;1]; % 1, protoze maximalizuju 2x
%pomocny vektor jednotek
jednicky = ones(50,1);
%prvni pulka podminek
A1 = [ x jednicky -jednicky]; %leve strany
b1 = y; %prave strany
%druha pulka podminek
A2 = [ -x -jednicky -jednicky]; %leve strany
b2 = -y; %prave strany
%podminky - celek
A = [ A1; A2]; %leve strany
b = [b1;b2]; %prave strany
%zjisteni reseni
sol = linprog(f,A,b);
%vykresleni hodnot
hold on;
plot(x, y,'bo'); %puvodni body
plot(x, x*sol(1)+sol(2),'r'); %vysledna aproximujici primka
plot(x, x*sol(1)+sol(2)+sol(3),'r:'); %horni omezujici primka
plot(x, x*sol(1)+sol(2)-sol(3),'r:'); %dolni omezujici primka
hold off;
--- //[[prucha.martin@gmail.com|Martin Průcha]] 2009/10/01 18:11//
* Dneska na cviku, kdyz jsme ty ulohy odevzdavali, tak nam bylo receno, ze je zbytecny pulit ty promenny z R a vskutku, z matlabu vypadl stejny vysledek. Nejak jsem uplne nepobrala proc to tak je, ale asi neco podobnyho jako kdyz je //min f(x) = -max[-f(x)]// a to minus pred max nejak nehraje roli, viz graficke vyjadreni mozna? Koser na zkousku nebo na pisemku je stejne asi to puleni, takze tak.
* Cvicici rikal, ze ty dve nerovnice lze zapsat do jedne s vicero parametry, nicmene jinak se puleni musi zachovat, jinak by spravny vysledek byl otazkou nahody - odpovidajici usporadani bodu.
* taky jsem se na to na cviku schválně ptala a bylo mi řečeno, že půlení se musí zachovat (alespoň pokud uvažujeme kód výše), protože jinak by to nevycházelo. z grafického ztvárnění, které mi k tomu namaloval cvičící, je to docela vidět: máme přímku (1.podmínka), a ty body jsou v polorovině napravo od ní. u druhé přímky (2.podmínka) jsou v polorovině nalevo, takže ty přímky vymezují pás, kde se body nacházejí. proto ty podmínky potřebujeme zadat obě - jinak bysme měli určenou jen (nekonečnou) polorovinu, kterou bysme samozřejmě nemohli proložit žádnou aproximační přímku.
==== Diskuze ====
Koukal už někdo na tu 1.úlohu? Zajímalo by mne, jak v MatLabu zapsat podmínku, že x1+...x5 = 3000... a jak má vypadat funkce f. Já jsem zatím vytvořil toto:
''f = [-1];
A=[1.27 1.02 0 0 0
0 1.02 4.7 3.09 0
0 0 0 3.09 9];
b=[1,1,1];''
PS: jak se tu zalamuje?
--- //[[FDominik@seznam.cz|Dominik Franek]] 2009/09/29 21:17//
* Zdravim. Ta podminka, ze soucet ma byt 3000 se pocita pomoci Aeq a Beq, coz jsou argumenty linprog. Do Aeq narves v matlabu vektor jednicek o velikosti n, tedy [1 1 1 1 1] a Beq je skalar 3000, ixovej nevyplnujes...tot vse :) --- //[[kvacajan@fel.cvut.cz|Jan Kváča]] 2009/09/29 23:30//
Já řeším tu druhou polovinu první úlohy a vyhazuje mi to pořád error:
//Exiting: One or more of the residuals, duality gap, or total relative error
has grown 100000 times greater than its minimum value so far:
the dual appears to be infeasible (and the primal unbounded).
(The primal residual < TolFun=1.00e-008.)//
Výsledné hodnoty to přitom hodí nulové, což je špatně. Nestalo se vám to nikomu? --- //[[zacham3@fel.cvut.cz|Martin Zachar]] 2009/09/30 00:12//
Jak Vám to vyšlo? Můj výsledek je, že vsadím jen na 10 (2694,6) a na 2 (305,4)… a jistá výhra je asi 2748,5 Kč… Má někdo lepší řešení? Popř. popište, jak jste na to šli…
* Vyšlo mi to úplně stejně. --- //[[zacham3@fel.cvut.cz|Martin Zachar]] 2009/09/30 12:01//
Tak už se mi nějak podařilo i to druhé. Vyšlo mi to: a = 0.4997; b = -0.6757; odchylka = 0.1751; --- //[[zacham3@fel.cvut.cz|Martin Zachar]] 2009/09/30 12:54//
* Tak nové výsledky, které sjou snad již správné :) %a = 0.4740; %b = -0.5806; %odchylka = 0.0988 --- //[[zacham3@fel.cvut.cz|Martin Zachar]] 2009/09/30 14:35//
Nemaj byt ty sazky rozlozeny na jednotlivy moznosti nenulove? Je to i v omezujicich podminkach... jinak me tohle vyslo taky, ale nevim jestli je to spravny vysledek no... --- //[[kvacajan@fel.cvut.cz|Jan Kváča]] 2009/09/30 17:06//
Myslím že ne, protože nám cvičící na cviku říkal, že máme najít takové řešení (jistou výhru), při které utržíme nejvyšší zisk. A pokud je tato varianta správně, pak by nemělo rozložení nic říkat.
* omezujici podminky jsou podle me vetsi nebo rovno... cili je to splnene...
* jojo, beru zpet, je tam vetsi rovno, tudiz podminka splnena :) vyslo mi to stejne --- //[[kvacajan@fel.cvut.cz|Jan Kváča]] 2009/09/30 20:47//
mohli byste nejak nekdo prosim nastinit, jak jste postupovali? predevsim mi neni vubec jasne, co v 1.casti zadani znamena ta lambda, respektive, jak ziskat jeji hodnotu.. --- //[[prucha.martin@gmail.com|Martin Průcha]] 2009/09/30 18:05//
* funkce f bude vektor [0 0 0 0 0 -1], kde -1 je tam proto, ze mas maximalizovat tzn., ze musis udelat -f (viz. triky z prednasek), ta 1 je tam pro tu lambdu, coz je nova promenna (viz. prednasky slajd 18). Pak uz jen udelas matici A (ale pozor, v podminkach je >= a musi se to prevest na <= tedy vynasobit -1 cely radek), vektor b bude nulovy (po prevedeni lambda na levou stranu). Takze ve finale do matlabu vlozite neco takoveho a ste doma linprog([0;0;0;0;0;-1],[-1.27 -1.02 0 0 0 1; 0 -1.02 -4.7 -3.09 0 1; 0 0 0 -3.09 -9 1], [0;0;0], [1 1 1 1 1 0], 3000, zeros(6,1)). A ted na oplatku poradte s tou druhou ulohou :) THX wrm --- //[[kvacajan@fel.cvut.cz|Jan Kváča]] 2009/09/30 20:47//
* Druhá úloha je to stejné. Opět máš podmínky (teď jich máš 100 místo těch 4 v prvním polovině). Teď máš 3 proměnné (místo x1, x2, ..., lambda) - a, b, lambda. Takže A budeš mít 100 řádků dlouhé se 3 sloupečky. Funkce bude vektor [0 0 1]. Výsledkový vektor bude jen sloupec ypsilonek. To je snad vše :) --- //[[zacham3@fel.cvut.cz|Martin Zachar]] 2009/09/30 21:01//
* jasny, uz to fachci :) --- //[[kvacajan@fel.cvut.cz|Jan Kváča]] 2009/09/30 21:39//
----
...keby to niekto chcel skusit v praxi, tu je zoznam bonusov :) (ikonka B pri nazve) http://www.oddsportal.com/bookmakers/
~~DISCUSSION~~