So I’m running NMaximize
for optimizing a value and for constraints, I need the parameters to belong to a discrete set of elements. Basically, the constraint looks like,
And @@Table({Subscript(x, i), Subscript(y, i)} (Element) Table(Subscript(e, i, n), {i, 1, n}),{i, 1, k})
,where {Subscript(x, i), Subscript(y, i)}
are my parameters satisfying the constraint that they should belong to Table(Subscript(ex, i, n), {i, 1, n})
But NMaximize
do not consider this as a constraint. Then I changed the constraint to the convex hull of Table(Subscript(ex, i, n), {i, 1, n})
with an additional constraint to pick out the extreme points aka the vertices. Now my code looks like,
And @@ Table({Subscript(x, i), Subscript(y, i)} (Element)
ConvexHullMesh(Table(Subscript(ex, i, n), {i, 1, n})) &&
Subscript(z, i) == 1/2 &&
Subscript(x, i)^2 + Subscript(y, i)^2 == Subscript(r, n)/2, {i, 1,
k})
But, when I run this it outputs this error
Obtained solution does not satisfy the following constraints within
Tolerance -> 0.001`
What do I do?
FULL CODE
Subscript(r, n_) := Sqrt(Sec(Pi/n));
Subscript(w, i_,
n_) := {Subscript(r, n) Cos(2 Pi i/n),
Subscript(r, n) Sin(2 Pi i/n), 1};
Subscript(e, i_, n_) :=
1/2 {Subscript(r, n) Cos((2 i - 1) Pi/n),
Subscript(r, n) Sin((2 i - 1) Pi/n), 1};
Subscript(ex, i_, n_) :=
1/2 {Subscript(r, n) Cos((2 i - 1) Pi/n),
Subscript(r, n) Sin((2 i - 1) Pi/n)};
u = {0, 0, 1};
f = (u - #) &;
(*Factors={1,2,3,12,13,23,123}*)
Factors = Times @@@ Subsets(Transpose@Tuples({1, -1}, 3), {1, 3});
(*Rearrange*)
(*Rearrange the numbers in the RHS to obtain different
combinations*)
Factors(({1, 2, 3, 4, 5, 6, 7})) = Factors(({1, 2, 3, 4, 5, 6, 7}));
Factors = Transpose(Factors);
Vec(j_) := {Subscript(x, j), Subscript(y, j), Subscript(z, j)};
AllParameters(k_) :=
Module({i},
Flatten(Table({Subscript(x, i), Subscript(y, i), Subscript(z,
i)}, {i, 1, k})));
AllConstraints(n_, k_) :=
Module({i},
And @@ Table({Subscript(x, i), Subscript(y, i)} (Element)
ConvexHullMesh(Table(Subscript(ex, i, n), {i, 1, n})) &&
Subscript(z, i) == 1/2 &&
Subscript(x, i)^2 + Subscript(y, i)^2 == Subscript(r, n)/2, {i,
1, k}));
GPT(n_, k_) := Module({ro, co, ve, i},
FunFactor = Factors((1 ;; 8, 1 ;; k)) /. {1 -> Identity, -1 -> f};
vec = Table(Subscript(v,
i), {i, 1, k}) /. {Subscript(v, j_) -> Vec(j)};
vecs = Table(
Total(Table(FunFactor((ro, co))(vec((co))), {co, 1, k})), {ro, 1,
8});
max = Total(
Table(Max(
Map(vecs((ve)).# &, Table(Subscript(w, i, n), {i, 1, n}))), {ve,
1, 8}));
{time, out} =
Timing(NMaximize({max, AllConstraints(n, k)}, AllParameters(k),
Method -> "NelderMead"));
Print(out, out((1))/(k 8), " ", time); {time, out} =
Timing(NMaximize({max, AllConstraints(n, k)}, AllParameters(k),
Method -> "DifferentialEvolution"));
Print(out, out((1))/(k 8), " ", time); {time, out} =
Timing(NMaximize({max, AllConstraints(n, k)}, AllParameters(k),
Method -> "SimulatedAnnealing"));
Print(out, out((1))/(k 8), " ", time);)
GPT(4, 7)