Возможности DirectSearch

Форум пользователей пакета Maple

Модератор: Admin

Markiyan Hirnyk
Сообщения: 1348
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Возможности DirectSearch

Сообщение Markiyan Hirnyk » Чт окт 10, 2019 1:12 pm

На форуме MaplePrimes был задан вопрос. Отвечая на него, так называемый tomleslie заявил, что этот результат невозможно получить, применяя DirectSearch и привел свою попытку. Это высказывание весьма квалифицированного (судя по его коду) пользователя не соответствует действительности и вызывает удивление. Трудность для DS состоит в том, что одно из ограничений является равенством. Это можно преодолеть следующим образом: заменяем равенство двумя нестрогими неравенствами и в одном из них правую часть уменьшаем на 10^(-14) и решаем такую задачу. Вот измененное место в коде пользователя tomleіlie и его результат в Мэйпле 2017.3.

Код: Выделить всё

with(DirectSearch):   
 wrapper:=proc()     
 global L, data;   
 OmegaRatio(L, data, [_passed])   
 end proc:   
ansGlobal:=GlobalOptima( wrapper(seq(w[i],i=1..10)),  [add(w[i],i=1..N)<=1,add(w[i],i=1..N)>=1-10^(-14),seq(w[i]=0...1,i=1..N)],                                                       maximize,number=500 ,evaluationlimit=20000,tolerances=10^(-12) ); 
 ansGlobal := [6.11957702166351, [w[1] = 0.810264943414942e-2, w[2] = 7.49181834607117*10^(-18), w[3] = 0.389145044771230e-2, w[4] = .328057699909902, w[5] = 0.127647049260357e-1, w[6] = 0.201390645020281e-1, w[7] = .610658399815133, w[8] = 2.41175606800840*10^(-6), w[9] = 0.402833526370982e-2, w[10] = 0.123552839452518e-1], 1049]

Подставляя ответ в ограничения, получаем

Код: Выделить всё

eval([add(w[i],i=1..N)<=1,add(w[i],i=1..N)>=1,seq(w[i]=0...1,i=1..N)],[w[1] = 0.810264943414942e-2, w[2] = 7.49181834607117*10^(-18), w[3] = 0.389145044771230e-2, w[4] = .328057699909902, w[5] = 0.127647049260357e-1, w[6] = 0.201390645020281e-1, w[7] = .610658399815133, w[8] = 2.41175606800840*10^(-6), w[9] = 0.402833526370982e-2, w[10] = 0.123552839452518e-1]);
[1.000000000 <= 1, 1 <= 1.000000000, 0.810264943414942e-2 = 0 .. 1, 7.491818346*10^(-18) = 0 .. 1, 0.389145044771230e-2 = 0 .. 1, .328057699909902 = 0 .. 1, 0.127647049260357e-1 = 0 .. 1, 0.201390645020281e-1 = 0 .. 1, .610658399815133 = 0 .. 1, 2.411756068*10^(-6) = 0 .. 1, 0.402833526370982e-2 = 0 .. 1, 0.123552839452518e-1 = 0 .. 1]

, т.е. ограничения выполнены с большой точностью. Ответ DS является неплохим приближением к ответу

Код: Выделить всё

w[1] = 0., w[2] = 0., w[3] = 0., w[4] = .409790222161672, w[5] = 0., w[6] = .219617381328148, w[7] = .333211183439266, w[8] = 0., w[9] = 0., w[10] = 0.373812133486924e-1
, полученному другим путем, со значением целевой функции 6.97971754550025. Понятно, что решение DS
можно еще улучшить, уменьшая зазор 10^(-14). Прилагаю файл с выполненным кодом через Дропбокс. Было бы весьма любезно со стороны участников этого форума, например Kitonum, представить это на MaplePrimes. Я лишен такой возможности.