Объединенный Открытый Проект - Сайт для Настоящих Компьютерщиков

Объединенный Открытый Проект

Сайт для Настоящих Компьютерщиков

; Логин:
  Пароль:
Обычный
Безопасный
Запомнить пользователя



Зарегистрироваться
Забыли пароль?
 
 
 
Объединенный Открытый Проект »   Прочее »   Форум поддержки прочих разработок »   Симплекс метод
RSS

Симплекс метод

дополнительные ограничения...

Текущий рейтинг темы: Нет

<<Назад  Вперед>>Печать
 
ALmaZiO
Новичок


Всего сообщений: 4
Рейтинг пользователя: 0





Дата регистрации на форуме:
12 дек. 2008
Можно ли добавить ограничения типа х1+х2+х3=1 и задать значение к примеру х2=0,5
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 2994
Рейтинг пользователя: 79





Дата регистрации на форуме:
29 сен. 2001
Точное равенство задается в виде двух ограничений: меньше или равно и больше или равно.
Т.е. для данного примера получаем:
x1+x2+x3<=1
x1+x2+x3>=1
x2<=0.5
x2>=0.5

---
Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
ALmaZiO
Новичок


Всего сообщений: 4
Рейтинг пользователя: 0





Дата регистрации на форуме:
12 дек. 2008
Дело в том, что непонятно, как в модуле симплекс метода для 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
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 2994
Рейтинг пользователя: 79





Дата регистрации на форуме:
29 сен. 2001
Сейчас перечитал документацию и вспомнил, что возможность задавать строгое равенство у меня в модуле предусмотрена. А вот с математикой у вас явно плохо.
Если перед 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
Ну да, я это же самое имел ввиду, по другому записал может не так корректно как ты.
Вобщем все как сказно выше создал программу (там задаётся 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
а есть вообще алгоритм или описание внутренней работы этого модуля.. ?
ALmaZiO
Новичок


Всего сообщений: 4
Рейтинг пользователя: 0





Дата регистрации на форуме:
12 дек. 2008
Можешь скачать тут в конце страницы сам модуль и в дэлфи просмотреть как там че работает.
fagot
Новичок


Всего сообщений: 1
Рейтинг пользователя: 0





Дата регистрации на форуме:
14 янв. 2011
Вопрос как вывести в edit точки решения ?
на сколько я понимаю за это отвечает Simplex.GetSolution
но как ее вывести в edit я не могу понять
E2010 Incompatible types: 'string' and 'TExtArray'
пишет такую ошибку - как перевести TExtArray в string
или любое другое решение
помогите оч нада!
StopGun
Новичок


Всего сообщений: 1
Рейтинг пользователя: 0





Дата регистрации на форуме:
10 мая 2011
Помогите, тоже не могу разобраться, у меня создана таблица на форме куда я вписываю руками значения ограничений ,коэффициентов и дт. мне нужно из таблицы как то эти значения передавать массив "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 исходники графической оболочки для симплекс метода буду очень благодарен!
<<Назад  Вперед>>Печать
Объединенный Открытый Проект »   Прочее »   Форум поддержки прочих разработок »   Симплекс метод
RSS
Быстрый переход в раздел:


Время выполнения скрипта: 0.0899. Количество выполненных запросов: 18, время выполнения запросов 0.0755