-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathKaibushevaAI.asm
218 lines (173 loc) · 7.89 KB
/
KaibushevaAI.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
Comment &
A1*x1 + A2*x2 + A3*x3 + A4*x4 + A5*x5 = D,
xi - неизвестные положительные целые, Ai, D, – заданные положительные целые константы
i=1,..,5
размер начальной популяции N задают пользователь в диапазоне 4 <= N <= 10.
начальная популяция формируется случайным образом.
критерии останова:
1) превышение заданного пользователем количества итераций M;
2) достижение нулевого значения целевой функции.
вид селекции: cлучайная схема
вид скрещивания: одноточечное
мутация: изменение случайно выбранного бита;
количество скрещиваемых особей и вероятность мутации задаются пользователем.
требования к программе
программа должна работать в двух режимах:
тестовый
основной
в тестовом режиме программа выводит на экран популяцию решений, получаемую на каждом шаге работы алгоритма.
в основном режиме выводится только решение, значение функции (невязка уравнения, которая в идеале должна обращаться в ноль) и количество сделанных итераций.
все шаги алгоритма (генерация начальной популяции, селекция, скрещивание, мутация, вычисление целевой функции), должны быть реализованы в виде отдельных процедур.
&
include console.inc
extern PopulationGEN@8:near, OcenkaPopul@12:near, OutResult@4:near, Selection@20:near, Mutation@12:near, Skreshiv@16:near ;внешние процедуры
.data
N DB ? ; размер начальной популяции в диапазоне 4 <= N <= 10
X DB 50 DUP (?) ; корни - генерируются алгоритмом
XBuf DB 50 DUP (?) ; корни - получаются на этапе скрещивания
A DB 5 DUP (?) ; коэфиценты - вводит пользователь
D DD ? ; свободный член уравнения - вводит пользователь
M DD ? ; количество итераций - вводит пользователь
K DB ? ; количество потомков
P DB ? ; вероятность мутации (число от 0..255) где 255 соответствует 1
Mode DD ? ; режим работы (тестовый, основной)
Res DD 10 DUP (?) ; массив результатов вычисления уравнений
Sel DB 20 DUP (?) ; масссив для индексов элементов в результате селекции
ComCount DD ? ; счетчик итераций
rand DD ? ; глобальная переменная для хранения последенего генерированного ПСЧ
.code
start:
;¬¬???Ќ»? ¬’ќ?Ќџ’ ѕј–јћ?“–ќ¬~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
outstr "введите режим работы 1 - основной, 0 - тестовый: "
inintln [Mode]
outstr "введите N в диапазоне 4...10 : "
inintln [N] ; размер популяции в диапазоне 4 <= N <= 10
outstr "A1=" ; запросы на ввод коэфицентов A
inintln [A]
outstr "A2="
inintln [A+1]
outstr "A3="
inintln [A+2]
outstr "A4="
inintln [A+3]
outstr "A5="
inintln [A+4]
outstr "введите D : " ; свободный член уравнения
inintln [D]
outstr "введите M : " ; количество итераций
inintln [M]
outstr "введите K : " ; количество потомков
inintln [K]
outstr "введите P : " ; вероятность мутации
inintln [P]
;v?Ќ?–ј?»я~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mov dword ptr [rand],01h ; инициализация rand=1
mov ecx,0
mov esi, offset X ; адрес первого элемента массива X
PopGen:
push offset rand ; адрес rand в стек
push esi ; сосотояние esi в стек ( движется по массиву X )
call PopulationGEN@8 ; генерация 5 однобайтовых иксов
add esi, 5 ; движемся по массиву X с шагом 5
inc cl ; конец тела цикла генерации пятерок иксов
cmp cl,byte ptr [N]
jne PopGen
mov ComCount,1 ; начало главного цикла
iteratioins:
cmp byte ptr [Mode],0
jnz ComMode0 ; основной режим продолжается с метки ComMode0
newline ; вывод шапки таблицы в тестовом режиме
outint ComCount ; на какой итерации находится алгоритм
outchar 9 ; символ табуляции для выравнивания столбцов
outstrln "итерация. X1..X5 перем. расст. до решения"
newline
ComMode0: ; основной режим
;ОЦЕНКА ОТКЛОНЕНИЯ ОТ D~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mov esi, offset X ; начало массива X
mov ecx,0 ; цикл от 0..N-1
equation_calc:
mov eax, dword ptr [D]
push eax ; передаем через стек значение D
push esi ; адрес позиции в массиве X передаем через стек
push offset A ; адрес начала массива A передаем через стек
call OcenkaPopul@12
cmp eax,0 ; в случае, если найдено решение
je outresult ; переход на вывод результата и выход
cmp byte ptr [Mode],0 ; тестовый вывод?
jnz ComMode ; нет - обходим тестовый вывод
outstr " " ; тестовый вывод
outword byte ptr [esi]
outchar 9 ; выравнивание по вертикали
outstr " "
outword byte ptr [esi+1]
outchar 9
outstr " "
outword byte ptr [esi+2]
outchar 9
outstr " "
outword byte ptr [esi+3]
outchar 9
outstr " "
outword byte ptr [esi+4]
outchar 9
outstr "S(Di)-D = "
outwordln eax
ComMode: ; основной режим вывода
mov dword ptr [Res+ecx*4], eax ; заполнение массива Res разностями Sum(D[i])-D
add esi, 5 ; с шагом 5 движение по массиву X пятерки иксов
inc cl ; конец тела цикла
cmp cl,byte ptr [N]
jne equation_calc
;СЕЛЕКЦИЯ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
push offset rand ; передача глобальной переменной rand=последнее сгенерированное ПСЧ
xor eax,eax
mov al, byte ptr [N]
push eax ; в стек значение N
push offset Sel ; в стек адрес Sel
push offset X ; в стек адрес X
push offset Res ; в стек адрес Res
call Selection@20
;МУТАЦИЯ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
xor eax,eax
mov al, byte ptr [N]
push eax ; передается значение N через стек
xor eax,eax
mov al, byte ptr [P] ; передается значение P через eax
push offset rand ; передача глобальной переменной rand=последнее сгенерированное ПСЧ
push offset X ; в стек адрес X
call Mutation@12
;СКРЕЩИВАНИЕ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
push offset XBuf
xor eax,eax
mov al,byte ptr [K]
push offset rand
push offset X
push offset Sel
call Skreshiv@16
xor ecx,ecx
mov al,K ; замещаем самые слабые особи K детьми самых подходящих, полученных в результате скрещивания
mov bl,5
mul bl
mov cl,al
mov esi,offset XBuf
mov edi,offset X
rep movsb
inc dword ptr [ComCount]
mov eax,dword ptr [M]
cmp dword ptr [ComCount],eax
jna iteratioins
;ВЫВОД РЕЗУЛЬТАТА~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
newline
outstr "выполнено итераций: "
outword M ; вывод количества итераций M
outstr ". решение не найдено."
jmp lexit
outresult:
mov eax,dword ptr [ComCount]
push esi
call OutResult@4
lexit:
newline
pause "Нажмите любую кнопку для выхода"
exit
end start