|
| Simpel grådig tilbagebetaling Fra : Rune Zedeler |
Dato : 27-11-01 14:00 |
|
Hvis man skulle implementere en tilbagebetalingsenhed til en automat
kunne man være interesseret i altic at tilbagebetale beløbet med så få
mønter som muligt.
For nemheds skyld kan vi regne i hele beløb og antage at automaten har
ubegrænset lager af tilbagebetalingsmønter i alle eksisterende
størrelser.
En naiv grådig algoritme kunne være, at man, sålænge man manglede at
betale noget, tilbagebetalte den største mønt der ikke er større end
restbeløbet.
Denne algoritme virker med vores møntsystem. Skal man f.eks.
tilbagebetale 14 kr vil automaten først spytte en 10'er og derefter to
2-ere ud.
Med mere sofisikerede møntsystemer virker algoritmen ikke. Havde vi
f.eks. også en 7-krone-mønt, ville den skitserede algoritme stadig
udbetale en 10'er og to 2'ere - men det optimale ville være to 7'ere.
Spørgsmål 1:
Er der nogen her, der er i stand til at opstille et simpelt sæt regler
som et system af mønter skal overholde for at den grådige algoritme
virker? Som sagt regner vi kun i hele beløb, og vi kan antage at
møntsystemet er konstrueret så alle beløb kan tilbagebetales - dvs. at
der findes en 1-krone-mønt.
Spørgsmål 2:
Findes en algoritme, der altid virker, og som har pladsforbrug O(antal
mønter * log(beløb)) og tidsforbrug O(beløb)?
( O(beløb+antal mønter) kan implementeres med simpel dynamisk
programmering )
-Rune
| |
Christian R. Larsen (27-11-2001)
| Kommentar Fra : Christian R. Larsen |
Dato : 27-11-01 14:31 |
|
Rune Zedeler <rz@daimi.au.dk> skrev i artiklen
<3C038E35.D2DB368@daimi.au.dk>...
> Er der nogen her, der er i stand til at opstille et simpelt sæt regler
> som et system af mønter skal overholde for at den grådige algoritme
> virker?
Jeg ville lave et system, hvor jeg opstillede alle tænkelige kombinationer
af mønter, der havde en samlet beløbssum, der var mindre end restbeløbet.
Efterfølgende ville jeg så sortere dem efter, hvor mange mønter, der indgik
i hver kombination.
Jeg ville starte oppefra, sådan at jeg startede med kombinationer af så
mange store mønter som muligt. Første gang, jeg så stødte på en
kombination, der havde færre mønter end den foregående "rekordindehaver",
ville jeg udvælge denne.
| |
Rune Zedeler (27-11-2001)
| Kommentar Fra : Rune Zedeler |
Dato : 27-11-01 14:42 |
|
"Christian R. Larsen" wrote:
> > Er der nogen her, der er i stand til at opstille et simpelt sæt regler
> > som et system af mønter skal overholde for at den grådige algoritme
> > virker?
>
> Jeg ville lave et system, hvor jeg opstillede alle tænkelige kombinationer
> af mønter, der havde en samlet beløbssum, der var mindre end restbeløbet.
> Efterfølgende ville jeg så sortere dem efter, hvor mange mønter, der indgik
> i hver kombination.
>
> Jeg ville starte oppefra, sådan at jeg startede med kombinationer af så
> mange store mønter som muligt. Første gang, jeg så stødte på en
> kombination, der havde færre mønter end den foregående "rekordindehaver",
> ville jeg udvælge denne.
Så vidt jeg kan se, snakker du om en algoritme til tilbagebetaling,
selvom det ikke er det spørgsmål, du har citeret.
Well, din algoritme vil være for langsom. Kan ikke overskue
tidskompleksiteten, men noget i retning af O((antal mønter)*(beløb)).
-Rune
| |
Christian R. Larsen (27-11-2001)
| Kommentar Fra : Christian R. Larsen |
Dato : 27-11-01 15:05 |
|
Rune Zedeler <rz@daimi.au.dk> skrev i artiklen
<3C039844.E2C83E2B@daimi.au.dk>...
> Så vidt jeg kan se, snakker du om en algoritme til tilbagebetaling,
> selvom det ikke er det spørgsmål, du har citeret.
Rigtigt.
> Well, din algoritme vil være for langsom. Kan ikke overskue
> tidskompleksiteten, men noget i retning af O((antal mønter)*(beløb)).
Jeg tvivler på, at det bliver det store, vilde problem med hastigheden. I
realiteten kan man vel ikke forestille sig tilbagebetaling af beløb, der er
større end den største seddel.
| |
Rune Zedeler (27-11-2001)
| Kommentar Fra : Rune Zedeler |
Dato : 27-11-01 15:58 |
|
"Christian R. Larsen" wrote:
> Jeg tvivler på, at det bliver det store, vilde problem med hastigheden. I
> realiteten kan man vel ikke forestille sig tilbagebetaling af beløb, der er
> større end den største seddel.
Nej, men algoritmen kan også finde anvendelse inden for andre
optimeringsområder end tilbagebetaling af mønter - og nogle af disse
arbejder med væsentligt større tal end sodavandsautomater.
I øvrigt skrev jeg direkte i mit første indlæg at jeg allerede havde
løst det konkrete problem - men for sjov skyld ledte efter en mere
optimal løsning (well, "for sjov"-delen skrev jeg ikke i det oprindelige
indlæg, well).
Hvis man ikke har noget imod pladsforbrug på (antal mønter)*(beløb) kan
man løse probemet dynamisk ved for hvert beløb (!) at lave en tabel over
hvilke mønter dette beløb skal udbetales i. Det jeg skrev i første
indlæg om plads- og tidsforbruget af den dynamiske algoritme holder vist
ikke.
-Rune
| |
Christian R. Larsen (28-11-2001)
| Kommentar Fra : Christian R. Larsen |
Dato : 28-11-01 11:17 |
|
Rune Zedeler <rz@daimi.au.dk> skrev i artiklen
<3C03AA0D.F9876E33@daimi.au.dk>...
> Hvis man ikke har noget imod pladsforbrug på (antal mønter)*(beløb) kan
> man løse probemet dynamisk ved for hvert beløb (!) at lave en tabel over
> hvilke mønter dette beløb skal udbetales i. Det jeg skrev i første
> indlæg om plads- og tidsforbruget af den dynamiske algoritme holder vist
> ikke.
Ja, dette er jo den klassiske optimeringsmetode, som mange programmører vel
på et eller andet tidspunkt kommer ud for at skulle anvende.
| |
Kvan (27-11-2001)
| Kommentar Fra : Kvan |
Dato : 27-11-01 14:10 |
|
Rune Zedeler <rz@daimi.au.dk> writes:
> Er der nogen her, der er i stand til at opstille et simpelt sæt
> regler som et system af mønter skal overholde for at den grådige
> algoritme virker?
Så vidt jeg lige kan overskue må det her induktive regelsæt virke:
M1 = 1
Mn >= 2*M(n-1) for alle n > 1.
Algoritmen der altid virker kan jeg til gengæld ikke lige overskue :)
- Kvan.
| |
Rune Zedeler (27-11-2001)
| Kommentar Fra : Rune Zedeler |
Dato : 27-11-01 14:24 |
|
Kvan wrote:
> Så vidt jeg lige kan overskue må det her induktive regelsæt virke:
>
> M1 = 1
> Mn >= 2*M(n-1) for alle n > 1.
>
> Algoritmen der altid virker kan jeg til gengæld ikke lige overskue :)
Nope. Din betingelse er hverken nødvendig eller tilstrækkelig.
1,2,3,4,5 virker.
1,7,15 virker ikke (21 kroner, f.eks.).
-Rune
| |
Niels Langager Elleg~ (27-11-2001)
| Kommentar Fra : Niels Langager Elleg~ |
Dato : 27-11-01 17:09 |
|
Rune Zedeler <rz@daimi.au.dk> writes:
> 1,2,3,4,5 virker.
> 1,7,15 virker ikke (21 kroner, f.eks.).
Hmm jeg kan ikke løse problemet, men jeg kan formalisere det lidt. I
det ovenstående eksempel kan vi indføre prisvariable p1=1, p2=7 og p3
=15 og antalsvariablene n1, n2 og n3. Tilbagebetalingen er givet ved
beløb = p1 * n1 + p2 * n2 + p3 * n3
= n1 + 7 * n2 + 15 n3
Hvis tilbagebetalingen skal være optimal må det gælde at
n1 < 7 (for ellers er det bedre at bruge en 7 krone)
n1 < 8 eller n7 < 1 (for ellers er det bedre at bruge en 15 krone)
n1 < 1 eller n7 < 2 (for ellers er det bedre at bruge en 15 krone)
Det burde være rimeligt let at finde på en datastruktur hvor man kan
lagre sådan nogle uligheder. Derefter burde det gå noget hurtigere når
man fyrede sine for-løkker af.
Jeg fandt to artikler om "Exact Analysis of Exact Change", men idag er
dagen hvor jeg skriver alle mine artikler ind i bibtex og jeg er lidt
bagud i forhold til tidsplanen, så jeg har ikke kigget dem igennem.
http://citeseer.nj.nec.com/context/127543/33166
http://citeseer.nj.nec.com/chan98easy.html
PS: Tak for sidst det var hyggeligt. Jeg har ikke helt fået styr på
farveprinteren endnu, men jeg har fundet ud af at ændre farvepalletten
med gimp, så det kan ikke gå helt galt.
--
Niels L Ellegaard http://dirac.ruc.dk/~gnalle/
SPECIAL OFFER! I proofread unsolicited commercial email sent to this
address at a rate of US $500.00 per incident! Include billing address
in your message and save US $500.00 per hour off ordinary address
resolution and tracking charge!
| |
Thomas Krog (27-11-2001)
| Kommentar Fra : Thomas Krog |
Dato : 27-11-01 16:46 |
|
> Spørgsmål 2:
> Findes en algoritme, der altid virker, og som har pladsforbrug O(antal
> mønter * log(beløb)) og tidsforbrug O(beløb)?
> ( O(beløb+antal mønter) kan implementeres med simpel dynamisk
> programmering )
Da "antal mønter" < "max beløb" må der gælde at:
O(beløb+antal mønter) = O(beløb)
| |
Rune Zedeler (27-11-2001)
| Kommentar Fra : Rune Zedeler |
Dato : 27-11-01 16:56 |
|
Thomas Krog wrote:
> Da "antal mønter" < "max beløb" må der gælde at:
> O(beløb+antal mønter) = O(beløb)
Undskyld, mit ordvalg er upræcist.
Med "antal mønter" mener jeg ikke "antal udbetalte mønter" men derimod
"antal forskellige mønter i møntsystemet".
Et værre problem er, at den dynamiske algoritme desværre afaics vil
kræve mere plads (antal mønter * beløb) - og at det, jeg skrev, derfor
var forkert.
-Rune
| |
Thomas Jakobsen (28-11-2001)
| Kommentar Fra : Thomas Jakobsen |
Dato : 28-11-01 08:44 |
|
"Rune Zedeler" <rz@daimi.au.dk> wrote in message
news:3C038E35.D2DB368@daimi.au.dk...
> Spørgsmål 1:
> Er der nogen her, der er i stand til at opstille et simpelt sæt regler
> som et system af mønter skal overholde for at den grådige algoritme
> virker? Som sagt regner vi kun i hele beløb, og vi kan antage at
> møntsystemet er konstrueret så alle beløb kan tilbagebetales - dvs. at
> der findes en 1-krone-mønt.
Jeg hørte, at der var nogen der benyttede L^3-algoritmen (lattice reduction
af Lenstra, Lenstra og Lovasz) i en kasseautomat. Lidt overkill måske, men
sjovt nok.
For info om LLL, check f.eks.
http://www.cecm.sfu.ca/projects/IntegerRelations/LLL.html .
> Spørgsmål 2:
> Findes en algoritme, der altid virker, og som har pladsforbrug O(antal
> mønter * log(beløb)) og tidsforbrug O(beløb)?
> ( O(beløb+antal mønter) kan implementeres med simpel dynamisk
> programmering )
Check litteraturen om lattice reduction og L^3-algoritmen (eller LLL). Den
er også blevet brugt til at bryde knapsack-problemer, der var benyttet som
envejsfunktioner (til kryptosystemer).
Thomas
| |
|
|