Ställdes inför följande problem på jobbet och trodde först att det skulle bli omöjligt att lösa, men det var ett problem som passade mig så det har gått bra: Rent spontant känns det som om det inte går att räkna ut. <b>Rent spontant känns det som om det inte går att räkna ut.</b> <b>om du visar formeln så kan jag skriva kod för det.</b> >><b>Rent spontant känns det som om det inte går att räkna ut.</b> <b>Det jag menade med att det inte går att räkna ut är jag inte kan få mer än 100-X% marginal.</b> Jag börjar med att ge er ekvationen för ett specialfall: Så långt kom jag i mitt 10-minutersförsök när tråden startades, men tänkte inte på det självklara i att använda max() istället för "cases". :-) Okej, vi har tre punkter s1, s2, s3, som är brytpunkterna mellan konstant och linjär, dvs <b>bara summor av linjära funktioner och konstanter</b> Ja, jag menade egentligen verkligen bara att den är uppdelad i ett antal ps och a-funktioner. Hur får du fram brytpunkterna? Okej alltså, först gör vi omskrivningen jag skrev, Det borde vara ett korrekt sätt att lösa det. Vad jag funderar över - men inte hunnit kolla närmare på - är om det alltid ger samma resultat som den metod jag använde. Men där testar du ju en massa fall som aldrig kan vara korrekta? Menar du att de båda villkoren inte kan gälla samtidigt? Vet inte hur jag ska uttrycka det. Vad jag menar är att vi får fyra intervall, på de två mittenintervallen så har vi 3 val av funktion (det är nog binomialfördelat). Men det är bara en av funktionerna som är relevant.Intressant problem från jobbet
Problemet: Vilket pris skall en butik ta för en vara för att få önskad marginal?
Bakgrundsfakta:
Butiken har två kostnader för varan: ersättning till leverantör och ersättning till distributör.
Ersättningen till leverantören (inköpspriset) utgörs av en procentsats av säljpriset inkl moms eller av säljpriset exkl moms, dock minst ett visst belopp.
Ersättningen till distributören utgörs av en procentsats av säljpriset inkl moms, av säljpriset exkl moms eller av inköpspriset, dock minst ett visst belopp.
Butiken önskar nu en marginal om en viss procentsats, dock minst ett visst belopp.
Kan väl låta er slippa googla efter definitionen av marginal...
Marginalens belopp definieras som säljpriset exkl moms minus summan av kända kostnader (här: ersättning till leverantör och ersättning till distributör)
Marginalen som procentsats definieras som (100 gånger) marginalens belopp dividerat med säljpriset exkl moms.
Hur enkel/snabb/fin programmeringslösning kan ni hitta?
(Extrauppgift: Som om detta inte skulle vara nog, skulle procentsatsen för ersättningen till leverantören kunna bero av säljpriset. Hur skall man göra då?)Sv: Intressant problem från jobbet
Marginalen borde alltid bli 100-lev%-dist%
(Förutom då minimibeloppen används)Sv:Intressant problem från jobbet
Jodå, jag har lyckats sätta upp en formel, så att jag i princip kan räkna ut det rakt av.Sv:Intressant problem från jobbet
Då missar du ju stora bitar av utmaningen... Hur kul är det?
Utmaningen kan sägas bestå av fyra delar:
1) hitta en ekvation (olikhet) för ett specialfall
2) få ihop alla möjliga fall i ekvationen
3) lösa ekvationen
4) implementera lösningen i kodSv: Intressant problem från jobbet
>Jodå, jag har lyckats sätta upp en formel, så att jag i princip kan räkna ut det rakt av.
Då måste jag har missat något. Kanske är det bara svammel men så här resonerade jag:
För att göre det enkelt antar vi att vi bara har en som skall ha betalt. Låt oss kalla honom tillverkaren.
(skippar momsen också sålänge)
Låt oss anta att tillverkaren vill ha X% och vi vill ha Y%'
Om tillverkaren får X% så får vi 100-X% oavsett vilket pris vi tar.
Det finns såldes 3 fall att hantera
- om Y = 100-X så blir priset
Priset = max(vårminimimaginal, tillverkarensminimibelopp) / X
- Om Y > 100-X så går det inte.
- Om Y < 100-X så blir priset.
Priset = tillverkarensminimibelopp / (100-Y)
Det jag menade med att det inte går att räkna ut är jag inte kan få mer än 100-X% marginal. Det går att få mindre än 100-X% men varför skulle jag ställa upp på det. Låter som ett osunt förhållande mellan parterna tycker jag.Sv:Intressant problem från jobbet
Självklart går det inte ihop sig om parterna totalt vill ha mer än 100% av säljpriset. Men under förutsättning att problemet är lösbart, hur ser lösningen ut?Sv: Intressant problem från jobbet
Ersättningen till leverantören är p*100% av säljpriset exkl moms, dock minst a SEK.
Ersättningen till distributören är q*100% av säljpriset exkl moms, dock minst b SEK.
Butiken önskar nu en marginal om r*100%, dock minst c SEK.
Antag att det sökta säljpriset exkl moms är s SEK.
Ersättningen till leverantören blir max(p s, a) SEK.
Ersättningen till distributören blir max(q s, b) SEK.
Marginalen blir därmed s - max(p s, a) - max(q s, b) SEK.
För att butiken skall bli nöjd, skall alltså gälla
s - max(p s, a) - max(q s, b) >= max(r s, c)
Ekvationen kan skrivas om som
max(p s, a) + max(q s, b) + max(r s, c) <= s
Uppgiften är alltså att finna s. Parametrarna p, q, r, a, b och c är givna.Sv:Intressant problem från jobbet
Blev för svårarbetat och hade inte tid. Om vi tar det lite lugnt nu kanske det går lättare. I princip ser det ju ut som ett ganska enkelt problem, rent grafiskt.Sv: Intressant problem från jobbet
a = p s1 => s1 = a/p
s2 = b/q
s3 = c/r
Vi kallar nu a, b, c för a1, a2, a3, och p, q, r för p1,p2,p3.
Om vi nu flyttar om de olika talen så s1<s2<s3, så får vi fyra intervall.
[0, s1]
[s1, s2]
[s2, s3]
[s3, \inf]
Däremellan får vi olika funktioner f0, f1, f2, f3 (orkar inte skriva upp dem, men det blir ju tämligen enkelt, bara summor av linjära funktioner och konstanter). Sen löser man fi(s) = s, och får noll, en eller två punkter där detta är uppfyllt. Noll punkter leder till att man aldrig klarar det, en till att det bara är där man kan uppfylla det, två till att hela det intervallet är ok. (Där kan man också hitta den punkt som ger maximal vinst.)
Tre eller fler punkter får man inte såvida man inte har negativa p_i.Sv:Intressant problem från jobbet
Du menar en affin funktion? http://sv.wikipedia.org/wiki/Affin_funktion
Hur får du nu fram lösningen, dvs det s som ger önskad marginal?Sv: Intressant problem från jobbet
Lösningen får man väl helt enkelt genom att lösa fi(s) = s, för varje intervall I_i, vilket oftast ger ett intervallSv:Intressant problem från jobbet
Kan du skriva lösningen mer utförligt?Sv: Intressant problem från jobbet
<citat>
Vi kallar nu a, b, c för a1, a2, a3, och p, q, r för p1,p2,p3.
</citat>
sen definierar vi brytpunkterna s1 = a1/p1, osv.
<citat>
Om vi nu flyttar om de olika talen så s1<s2<s3, så får vi fyra intervall.
[0, s1]
[s1, s2]
[s2, s3]
[s3, \inf]
</citat>
Så vi skiter i vem som får vad, det avgörs av kvoten ai/pi. Den som börjar bli linjär först heter a1, osv.
Så funktionen vi har är
f(s) = { f_1(s) om s \in [0 s1], f_2(s) om s \in [s1, s2], osv. }
Sen löser vi f(s) = s, ett steg i taget:
f_0(s) = s ?
f_0(s) = a1 + a2 + a3 = s
Alltså har vi en lösning där om a1+a2+a3 < s1.
f_1(s) = s ?
f_1(s) = p1 s + a2 + a3 = s ?
s(1-p1) = a2+a3
s = (a2+a3)/(1-p1)
om detta ligger i [s1, s2] så har vi en lösning där,
och vidare för f_2 har vi
s = a3 / (1-p1-p2) som måste ligga i [s2, s3]
för f_3 har vi bara lösningen s=0 om p1+p2+p3 != 1, annars har vi alla efterföljande som lösningar.Sv:Intressant problem från jobbet
Utgående från olikheten
max(p1 s, a1) + max(p2 s, a2) + max(p3 s, a3) <= s
drog jag efter en stund slutsatsen att följande åtta olikheter skall vara uppfyllda:
p1 s + p2 s + p3 s <= s
p1 s + p2 s + a3 <= s
p1 s + a2 + p3 s <= s
p1 s + a2 + a3 <= s
a1 + p2 s + p3 s <= s
a1 + p2 s + a3 <= s
a1 + a2 + p3 s <= s
a1 + a2 + a3 <= s
Ur dessa löser jag ut olikheter för s:
s >= 0 [under förutsättning att p1 + p2 + p3 <= 1]
s >= a3/(1-p1-p2)
s >= a2/(1-p1-p3)
s >= (a2+a3)/(1-p1)
s >= a1/(1-p2-p3)
s >= (a1+a3)/(1-p2)
s >= (a1+a2)/(1-p3)
s >= a1+a2+a3
Det minsta s som uppfyller dessa villkor ges av
s = max(
0,
a3/(1-p1-p2),
a2/(1-p1-p3),
(a2+a3)/(1-p1),
a1/(1-p2-p3),
(a1+a3)/(1-p2),
(a1+a2)/(1-p3),
a1+a2+a3
)
I det här fallet, när man har ett litet antal varianter, kan man ju skapa alla manuellt. Annars går det förstås även att skapa dem automatiskt.Sv: Intressant problem från jobbet
p1 s + a2 + p3 s <= s
p1 s + p2 s + a3 <= s
Kan ju aldrig finnas för samma tuppel (a1, a2, a3, p1, p2, p3)?Sv:Intressant problem från jobbet
Kan du hitta a1, a2, a3, p1, p2, p3 där min metod och din metod inte ger samma s?Sv: Intressant problem från jobbet
Så det är "typ" så att villkoren inte kan gälla samtidigt.
Jag tror det blir precis samma svar. Du gör mer så att du ritar upp 8 funktioner, och hela tiden väljer den maximala, medan jag ritar upp fyra funktioner på varsitt intervall, som motsvarar din "maximala".