I defined a function that could help;
KTEqs[obj_, cons_List, vars_] :=
Module[{consconvrule = {GreaterEqual[x_, y_] -> LessEqual[y - x, 0],
Equal[x_, y_] -> Equal[x - y, 0],
LessEqual[x_, y_] -> LessEqual[x - y, 0],
LessEqual[lb_, x_, ub_] -> LessEqual[(x - lb) (x - ub), 0],
GreaterEqual[ub_, x_, lb_] -> LessEqual[(x - lb) (x - ub), 0]}
, stdcons, eqcons, ineqcons, lambdas, mus, lagrangian, eqs1, eqs2,
eqs3, alleqns, allvars },
stdcons = cons /. consconvrule;
eqcons = Cases[stdcons, Equal[_, 0]][[All, 1]];
ineqcons = Cases[stdcons, LessEqual[_, 0]][[All, 1]];
lambdas = Array[\[Lambda], Length[eqcons]];
mus = Array[\[Mu], Length[ineqcons]];
lagrangian = obj + lambdas.eqcons + mus.ineqcons;
eqs1 = Thread[ D[lagrangian, {vars}] == 0];
eqs2 = Thread[mus >= 0];
eqs3 = Thread[mus*ineqcons == 0];
alleqns = Join[eqs1, eqs2, eqs3, cons];
allvars = Join[vars, lambdas, mus];
{alleqns, allvars}
]
KTMinimize[obj_, cons_List, vars_List] :=
Block[{kteqs, r, rls, objvals, minobj, objrls, res},
kteqs = KTEqs[obj, cons, vars];
r = LogicalExpand @
Reduce[Sequence @@ kteqs, Backsubstitution -> True,
Cubics -> True, Quartics -> True];
If[Head[r] === And,
rls = List @@ ToRules[r];
objvals = obj /. rls;
res = {objvals, rls},
(* Else *)
rls = List @@ (ToRules /@ r);
objvals = obj /. rls;
minobj = Min[objvals];
objrls = Thread[{objvals, rls}];
res = Select[objrls, #[[1]] == minobj &];
If[Length[res] == 1, res = res[[1]]];
];
res
]
In[3]:= AbsoluteTiming[
KTMinimize[-1000000/100*(25*b + 75*c + 100*(1 - a - b - c)), {a >= 0,
b >= 0, c >= 0,
a^101 + 101*a^100*b + 101*a^100*c + 101*100*a^99*b*c +
50*100*a^99*b^2 >= 1/20}, {a, b, c}] // N]
Out[3]= {3.48344, {-35843.9, {a -> 0.953819, b -> 0.00444532,
c -> 0.028011, \[Mu][1.] ->
3.42892*10^-10, \[Mu][2.] -> -5.08376*10^-10, \[Mu][3.] ->
5.66923*10^-10, \[Mu][4.] -> 190922.}}}