===== 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~~