MOD for optimization variable
古いコメントを表示
Hi,
I have to optimize matrix to obtain quantities that will be divisible by certain numbers. When I use MOD on numbers, it works fine, for example MOD(10,3)=1. However, when I try to create constraint that I want my optimization variable x to be divisible by let's say 3 MOD(x,3), I get an error
Undefined function 'mod' for input arguments of type 'optim.problemdef.OptimizationVariable'.
Is there anything I can do to solve this issue?
Thanks in advance.
採用された回答
その他の回答 (1 件)
Walter Roberson
2019 年 8 月 22 日
2 投票
Introduce an extra integer variable and constrain equality x-3*extra = 1
4 件のコメント
annazy
2019 年 8 月 23 日
Walter Roberson
2019 年 8 月 23 日
For a definitive answer as to whether there is any way to make mod() work, you will need to open a support case with Mathworks. Perhaps they have an in-house implementation that they might be willing to let you experiment with; I do not know.
What I do know is that there is no mod() available for optimization variables in any released version.
"I can't influence on values of x with some random integers as I have other requirements to be met :( "
I suspect you do not understand the process.
Suppose that you have a value of x = 16 and you want to check whether mod(x,3)=1 . If so, then by definition, there must be some integer N (that is not necessarily positive) such that 3*N+1 = x . This is not a "random integer": for 16 it is satisfied only by N = 5, 3*5 + 1 = 16. Likewise, if there is no integer N such that 3*N+1 = x, then mod(x,3)=1 is not true -- for example, for x = 17, then there is no such integer N.
Therefore if you introduce an integer-constrained variable N into the process and put in the equality constraint 3*N+1 = x, or 1 = x - 3*N or x - 3*N = 1 then N will not be random: it will be the exact integer needed such that 3*N+1 = x. You would not use the value of N in the calculation of your objective: it is enough to know that the constraint was met that there is some integer N such that x - 3*N = 1 is true.
annazy
2019 年 8 月 24 日
Walter Roberson
2019 年 8 月 24 日
Yes, N=optimvar('N','Type','integer') is good.
If you have upper and/or lower bound on x then you can use it to figure out upper and lower bounds on N to make the optimization more efficient.
カテゴリ
ヘルプ センター および File Exchange で Loops and Conditional Statements についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!