Matematik

Hjælp til optimering i matematik

08. april kl. 18:40 af dansemusenfreder - Niveau: A-niveau

Hej studieportalen,
Jeg skal skrive SRP i bla matematik og har derfor rodet mig ud i følgende.

Jeg har i tabellen til venstre 3 mulige udfald, hvor jeg kun må bruge en af de "1,2,3" talværdier fra højre tabel i hver række hvor jeg skal optimere mest muligt, så summen skal være så tæt på at være lige store i alle udfald som mulig.
Se vedhæftet for at forstå det.
Er der nogen der kan hjælpe mig med dette, så skal i have en stor tak :)

Vedhæftet fil: tabel 1 og 2.png

Brugbart svar (0)

Svar #1
08. april kl. 23:29 af Martin2Holte

Du kan 

 - lave en tabel 3 med to kolonner, hvor den første kolonne er et løbende nummer og den anden kolonne indeholder alle forskellige talværdier

- for hver celle i den første tabel bruge en "random" funktion til at trække et løbende nummer, slå den tilhørende værdi i tabel 3 op vha "lookup" funktionen og sætte tallet ind i tabel 1

Det skulle gerne komme så tæt på en lige fordeling som muligt.


Svar #2
09. april kl. 07:08 af dansemusenfreder

Ville du have mulighed for at sætte det op i det her excel ark? Forstår ikke helt hvad du mener, det ville være en stor hjælp.
På forhånd tak :)

Vedhæftet fil:mat kolonne excel.xlsx

Brugbart svar (0)

Svar #3
09. april kl. 09:17 af Martin2Holte

Se vedhæftede fil.

formlen i tabel 1 er =LOOKUP(RANDBETWEEN(1,9),$M$5:$M$13,$N$5:$N$13) 

hvor $M$5:$M$13 er kolonnen med løbenumre 1 til 9

og $N$5:$N$13 er kolonnen med de 9 tal der skal slås op i tabel 3


Svar #4
09. april kl. 09:49 af dansemusenfreder

Det forstår jeg ikke helt, syntes ikke helt det løser problemstillingen?

Det jeg søger er at de tal fra tabel 1 bliver fordelt bedst muligt i tabel 2 hvor der kun må være et tal i hver række, du har vel bare ændret i tabel 1? Men det er tabel 2 som skal have en formel som kan gøre at summen i bunden er størst mulig og så lige stor som mulig.


Svar #5
09. april kl. 09:52 af dansemusenfreder

Tabel 1 skal jo helst være statisk og være måden den slår op i de forskellige værdier i hvor at tabel 2 skal opdateres ifht tallene som bliver sat ind i tabel 1.


Brugbart svar (0)

Svar #6
09. april kl. 10:05 af Martin2Holte

Til at starte med skrev du at tabellen til venstre (dvs tabel 1) skal bruge talværdier fra højre tabel (dvs tabel 2).

Det kan sagtens gøres omvendt som du skrev til sidst, at tabel 2 bruger værdier fra tabel 1. Du skal bare gøre det tilsvarende, du kan jo se formlerne i regnearket.

Brugbart svar (0)

Svar #7
09. april kl. 10:17 af Mikkeltik

Sorry, jeg fik ikke forklaret det ordentligt, men vi skal kun bruge et tal per række, så hvordan gør man det ifht formlen? og den skal jo selv finde ud af hvor det ene tal skal stå i enten 1,2,3


Brugbart svar (0)

Svar #8
09. april kl. 10:21 af Martin2Holte

Jeg kigger på det i aften.

Brugbart svar (1)

Svar #9
09. april kl. 19:50 af Martin2Holte

Jeg brugte "brute force" metoden til at løse denne optimering, dvs beregne alle 3^13 mulige løsninger for tabel 2, 1594323 i alt. Excel er for langsomt til dette, så jeg brugte et andet CAS system (Mathematica).

Der er 5 løsninger hvor to kolonner giver den samme sum og den tredje kun afviger med 5, der er ingen løsning hvor alle kolonner giver den samme værdi.

de sidste 4 af de 5 løsninger har den samme sum, som er større end den fra den første løsning, så du vælger bare en af dem. 


Brugbart svar (1)

Svar #10
09. april kl. 20:07 af Martin2Holte

Her er koden:

tabel1 = (* indeholder dine værdier *)

3760. 7600. 7700.
1890. 3950. 3870.
3040. 6240. 6160.
1850. 3800. 3900.
915. 1975. 2040.
1850. 4000. 3800.
1880. 3800. 3850.
1880. 3800. 3850.
940. 1975. 1850.
945. 1980. 1855.
1900. 3750. 3750.
945. 1950. 1900.
925. 1900. 2000.

rows=13 (* antallet af rækker i tabel1 *)
selections = Tuples[{1, 2, 3}, rows]; (* alle mulige kombinationer af talllene 1, 2 og 3 *)

(* funktion til at trække tallene fra tabel 1 jfr den kombination af 1, 2, 3 tallene *)

candidate[selection_] := MapIndexed[Switch[#1,
    1, {tabel1[[#2[[1]], 1]], 0, 0},
    2, {0, tabel1[[#2[[1]], 2]], 0},
    3, {0, 0, tabel1[[#2[[1]], 3]]}
    ] &, selection]

(* funktioner til at beregne afvigelser mellem kolonner i det resultat vi har trukket *)

comp[tot_] := Abs[tot[[2]] - tot[[1]]] + Abs[tot[[2]] - tot[[3]]];
eval[cand_] := comp[Map[Total, Transpose[cand]]];

(* Nu mangler vi bare at kalde disse funktioner for alle mulige kombinationer og sortere resultatet efter den mindste afvigelse øverst. For at gøre det hurtigere smider vi undervejs alle resultater væk hvor afvigelsen er større end 2000, så vi ikke skal sortere 1.5 millioner resultater Der vises det løbende nummer af den kombination af 1,2,3 tal som vi brugte og den afvigelse mellem kolonnerne for de 20 bedste bud  *)

SortBy[Select[
    MapIndexed[{#2[[1]], eval[candidate[#1]]} &, 
     selections], #[[2]] < 2000 &], Last][[1 ;; 20]] // Grid

{
 {32653, 5.},
 {385215, 5.},
 {385323, 5.},
 {385701, 5.},
 {385809, 5.},
 {1093591, 5.},
 {18521, 10.},
 {32599, 10.},
 {375335, 10.},
 {375821, 10.},
 {381773, 10.},
 {382259, 10.},
 {548990, 10.},
 {1082831, 10.},
 {1083317, 10.},
 {1093537, 10.},
 {31305, 15.},
 {31923, 15.},
 {32277, 15.},
 {32409, 15.}
}

(* Vi vil kun se de bedste resultater *)

solutions = selections[[{
     32653,
     385215,
     385323,
     385701,
     385809
    }]]

(* Funktion til at formatere de tal som blev trukket og summen per kolonne *)

format[candidate_] := 
  Grid[Append[candidate, 
    Map[Style[Total[#], {Red, Bold}] &, Transpose[candidate]]], 
   Frame -> All];

(* Nu skal vi bare kalde formateringen for de ønskede løsninger *)

Map[format[candidate[#]] &, solutions]


Skriv et svar til: Hjælp til optimering i matematik

Du skal være logget ind, for at skrive et svar til dette spørgsmål. Klik her for at logge ind.
Har du ikke en bruger på Studieportalen.dk? Klik her for at oprette en bruger.