Enuntul simplist ascundea o problema de matematica (algebra liniara) care
necesita cunostinte de clasa a XI-a de algebra. Acest lucru nu ar trebui sa
indispune pe cei de o etate mai mica si pentru a ii incuraja sa inteleaga
acele notiuni am sa incerc doua variante de explicare a algoritmului (ambele
echivalente).
Varianta 1:
Problema se reducea la a rezolva sistemul de 3 ecuatii cu 4 necunoscute
Amestec1_A*P1+Amestec2_A*P2+Amestec3_A*P3=P*Sol_A
Amestec1_B*P1+Amestec2_B*P2+Amestec3_B*P3=P*Sol_B
Amestec1_C*P1+Amestec2_C*P2+Amestec3_C*P3=P*Sol_C,
unde P1,P2,P3,P sunt necunoscutele si reprezinta proportiile in care se iau
cele 4 amestecuri Amestec1_A:Amestec1_B:Amestec1_C, Amestec2_A:Amestec2_B:
Amestec2_C, Amestec3_A:Amestec3_B:Amestec3_C, respectiv Sol_A:Sol_B:Sol_C
(amestecul solutie).
Trebuiau alese 3 amestecuri (Amestec1,Amestec2,Amestec3) din cele N care sa
dea un sistem compatibil (cu solutie), la care P1, P2, P3, P au acelasi semn
(pentru ca altfel ar insemna ca unele amestecuri se pun in proportie pozitiva,
iar altele in proportie negativa, acest din urma lucru nefiind posibil).
Cum rezolvam un astfel de sistem la prima vedere nedeterminat? Impartim
prin P fiecare ecuatie si rezulta un sistem echivalent cu primul
Amestec1_A*P'1+Amestec2_A*P'2+Amestec3_A*P'3=Sol_A
Amestec1_B*P'1+Amestec2_B*P'2+Amestec3_B*P'3=Sol_B
Amestec1_C*P'1+Amestec2_C*P'2+Amestec3_C*P'3=Sol_C.
Un astfel de sistem se poate rezolva, spre exemplu, prin metoda lui Cramer
(aceasta este notiunea de cl. XI-a). Scoatem P'1, P'2, P'3, si ne uitam daca
au acelasi semn. Daca da, atunci am rezolvat sistemul. Altfel, nu.
Bineinteles, alegerea a 3 amestecuri se face prin backtracking ce asigura o
complexitate de O(n^3) care se inscrie in timp.
Varianta 2:
Pentru cei familiarizati cu geometria 3D, aceasta explicatie sper sa li se
para mult mai intuitiva.
Vom considera cantitatile celor 3 substante A,B,C din enunt marimile X,Y,Z
ale unor vectori 3D, in sistem cartezian.
A fi posibil sa amestecam cele N solutii sa ne dea amestecul solutie este
echivalent cu a compune cei N vectorii pentru a ne da vectorul solutie. Asta
inseamna sa gasim P[1],...,P[N] a.i. P[1]*v1+P[2]*v2+...+P[N]*vN=v_sol.
Geometric asta inseamna ca vectorul rezultanta al primilor N sa fie coliniar
cu vectorul solutie (v_sol).
Decat sa se caute P[1],...,P[N] problema se poate rezolva mai usor, anume
din cei N vectori se cauta:
- un vector coliniar cu v_sol. Daca se gaseste, evident problema are solutie
si ia sfarsit. Pasul are complexitatea O(n).
- 2 vectori care scalati si compusi sa dea un vector coliniar cu v_sol. Daca
se gasesc, problema are solutie si ia sfarsit. Pasul are complexitatea
O(n^2).
- 3 vectori necoplanari. Se garanteaza ca 3 vectori necoplanari (cunoscuti
in algebra liniara si ca vectori liniar independenti sau sistem generator)
pot genera orice alt vector 3D, deci si pe v_sol. Daca se gasesc, problema
are solutie si ia sfarsit. Pasul are complexitatea O(n^3).
Se demonstreaza prin reducere la absurd si inductie ca daca nu se gaseste
solutie in acesti 3 pasi problema nu are solutie.
Descriere a testelor folosite:
- testul 1: intinde o capcana pentru a vedea daca s-a tinut cont de restrictia
ca noi nu putem decat sa adunam vectori sau multipli de vectori,
fara a putea sa ii scadem. Astfel avem v1+v2-v3=v, dar nu putem
scade v3 din v1+v2.
- testul 2: consta din generarea a 100 de vectori coplanari, ce apartin
planului X+2Y-Z=0. Vectorul rezultat bineinteles :) nu este
coplanar cu cei 100 generati.
- testul 3: s-au generat 100 de vectori coliniari, ce apartin dreptei X=Y=Z.
Vectorul solutie nu este coliniar cu cei 100 generati.
- testul 4: s-au generat 100 de vectori coliniari, ce apartin dreptei X=Y=Z.
De data aceasta vectorul solutie este coliniar cu toti 100.
- testul 5: s-au generat aleator 100+1 vectori. Ca etalon am folosit
raspunsurile date de sursa mea.
- testul 6: s-au generat 100 de vectori coplanari, ce apartin planului
X+2Y-Z=0. Vectorul rezultat v=v99+v100.
- testul 7: N=3. Vectorii v1,v2,v3 sunt versorii axelor sistemului cartezian.
- testul 8: am generat 10 vectori. v=v1+v2+v3+...+v10.
- testul 9: am generat 100 de vectori coplanari, ce apartin planului X+2Y-Z=0.
Vectorul rezultat v=v100.
- testul 10: N=2. Cei 2 vectori si vectorul solutie sunt necoplanari.
|
|