Вопрос № 176652: Здравствуйте, проблема такова. У меня Free Pascal и исполняемая программа, так вот при исполнении программы выводится много информации которая не помешается на экран а отображается только то что на самом экране(последние строки), т.е нет прокрутки а...
Вопрос № 176652:
Здравствуйте, проблема такова. У меня Free Pascal и исполняемая программа, так вот при исполнении программы выводится много информации которая не помешается на экран а отображается только то что на самом экране(последние строки), т.е нет прокрутки а надо посмотреть все что есть. Как это сделать, в настройках покрутить или как?
Отвечает Сучкова Татьяна Михайловна, Администратор :
Здравствуйте, Hivrenko. Как тут уже предложил Зенченко К.Н., давайте организуем вывод в файл. В данном случае это будет текстовый файл rez.dat и лежать он будет в корне диска d. Путь можете поменять на удобный Вам, изменив путь к файлу в строке assign(fl1,'d:\rez.dat'); в начале Главной программы. Смотреть его можно, открыв в Блокноте.
Код:
program sga; uses crt;
const maxpop = 100; maxstring = 30; dim = 2; {размерность пространства поиска}
type allele = boolean; {Алель ? позиция в битовой строке} chromosome = array[1..maxstring*dim] of allele; {битовая строка} fenotype = array[1..dim] of real; individual = record chrom:chromosome; {генотип = битова
я строка} x:fenotype; {фенотип = массив вещественных координат точки в пространстве поиска} fitness:real; {значение целевой функции} end; population = array[1..maxpop] of individual;
const xmax:fenotype=(5.12,5.12); {массив максимальных значений для координат точки в про-странстве поиска} xmin:fenotype=(-5.12,-5.12); {массив минимальных значений для координат точки в про-странстве поиска}
function random_:real; begin random_ := random(65535)/(65535-1); end;
function flip(probability:real):boolean; {подбрасывание монетки ? true если орел} begin if probability = 1.0 then flip := true else flip := (random_ <= probability); end;
function rnd(low,high:integer):integer; {Случайный выбор между low и high} var i:integer; begin if low >= high then i := low else begin i := trunc(
random_ * (high-low+1) + low); if i > high then i := high; end; rnd := i; end;
{интерфейсные процедуры: decode and objfunc}
function objfunc(x:fenotype):real; begin objfunc:= sqr(x[1])+sqr(x[2]); end;
procedure decode(chrom:chromosome; lbits:integer; var x:fenotype); {Декодирование строки в массив вещественных координат точки в пространстве поиска -
true=1, false=0} var i,j:integer; f, accum, powerof2:real;<
br>begin for i:=1 to dim do begin accum := 0.0; powerof2 := 1; f:=1; for j := 1+lbits*(i-1) to lbits+lbits*(i-1) do begin if chrom[j] then accum := accum + powerof2; powerof2 := powerof2 * 2; f:=f*2; end; x[i] := xmin[i]+(xmax[i]-xmin[i])*accum/(f-1) end end;
{Расчет статистических величин: statistics } procedure statistics(popsize:integer; var max,avg,min,sumfitness:real; var pop:population); {Расчет статистик популяции } var j:integer; begin {Инициализация
} sumfitness := pop[1].fitness; min := pop[1].fitness; max := pop[1].fitness; {Цикл для max, min, sumfitness } for j := 2 to popsize do with pop[j] do begin sumfitness := sumfitness + fitness; {Накопление суммы значений функции пригодности} if fitness>max then max := fitness; {Новое значение max} if fitness<min then min := fitness; {Новое значение min} end; {Расчет среднего} avg := sumfitness/popsize; end;<
br> {Процедура инициализации initpop} procedure initpop; {Инициализация начальной популяции случайным образом} var j, j1:in
teger; begin for j := 1 to popsize do with oldpop[j] do begin for j1 := 1 to lchrom*dim do chrom[j1] := flip(0.5); {Бросок монетки} decode(chrom,lchrom,x); {Декодирование строки} fitness := objfunc(x); {Вычисление начальных значений функции пригодно-сти} end; end;
{3 генетических оператора: отбора (select), скрещивания (crossover) и мутации (mutation)}
procedure select; {процедура выбора} var ipick:integer; procedure shuffle(var pop:population); {процедура
перемешивания популяции в процессе отбора} var i,j:integer; ind0:individual; begin for i := popsize downto 2 do begin j:= random(i-1)+1; ind0:=pop[i]; pop[i]:=pop[j]; pop[j]:=ind0; end; end;
function select_1:integer; var j1,j2,m:integer; begin if (ipick>popsize) then begin shuffle(oldpop); ipick:=1 end; j1:=ipick; j2:=ipick+1; if (oldpop[j2].fitness<oldpop[j1].fitness) then m:=j2
else m:=j1; ipick:=ipick+2; select_1:=m; end;
var j:integer; begin ipick:=1; for j:=1 to popsize do begin intpop[j]:=oldpop[select_1]; end; oldpop:=intpop; end;
function mutation (alleleval:allele; pmutation:real; var nmutation:integer):allele; {мутация одного бита в строке (аллеля) с вероятностью pmutation, count number of
mutations} var mutate:boolean; begin mutate := flip(pmutation); {Flip the biased coin} if mutate then begin nmutation
:= nmutation + 1; mutation := not alleleval; {Change bit value} end else mutation := alleleval; {No change} end;
procedure crossover(var parent1, parent2, child1, child2:chromosome; flchrom:integer; var ncross, nmutation, jcross:integer; var pcross, pmutation:real); {Скрещивание 2 родительских строк, результат помещается в 2 строках-потомках} var j:integer; begin if flip(pcross) then begin {Выполняется скрещ
ивание с вероятностью pcross} jcross := rnd(1,flchrom-1); {Определение точки сечения в диапазоне между 1 и l-1} ncross := ncross + 1; {Инкрементирование счетчика скрещиваний} end else jcross := flchrom; {певая часть обмена , 1 to 1 and 2 to 2} for j := 1 to jcross do begin child1[j] := mutation(parent1[j], pmutation, nmutation); child2[j] := mutation(parent2[j], pmutation, nmutation); end; {вторая часть обмена, 1 to 2 and 2 to 1} if jcross<>flchrom then {пропуск,
если точка скрещивания равна flchrom--скрещивание не происходит} for j := jcross+1 to flchrom do begin child1[j] := mutation(parent2[j], pmutation, nmutation); child2[j] := mutation(parent1[j], pmutation, nmutation); end; end;
{Процедура создания нового поколения: generation}
procedure generation; {Генерирование нового поколения при помощи отбора, скре-щивания и мутации} {Прим: предполагается, что популяция имеет четный размер} var
j, mate1, mate2, jcross:integer; begin select; j := 1; repeat {выполняются отбор, скрещивание и мутация, пока полно-стью не сформируется новая
популяция ? newpop} mate1:= j; {выбор родительской пары} mate2:= j+1; {скрещивание и мутация ? мутация вставлена в процедуру скрещивания} crossover(oldpop[mate1].chrom, oldpop[mate2].chrom, newpop[j ].chrom, newpop[j + 1].chrom, lchrom*dim, ncross, nmutation, jcross, pcross, pmutation); {Декодирование строки и вычисление
пригодности} with newpop[j ] do begin decode(chrom, lchrom,x); fitness := objfunc(x); end; with newpop[j+1] do begin decode(chrom, lchrom,x); fitness := objfunc(x); end; j := j + 2; until (j>popsize); end;
BEGIN { Главная программа } clrscr;
assign(fl1,'d:\rez.dat'); rewrite(fl1); {открытие файла для записи}
for b:=1 to 3 do begin{размеры популяций} if b=1 then razmpop:=10; if b=2 then razmpo
p:=20; if b=3 then razmpop:=30; for c:=1 to 2 do begin{выбор количества поколений} if c=1 then kolpop:=30; if c=2 then kolpop:
=100; min2:= 65535; {Здесь подразумевается любое значение заведомо бoльшее, нежели любой из минимумов} otvet1:=0; kolzap:=25; for a:=1 to kolzap do begin{количество запусков программы} popsize:=razmpop; {размер популяции} lchrom:=20; {число битов на один кодируемый параметр} maxgen:=kolpop; {максимальное число поколений} pmutation:=0.01; {вероятность скрещивания} pcross:=0.9; {вероятность мутации} {Инициализация генератора случайных чисел} randomize; {Инициализация
счетчиков} nmutation := 0; ncross := 0; initpop; statistics (popsize, max, avg, min, sumfitness, oldpop); min1:=min; gen:= 0; {Установка счетчика поколений в 0} sred:=0;
repeat {Главный итерационный цикл} gen:= gen + 1; generation; statistics(popsize, max, avg, min, sumfitness, newpop); oldpop:= newpop; {переход на новое поколение } writeln(fl1,'min= ',min); if min1>min then min1:=min; sred:=sred+min
; until (gen >= maxgen);
writeln(fl1,'minimum= ',min1);
if min2>min1 then min2:= min1; otvet:=sred/maxgen; writeln(fl1,otvet); otvet1:=otvet1+otvet; end; otvet2:=otvet1/kolzap; writeln(fl1,'Среднее',otvet2); writeln(fl1,'Global minimum: ',min2); writeln(fl1,'Количество популяций-',razmpop); writeln(fl1,'Количество поколений-',kolpop); writeln(fl1,'----------------------------------'); end;{конец цикла
выбора количества поколений} end;{конец цикла выбора количества популяций} close(fl1); {закрытие файла rez.dat} readln; END. {End главной программы}
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.