diff options
-rw-r--r-- | Homeworks.md | 4 | ||||
-rw-r--r-- | src/act4e_solutions/currency_ex.py | 20 |
2 files changed, 21 insertions, 3 deletions
diff --git a/Homeworks.md b/Homeworks.md index e208388..57320d4 100644 --- a/Homeworks.md +++ b/Homeworks.md @@ -52,6 +52,6 @@ $ make docker-check ## Exercises for Nov. 20 -- [ ] TestSemiCategoryRepresentation -- [ ] TestCurrencyOptimization +- [X] TestSemiCategoryRepresentation +- [X] TestCurrencyOptimization - [ ] TestFinitePosetMinMax diff --git a/src/act4e_solutions/currency_ex.py b/src/act4e_solutions/currency_ex.py index c0b6b1b..fbb9775 100644 --- a/src/act4e_solutions/currency_ex.py +++ b/src/act4e_solutions/currency_ex.py @@ -9,4 +9,22 @@ class SolCurrencyOptimization(I.CurrencyOptimization): amount: float, target: str, ) -> I.OptimalSolution: - pass + source, target = available.get_object(source), available.get_object(target) + + results = {} + for l in range(available.objects().size() + 1): + paths = available.hom(source, target, l) + for p in paths.elements(): + # Allow to go through exchanges only once + names = p.label.split(";") + if any([names.count(n) > 1 for n in names]): + continue + + rate, commission = p.mordata.rate, p.mordata.commission + res = amount * rate - commission + results[res] = p + + final = max(results.keys()) + path = results[final].label.split(";") + return I.OptimalSolution(path, final) + |