Симплекс методдополнительные ограничения...
Текущий рейтинг темы: Нет
| ALmaZiO
Новичок
Всего сообщений: 4 Рейтинг пользователя: 0
Дата регистрации на форуме: 12 дек. 2008
|
Профиль | ИгнорироватьNEW! Сообщение отправлено: 12 декабря 2008 3:00
Можно ли добавить ограничения типа х1+х2+х3=1 и задать значение к примеру х2=0,5 | | | |
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
 Откуда: Москва Всего сообщений: 3031 Рейтинг пользователя: 75 Дата регистрации на форуме: 29 сен. 2001
|
Профиль | ИгнорироватьNEW! Сообщение отправлено: 12 декабря 2008 11:41
Точное равенство задается в виде двух ограничений: меньше или равно и больше или равно. Т.е. для данного примера получаем: x1+x2+x3<=1 x1+x2+x3>=1 x2<=0.5 x2>=0.5
--- Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
| | | |
| ALmaZiO
Новичок
Всего сообщений: 4 Рейтинг пользователя: 0
Дата регистрации на форуме: 12 дек. 2008
|
Профиль | ИгнорироватьNEW! Сообщение отправлено: 15 декабря 2008 18:39
Дело в том, что непонятно, как в модуле симплекс метода для delphi 7 вот тут исходник осуществить эти дополнительные ограничения, Судя по коду, ограничения вводятся из коэффициентов А(n,m) и B(m), вопрос заключается в том,как вывести количественные значения по нахождении минимума каждого Х(n) в любом виде (желательно в долях), и, если ограничивается один из X каким-то значением, например, 50% Вот мои мысли L=L[1]*x1+L[2]*x2+ .... +L[n]*xn----> min при ограничениях: A1[1]*x1+A1[2]*x2+....+A1[n]*xn <=> B1 ..................... Am[1]*x1+Am[2]*x2+....+Am[n]*xn <=> Bm Как задать эти 4 ограничения, если в модуле задаются только коэффициенты A(m,n), B(m)? Где n - номер столбца, m - номер строки; В случае дополнительных ограничений вида: x1+x2+x3=1 x2=0.5 Вводятся два дополнительных ограничения: 1) будут введены новые элементы массива для A(m,n),B(m) равные 1, и условие equal. 2) A(m,1)=A(m,3)=0,а A(m,2)=1, B(m)=0,5, и условие equal. А где взять решение каждого X(n) загадка и надо их вывести в label... | | | |
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
 Откуда: Москва Всего сообщений: 3031 Рейтинг пользователя: 75 Дата регистрации на форуме: 29 сен. 2001
|
Профиль | ИгнорироватьNEW! Сообщение отправлено: 15 декабря 2008 19:53
Сейчас перечитал документацию и вспомнил, что возможность задавать строгое равенство у меня в модуле предусмотрена. А вот с математикой у вас явно плохо. Если перед x1 не стоит коэффициента, то это означает, что коэффициент равен единице. Если какого-то X нет в выражении, то коэффициент перед ним равен нулю. Т.е. для первого равенства A=(1,1,1), B=1 Для второго — A=(0,1,0), B=0.5 Важно: функцию AddCons нужно вызывать для каждого условия отдельно.
Т.е. программа в целом сводится к следующей последовательности: сначала создаешь объект конструктором Create задаешь первое ограничение с помощью метода AddCons задаешь второе ограничение с помощью AddCons выполняешь собственно оптимизацию с помощью метода Solve Проверяешь, что тебе вернул Solve. Если значение SIMPLEX_DONE, то все хорошо, решение найдено. Решение можно получить с помощью функции GetSolution.
--- Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
| | | |
| ALmaZiO
Новичок
Всего сообщений: 4 Рейтинг пользователя: 0
Дата регистрации на форуме: 12 дек. 2008
|
Профиль | ИгнорироватьNEW! Сообщение отправлено: 16 декабря 2008 0:36 Сообщение отредактировано: 22 декабря 2008 13:48
Ну да, я это же самое имел ввиду, по другому записал может не так корректно как ты. Вобщем все как сказно выше создал программу (там задаётся 14 ограничений: x1+x2+x3+x4+x5+x6=1 x3=0,5 A1x1+A2x2+A3x3+A4x4+A5x5+A6x6<E1 A1x1+A2x2+A3x3+A4x4+A5x5+A6x6<E2 A1x1+A2x2+A3x3+A4x4+A5x5+A6x6<E3 A1x1+A2x2+A3x3+A4x4+A5x5+A6x6<E4 A1x1+A2x2+A3x3+A4x4+A5x5+A6x6<E5 A1x1+A2x2+A3x3+A4x4+A5x5+A6x6<E6 A1x1+A2x2+A3x3+A4x4+A5x5+A6x6<E7 A1x1+A2x2+A3x3+A4x4+A5x5+A6x6>E8 A1x1+A2x2+A3x3+A4x4+A5x5+A6x6>E9 A1x1+A2x2+A3x3+A4x4+A5x5+A6x6>E10 A1x1+A2x2+A3x3+A4x4+A5x5+A6x6>E11 A1x1+A2x2+A3x3+A4x4+A5x5+A6x6>E12 E1:=0.9;E2:=0.8;E3:=11.5;E4:=0;E5:=0;E6:=0; E7:=1.4;E8:=1;E9:=15;E10:=0.05;E11:=0.12;E12:=1;E13=0,5
Z_1:=54; C_1:=0.34; Si_1:=0; Mn_1:=0.195; S_1:=0.036; P_2:=0.025; Cr_1:=0.5; Z_2:=85; C_2:=3.83; Si_2:=0; Mn_2:=0.375; S_2:=0.045; P_2:=0.075; Cr_2:=0.015; Z_3:=80; C_3:=1.02; Si_3:=0; Mn_3:=3.9; S_3:=0.036; P_3:=0.05; Cr_3:=1; Z_4:=205; C_4:=0; Si_4:=69.3; Mn_4:=0.38; S_4:=0.01; P_5:=0.045; Cr_4:=0.3; Z_5:=359; C_5:=1.5; Si_5:=2.25; Mn_5:=80.75; S_5:=0.015; P_5:=0.027; Cr_5:=0; Z_6:=245; C_6:=7; Si_65:=0.9; Mn_6:=71.25; S_6:=0.015; P_6:=0.09; Cr_6:=0; setlength(A,6); A[0]:=Z_1; A[1]:=Z_2; A[2]:=Z_3; A[3]:=Z_4; A[4]:=Z_5; A[5]:=Z_6; setlength(A1,6); A1[0]:=C_1; A1[1]:=C_2; A1[2]:=C_3; A1[3]:=C_4; A1[4]:=C_5; A1[5]:=C_6; setlength(A2,6); A2[0]:=Si_1; A2[1]:=Si_2; A2[2]:=Si_3; A2[3]:=Si_4; A2[4]:=Si_5; A2[5]:=Si_6; setlength(A3,6); A3[0]:=Mn_1; A3[1]:=Mn_2; A3[2]:=Mn_3; A3[3]:=Mn_4; A3[4]:=Mn_5; A3[5]:=Mn_6; setlength(A4,6); A4[0]:=S_1; A4[1]:=S_2; A4[2]:=S_3; A4[3]:=S_4; A4[4]:=S_5; A4[5]:=S_6; setlength(A5,6); A5[0]:=P_1; A5[1]:=P_2; A5[2]:=P_3; A5[3]:=P_4; A5[4]:=P_5; A5[5]:=P_6; setlength(A6,6); A6[0]:=Cr_1; A6[1]:=Cr_2; A6[2]:=Cr_3; A6[3]:=Cr_4; A6[4]:=Cr_5; A6[5]:=Cr_6; setlength(X,6); X[0]:=1; X[1]:=1; X[2]:=1; X[3]:=1; X[4]:=1; X[5]:=1; setlength (X1,6); X1[0]:=0; X1[1]:=0; X1[2]:=1; X1[3]:=0; X1[4]:=0; X1[5]:=0;
Simplex.AddCons(E1,A1,greater); Simplex.AddCons(E2,A2,greater); Simplex.AddCons(E3,A3,greater); Simplex.AddCons(E4,A4,greater); Simplex.AddCons(E5,A5,greater); Simplex.AddCons(E6,A6,greater); Simplex.AddCons(E7,A1,less); Simplex.AddCons(E8,A2,less); Simplex.AddCons(E9,A3,less); Simplex.AddCons(E10,A4,less); Simplex.AddCons(E11,A5,less); Simplex.AddCons(E12,A6,less); Simplex.AddCons(1,X,equal); Simplex.AddCons(E13,X1,equal); и дело в том, что я не пойму, что GetSolution находит именно. Это самое главное мне нужно получить все X(i) и вполне возможно какой-то икс при минимуме будет равен 0, но в этом случае програма выводит неверный результат... В добавок ко всему, если ввести ограничения x1+x2+x3+x4+x5+x6=1 x3=0,5, то GetSolution значения не изменит от значения, что находилось без этих двух ограничений :(
| | | |
| F4RR3LL
Новичок
Всего сообщений: 1 Рейтинг пользователя: 0
Дата регистрации на форуме: 2 янв. 2009
|
Профиль | ИгнорироватьNEW! Сообщение отправлено: 3 января 2009 17:39
а есть вообще алгоритм или описание внутренней работы этого модуля.. ? | | | |
| ALmaZiO
Новичок
Всего сообщений: 4 Рейтинг пользователя: 0
Дата регистрации на форуме: 12 дек. 2008
|
Профиль | ИгнорироватьNEW! Сообщение отправлено: 8 января 2009 19:06
| | | |
| fagot
Новичок
Всего сообщений: 1 Рейтинг пользователя: 0
Дата регистрации на форуме: 14 янв. 2011
|
Профиль | ИгнорироватьNEW! Сообщение отправлено: 14 января 2011 6:50
Вопрос как вывести в edit точки решения ? на сколько я понимаю за это отвечает Simplex.GetSolution но как ее вывести в edit я не могу понять E2010 Incompatible types: 'string' and 'TExtArray' пишет такую ошибку - как перевести TExtArray в string или любое другое решение помогите оч нада! | | | |
| StopGun
Новичок
Всего сообщений: 1 Рейтинг пользователя: 0
Дата регистрации на форуме: 10 мая 2011
|
Профиль | ИгнорироватьNEW! Сообщение отправлено: 14 мая 2011 18:45
Помогите, тоже не могу разобраться, у меня создана таблица на форме куда я вписываю руками значения ограничений ,коэффициентов и дт. мне нужно из таблицы как то эти значения передавать массив "L" который используется здесь- "Simplex:=TSimplex.Create(L,false);" эт конечно если я все правильно понял. Я делаю цикл begin for col := 1 to col-3 do //здесь указываю нужные ячейки begin L:=(); // не могу понять как обратиться к нужному элементу массива и передать ему значение ячейки, string ,integer ему не нравятся! end; Simplex:=TSimplex.Create(L,false); если возможно вышлете сюда Stopguns@mail.ru исходники графической оболочки для симплекс метода буду очень благодарен! | | | |
Время выполнения скрипта: 0.4238. Количество выполненных запросов: 18, время выполнения запросов 0.1688
|