代数方程式のプログラミング
-
22-07-2019 - |
質問
別の投稿で、MSNは私の代数問題を解決するための良いガイドをくれました(計算合計費用からの入札価格)。今では、手で計算できますが、これを擬似コードまたはコードで記述する方法に完全にこだわっています。誰でも簡単なヒントをくれますか?ちなみに、最終コストを考慮して入札単価を計算します。
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
解決
関数は次のように単純化されます:
/ 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
各ピースを個別の機能とみなす場合、それらを逆にすることができます:
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
費用を各機能に差し込むと、その範囲の推定入札価格が得られます。この値が実際にその関数の有効範囲内にあることを確認する必要があります。
例:
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!
元の関数は厳密に増加しているため、これらの関数の最大1つで許容値が得られます。しかし、いくつかの入力では、どれも良い値を与えません。これは、元の関数がこれらの値をジャンプするためです。
final cost(1000) = 1.02 * 1000 + 160 = 1180
final cost(1001) = 1.02 * 1001 + 165 = 1186
したがって、たとえばcost = 1182
に許容値を与える関数はありません。
他のヒント
PIN
とceiling
を使用しているため、簡単に計算を反転させる方法がありません。 bid
の精度が固定されていると仮定すると(ドットの後ろに小数点以下2桁があると思います)、常にバイナリ検索を使用できます(関数は単調です)。
編集:もう少し考えた後、x = bid*1.02 + 100
をとると、最終コストがx + 15(排他的)からx + 70(包括的)(つまりx+15 < final cost < x+70
)の間になることがわかりました。この範囲のサイズ(70-15=55
)とx+15 = final cost
の特別な値(以下の注を参照)がこれよりもすべて離れているという事実を考えると、x+70 = final cost
と222
を取り、正しいケースを取得することができます/使用量と追加コストの値を計算し、単純にその方程式を解きます(x+15 = 222
またはbid = 107/1.02 = 104.90
が含まれなくなりました)。
説明のために、最終コストをbid*0.1
とします。 5
からfinal cost = bid*0.1 + bid*0.02 + 5 + 100 + bid = bid*1.12 + 105
になります。次に、使用コストはbid = (222-105)/1.12 = 104.46
で指定され、追加コストはx+70 = 222
であることがわかります。つまり、bid = 52/1.02 = 50.98
、したがって10
を取得します。このfinal costs = 10 + bid*0.02 + 5 + 100 + bid = bid*1.02 + 115
の値は、適切な使用量と追加コストが取られたことを意味するため、これが解決策であることはわかっています。
ただし、最初にbid = (222-115)/1.02 = 104.90
を見ると、次のようになります。最初に、104.90
というこの仮定に対してそれを取得します。つまり、使用コストは100
であり、追加コストは500
です。したがって、50
、したがって<=>を取得します。ただし、<=>が<=>の場合、使用コストは<=>ではなく<=>であるため、これは正しい解決策ではありません。
これを十分に明確に説明してほしい。そうでない場合は、お知らせください。
N.B .:特別な値とは、使用量と追加コストの値を定義する関数が変更される値を意味します。たとえば、使用コストの場合、これらの値は<=>および<=>です。<=>未満は<=>を使用し、上記<=>は<=>を使用し、その間は<=>を使用します。