Смекни!
smekni.com

Решение задачи распределения капиталовложений (стр. 2 из 3)

3. Модифицировать хромосомы с помощью операций кроссинговера и мутации.

Это выглядит следующим образом:

Модификация кроссинговером:

· Определяем параметр

как вероятность этой модификации;

· Выявить родительские хромосомы. Для этого формируем случайное число r из (0,1), и если

, то данная хромосома выбирается как родительская. Процедуру повторяем pop_size раз для каждой хромосомы;

· В итоге имеем m родительских хромосом, если m нечетное, то m=m-1. И разбиваем их на пары:

;

· Затем для каждой пары формируется случайное число с из (0,1), и оператор кроссинговера действует следующим образом на родительскую пару:

, где X и Y – потомки, которые заменят своих родителей, если будут удовлетворять условиям задачи (если допустимое множество выпуклое, то это будет выполнено однозначно)

Модификация мутацией:

· Определяем параметр

как вероятность этой модификации;

· Как и в процессе отбора родительских хромосом для кроссинговера, выбираем родителей для мутации;

· Мутация производится следующим образом: пусть M – некоторое положительное число, выбираем направление мутации

случайным образом. Далее модифицируем хромосому
, где X – потомок. Если он удовлетворяет условию задачи, тогда проводится замена предка потомком, если же нет, то M выбирается случайным образом из (0,M), и операция повторяется, пока не будет достигнута допустимость

4. Вычислить целевые функции для всех хромосом с помощью статистического моделирования. Т.е зная нашу популяцию хромосом (вектор решений) мы можем вычислить значение каждого из отрицательных отклонений в нашем условии и проверить на допустимость ограничений.

5. Вычислить значения функции приспособленности для каждой хромосомы в соответствии со значениями целевых функций:

· Для этого мы должны расположить хромосомы начиная с наилучшей, зная значение lexmin(отрицательных отклонений), полученное на предыдущем шаге.

· Приспособленность каждой хромосомы вычисляется с помощью функции оценки, основанной на ранжировании;

· Каждой хромосоме ставим в соответствии значение функции:

6. Произвести селекцию хромосом, использую случайный выбор:

· Вычислить кумулятивную вероятность

для каждой хромосомы
:

· Сформировать случайное число r в интервале

· Выбрать i-ую хромосому

так, чтобы

· Повторить 2 и 3 шаги pop_size раз и получить pop_size экземпляров хромосом

7. Повторить шаги с 3 по 6 для заданного числа циклов.

8. Выбрать наилучшую хромосому как оптимальное решение.

Реализация алгоритма

Статистическое моделирование

1. Repeat //Внешний цикл

2. for i:=1 to n do

3. x[i]:=round(random); //Заполнение вектора решений

4. ifodz(x) then //Если удовлетворяет условию, то

5. fori:=1 tomdo //m-количество вероятностных ограничений

6. N1:=0;

7. for k:=1 to max_st_m do //max_st_m – количество цикловстат.модел.

8. if LogN(a,b)*x>=Expa(c) then N1:=N1+1; //a,b,c-коэф. распределения

9. Pr[i]:=N1/max_st_m; //Вычисления значения вероятности

10. until odz(x); //пока вектор решений не удовлетворит одз

Инициализацияхромосом

1. i:=1;

2. whilei<=pop_sizedo //пока не достигнут размер популяции

3. stat_model(x,Pr); //статистическое моделирование

4. hr[i]:=x; //присвоение хромосоме удачный результат

5. inc(i);

Процесс кроссинговера

1. j:=0;

2. fori:=1 topop_sizedo //цикл для выбора родительских хромосом

3. r:=random;

4. if r<=Pc then //Pc – коэфициент модификации

5. inc(j);

6. parent[j]:=hr[i]; //родитель найден

7. pos[j]:=i; //позиция родителя в популяции

8. if j-нечетное then j:=j-1;

9. i:=1;

10. While i<j do //циклкроссинговера

11. c:=random;

12. for k:=1 to n do

13. hr[pos[i],k]:=round(c*parent[i,k]+(1-c)*parent[i+1,k]); //модификация

14. hr[pos[i+1],k]:=round((1-c)*parent[i,k]+c*parent[i+1,k]); //модификация

15. i:=i+2;

Процесс мутации

1. j:=0;

2. for i:=1 to pop_size do //цикл выбора родительских хромосом

3. r:=random;

4. ifr<=Pmthen //Pm – коэффициент модификации

5. inc(j);

6. parent[j]:=hr[i]; //родитель найден

7. pos[j]:=i; //номер родителя в популйции

8. i:=1;

9. l:=0; //счетчик для выхода при плохом направлении

10. While i<=j do //циклмутации

11. inc(l);

12. for k:=1 to n do

13. c[k]:=random*power(-1,random); //формирование случайного направления

14. M:=random; //количество шагов в направлении

15. for k:=1 to n do parent[i,k]:=round(parent[i,k]+M*c[k]); //модификация

16. if odz(parent[i]) then //если новая хромосома удовлетворяет одз

17. hr[pos[i]]:=parent[i]; //она заменяет родителя

18. inc(i);

19. l:=0;

20. Else //если же нет, то

21. M:=random(M); // новое количество шагов <M

22. ifl>=10 theninc(i); //проверка счетчика на выход

Селекция хромосом

До этого нами уже была проведена сортировка хромосом и вычислена для каждой функция приспособленности (Eval):

1. for i:=1 to pop_size do //циклповсейпопуляции

2. q[i]:=0;

3. forj:=1 toidoq[i]:=q[i]+Eval[j]; //вычисление кумулятивной вероятности

4. forj:=1 topop_sizedo //новый цикл для определения новой популяции

5. r:=random*q[pop_size]; //определение номера хромосомы

6. i:=1;

7. while q[i]<=r do inc(i);

8. hr1[j]:=hr[i]; //переход одной хромосомы в новую популяцию

Пример реализации

В качестве примера было взято n=5 (количество станков), общая стоимость α=12500, размер склада b=500, вектор стоимости станков (300,800,700,900,1000), вектор площади станков (20,30,50,30,10). Вектор желаемого исхода (0.97, 0.95, 0.90). Количество циклов статистического моделирования равен 3000, генетического алгоритма - 400

Результат работы программы выглядит следующим образом:

X=(7,4,2,3,2) , общая стоимость = 11400, общая площадь = 470, вектор исходов (0.99, 0.95, 0,89)

Литература

1. Б. Лю. Теория и практика неопределенного программирования. - М.: Бином: Лаборатория знаний, 2005.

2. Iwamura, K and Liu, B., Dependet-chance integer programming applied to capital budgeting, Journal of the Operations Research Society of Japan, Vol.42, No. 2, 117-127, 1999.

3. Ермольев Ю.М. Методы стохастического программирования. – М.: Наука, 1976.

4. Юдин Д.Б. Задачи и методы стохастического программирования. – М.: Сов. радио, 1979.

5. Вентцель Е.С. Исследование операций. – М.: Сов. радио 1972.

6. Горбань А.Н. Обучение нейронных сетей. – М.: СП ПараГраф, 1990.

7. http://orsc.edu.cn/~liu

Приложение


program Gibrid;

uses

SysUtils,Math;

const max=10;

const Nmax=3000;

const pop_size=10;

const mu1=1;

const bt=4/3;

const ap=0.05;

const nu1=0.01;

Type koef=array [1..max] of real;

Type ves=array[1..max] of koef;

Type mis=array[1..Nmax] of real;

Type learn=array[1..Nmax,1..max] of real;

Type hromo=array[1..pop_size] of koef;

Type position=array[1..max]of integer;

var mu:real;

cost,sq:position;

d,ogr,dd,x:koef;

w0,w1,zn:ves;

max_st_m,gen_alg:integer;

function LogN(mu, sigma: real):real;

var u1,u2,y: real;

begin

randomize;

u1:=random;

u2:=random;

y:=sqrt(-2*ln(u1))*sin(2*Pi*u2);

y:=mu+sigma*y;

result:=exp(y);

end;

function Expa(sigma:real):real;

var u:real;

begin

randomize;

u:=random;

result:=-sigma*ln(u);

end;

procedure uslovie;

var i:integer;

begin

writeln('Input cost: ');

for i:=1 to 5 do

begin

write(i,' = ');

readln(cost[i]);

end;

write('Input max cost: ');

readln(ogr[1]);

writeln('Input square: ');

for i:=1 to 5 do

begin

write(i,' = ');

readln(sq[i]);

end;

write('Input max sq: ');

readln(ogr[2]);

writeln('Input fun result (0,1): ');

for i:=1 to 3 do

begin

write(i,' = ');

readln(d[i]);

end;

writeln;

for i:=1 to 5 do

if i<5 then write(cost[i],'*x[',i,']+')

else write(cost[i],'*x[',i,']= ');

writeln(ogr[1]);

writeln;

for i:=1 to 5 do

if i<5 then write(sq[i],'*x[',i,']+')

else write(sq[i],'*x[',i,']= ');

writeln(ogr[2]);

write('Input max iter of stat.model (0..3000) = ');

readln(max_st_m);

write('Input num of gen algoritm = ');

readln(gen_alg);

end;

function odz(x:koef):boolean;

var

j:integer;

summ1,summ2:real;

begin

summ1:=0;

for j:=1 to 5 do

summ1:=summ1+cost[j]*x[j];

summ2:=0;

for j:=1 to 5 do

summ2:=summ2+sq[j]*x[j];

if (summ1<=ogr[1]) and (summ2<=ogr[2]) and (x[1]>=0) and (x[2]>=0) and (x[3]>=0) and (x[4]>=0) and (x[5]>=0) then

result:=true

else result:=false;

end;

procedure stat_model(var x:koef; var dd:koef);

var

i,N1,k:integer;

begin

repeat

for i:=1 to 5 do

begin

randomize;

x[i]:=round(random*10);

end;

if odz(x) then

begin

N1:=0;

for k:=1 to max_st_m do

if LogN(3,1)*x[1]>=Expa(10) then N1:=N1+1;

dd[1]:=N1/max_st_m;

N1:=0;

for k:=1 to max_st_m do

if LogN(4,1.6)*x[2]>=Expa(15) then N1:=N1+1;

dd[2]:=N1/max_st_m;

N1:=0;

for k:=1 to max_st_m do

if (LogN(5,1.6)*x[3]>=Expa(20)) and (LogN(4,1.2)*x[4]>=Expa(18)) and (LogN(3,0.8)*x[5]>=Expa(16)) then N1:=N1+1;

dd[3]:=N1/max_st_m;

end;

until odz(x);

end;

procedure pech(hr:hromo);

var i,j:integer;

begin

for i:=1 to pop_size do

begin

for j:=1 to 5 do

write(hr[i,j]:4:2,' ');

writeln

end;

end;

procedure stat_res(x:koef; var dd:koef);

var

N1,k:integer;

begin

N1:=0;

for k:=1 to max_st_m do

if LogN(3,1)*x[1]>=Expa(10) then N1:=N1+1;

dd[1]:=N1/max_st_m;

N1:=0;

for k:=1 to max_st_m do

if LogN(4,1.6)*x[2]>=Expa(15) then N1:=N1+1;

dd[2]:=N1/max_st_m;

N1:=0;

for k:=1 to max_st_m do

if (LogN(5,1.6)*x[3]>=Expa(20)) and (LogN(4,1.2)*x[4]>=Expa(18)) and (LogN(3,0.8)*x[5]>=Expa(16)) then N1:=N1+1;

dd[3]:=N1/max_st_m;

end;

procedure init(var hr:hromo);

var i,j:integer;

dd:koef;

begin

i:=1;

while i<=pop_size do

begin

stat_model(x,dd);

for j:=1 to 5 do hr[i,j]:=x[j];

inc(i);

end;

end;

procedure cross(var hr:hromo);

var i,j,k:integer;

r,c:real;

parent:hromo;