0
$\begingroup$

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]
$\endgroup$
1
  • $\begingroup$ Replace Subscript[w, i_, n_] to w[i_,n_] etc. maybe easy to handle this problem. $\endgroup$ – cvgmt Jan 28 at 23:57

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.