La programmation d'une équation algébrique

voix
2

dans un autre poste, MSN m'a donné un bon guide sur la résolution de mon problème d'algèbre ( Calcul de prix de l' offre du coût total ). Maintenant, même si je peux calculer la main, je suis complètement coincé sur la façon d'écrire ceci dans pseudocode ou un code. Quelqu'un pourrait me donner une idée rapide? Soit dit en passant, je veux calculer l'offre , compte tenu des coûts finaux.

usage cost(bid) = PIN(bid*0.10, 10, 50)
seller cost(bid) = bid*.02
added cost(bid) = PIN(ceiling(bid/500)*5, 5, 10) + PIN(ceiling((bid - 1000)/2000)*5, 0, 10)
storing cost(bid) = 100
So the final cost is something like:

final cost(bid) = PIN(bid*.1, 10, 50) + pin(ceiling(bid/500)*5, 5, 20) + PIN(ceiling((bid - 1000)/2000)*10, 0, 20) + bid*.02 + 100 + bid
Solve for a particular value and you're done.

For example, if you want the total cost to be $2000:

2000 = PIN(bid*.1, 10, 50) + pin(ceiling(bid/500)*5, 5, 10) + PIN(ceiling((bid - 1000)/2000)*5, 0, 10) + bid*.02 + 100 + bid.
Bid must be at least > 1500 and < 2000, which works out nicely since we can make those PIN sections constant:

2000 = 50 + 10 + 5 + 100 + bid*1.02
1835 = bid*1.02
bid = 1799.0196078431372549019607843137
Créé 13/03/2009 à 02:08
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

En raison de l'utilisation de PINet ceiling, je ne vois pas un moyen facile d'inverser le calcul. En supposant que bida une précision fixe (je suppose que deux décimales derrière le point) , vous pouvez toujours utiliser une recherche binaire (comme les fonctions sont monotones).

Edit: Après y avoir réfléchi un peu plus, je remarquai que, compte x = bid*1.02 + 100, nous avons que les coûts finaux sont entre x + 15 (exclusive) et x + 70 (inclus) (c. -à x+15 < final cost < x+70). Compte tenu de la taille de cette gamme ( 70-15=55) et le fait que les valeurs particulières (voir note ci - dessous) bidsont tous à part plus que cela, vous pouvez prendre x+15 = final costet x+70 = final cost, obtenir les cas droite / valeurs d'utilisation et des coûts supplémentaires et de résoudre simplement que l' équation ( qui ne possède plus ni PINou ceilingen elle).

Pour illustrer, que le coût final soit 222. De x+15 = 222ce qui suit bid = 107/1.02 = 104.90. Ensuite , nous avons que les coûts d'utilisation sont données par bid*0.1et que les coûts supplémentaires sont 5. En d' autres termes, nous obtenons final cost = bid*0.1 + bid*0.02 + 5 + 100 + bid = bid*1.12 + 105donc bid = (222-105)/1.12 = 104.46. Comme cette valeur des bidmoyens les bonnes valeurs pour l' utilisation et les coûts supplémentaires ont été prises, nous savons que c'est la solution.

Cependant, si nous avons d' abord regardé x+70 = 222, nous obtiendrions ce qui suit. D' abord , nous obtenons que cette hypothèse bid = 52/1.02 = 50.98. Cela signifie que les coûts d'utilisation sont 10et les coûts supplémentaires sont 5. Nous obtenons donc final costs = 10 + bid*0.02 + 5 + 100 + bid = bid*1.02 + 115et donc bid = (222-115)/1.02 = 104.90. Mais si bidest 104.90alors les coûts d'utilisation ne sont pas , 10mais bid*0.1, donc ce n'est pas la bonne solution.

J'espère que je l'ai expliqué assez clairement. Sinon, s'il vous plaît laissez-moi savoir.

NB: Avec des valeurs spéciales je veux dire ceux pour lesquels la fonction définissant les valeurs d'utilisation et les coûts supplémentaires changent. Par exemple, pour le coût d'utilisation de ces valeurs sont 100et 500: ci - dessous 100vous utilisez 10, au- dessus que 500vous utilisez 50et entre vous utilisez bid*0.1.

Créé 13/03/2009 à 02:47
source utilisateur

voix
3

La fonction simplifie à:

                  / 1.02 * bid + 115   bid <   100
                  | 1.12 * bid + 105   bid <=  500
final cost(bid) = | 1.02 * bid + 160   bid <= 1000
                  | 1.02 * bid + 165   bid <= 3000
                  \ 1.02 * bid + 170   otherwise

Si l'on considère chaque pièce en fonction séparée, ils peuvent être inversées:

bid_a(cost) = (cost - 115) / 1.02
bid_b(cost) = (cost - 105) / 1.12
bid_c(cost) = (cost - 160) / 1.02
bid_d(cost) = (cost - 165) / 1.02
bid_e(cost) = (cost - 170) / 1.02

Si vous branchez votre coût dans chaque fonction que vous obtenez une valeur de l'offre estimée pour cette plage. Vous devez vérifier que cette valeur est bien dans que les fonctions plage valide.

Exemple:

cost = 2000

bid_a(2000) = (2000 - 115) / 1.02 = 1848  Too big! Need to be < 100
bid_b(2000) = (2000 - 105) / 1.12 = 1692  Too big! Need to be <= 500
bid_c(2000) = (2000 - 160) / 1.02 = 1804  Too big! Need to be <= 1000
bid_d(2000) = (2000 - 165) / 1.02 = 1799  Good. It is <= 3000
bid_e(2000) = (2000 - 170) / 1.02 = 1794  Too small! Need to be > 3000

Just to check:

final cost(1799) = 1.02 * 1799 + 165 = 2000   Good!

Étant donné que la fonction d'origine est strictement croissante, au plus une de ces fonctions donnera une valeur acceptable. Mais pour certaines entrées aucun d'entre eux donnera une bonne valeur. En effet, la fonction d'origine saute sur ces valeurs.

final cost(1000) = 1.02 * 1000 + 160 = 1180
final cost(1001) = 1.02 * 1001 + 165 = 1186

Donc , pas de fonction donnera une valeur acceptable pour cost = 1182par exemple.

Créé 13/03/2009 à 03:32
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more