Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 237

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
А вы сможете немного помочь? У меня есть код симплекс метода, но там выдаются ошибки, в программировании я очень слаба, его косяки нужно немного поправить. Он написан на паскале, на делфи это будет очень трудно переделать? я посмотрела, вроде синтаксис такой же...
Это вопрос жизни и смерти((((

Приложение:
  1. { Reshenie zadachi lin prog-ya modifiz simplex-metodom }
  2. Program Simpl_ST;
  3. uses crt;
  4. label 500, 1800, 1900, 2000, Zikl,{} 2500, 1960;
  5. const M1_K = 30; M2_K = 30; P_K = 30; M_K = 30;
  6. var i, j, k, zz, GC, EC, LC, N, MM, M, MK, N1, P, M1, M2, N0: integer;
  7. A: array[1..M2_K,0..P_K] of integer;
  8. B: array[1..M2_K,0..M1_K] of integer;
  9. BS: array[1..M_K] of integer;
  10. V: array[1..M2_K] of integer;
  11. NB, SL, C: array[1..P_K] of integer;
  12. PB, PA, L, ML, NI, SS: integer;
  13. Zero, NILL, MIN, RT, DF: real;
  14. S, PV, R: integer;
  15.  
  16. P_str, PE_str: string;
  17.  
  18. cc: integer;
  19. Dop: boolean;
  20. buf:array[1..36] of byte absolute 0:$41a;
  21. procedure clearkeybuf;{ ochistka bufera klaviatury}
  22. begin
  23. inline($fa); {cli - preryvaniya nado zapretit pri }
  24. buf[1] := buf[3]; { vmeshatelstve v bufer }
  25. inline($fb); {sti }
  26. end;
  27. procedure Init;
  28. begin
  29. for i:=1 to M2_K do for j:=0 to P_K do A[i,j]:=0;
  30. end;
  31. function DelZero(X: Real): string;{Udalenie nulei posle zapyatoi}
  32. var i, l, sp: integer;
  33. Drob, Space: boolean;
  34. Xst, Res: string;
  35. begin
  36. Xst:=''; Drob:=False;
  37. Str(X:13:10, Xst);
  38.  
  39. for i:=1 to Length(Xst) do if Xst[i]='.' then Drob:=True;
  40.  
  41. if Drob then begin
  42. for i:=Length(Xst) downto 1 do begin
  43. if Xst[i]='0' then Xst[i]:='Z';
  44. if Xst[i]='.' then begin Xst[i]:='Z'; Break end;
  45. if Xst[i] in ['1'..'9'] then Break;
  46. {case XS[j] of
  47. '0': XS[j]:='Z';
  48. '.': XS[j]
  49. 1..9: Break;
  50. end; }
  51. end;
  52. for i:=1 to Length(Xst) do if Xst[i]='Z' then begin l:=i;Break end;
  53. Res := Copy(Xst,1,l-1);
  54.  
  55. end
  56. else Res := Xst;
  57.  
  58. Space := False;
  59. for i:=1 to Length(Res) do if Res[i]=' ' then
  60. begin l:=i; Space := True end; {del spaces}
  61.  
  62. if Space then Res := Copy(Res,l+1,Length(Res)-l);
  63.  
  64. {sp:=0;
  65. for i:=1 to Length(Res) do begin
  66. if Res[i] = ' ' then inc(sp);
  67. end;
  68. if (X>=0)and(sp=0) then Res := ' ' + Res; }
  69.  
  70. if X >= 0 then Res := ' ' + Res;
  71.  
  72. DelZero := Res;
  73.  
  74. end;
  75. procedure Gosub9000;
  76. var PE, PEint: real;
  77. PC, PD: integer;
  78. MID, RIGHT: string;
  79. begin
  80. PC := round(int(PB/100));
  81. P_str:='';
  82. if PC=0 then write(' ') else write(Copy(P_str,1,PC)); { LEFT$(P$,PC) }
  83. PC := PB - 100*PC;
  84. PD := round(int(PC/10));
  85. PC := PC - 10*PD;
  86. if PD = 0 then PD := 1;
  87. if PA < 0 then P_str := P_str+'-';
  88. PE := abs(PA); { A^X=EXP(X*LN(A)) }
  89. PE := PE + 5 * EXP((-1-PC)*LN(10)); { PE := PE + 5*10^(-1-PC) }
  90. if PE >= EXP(PD*LN(10)) then begin write(PA); Exit end; { PE>=10^PD }
  91.  
  92. {Str(PE:13:10, PE_str); { Copy(Str,1,N); Left }
  93. PEint := int(PE);
  94. PE_str:=DelZero(PEint);
  95.  
  96. MID := Copy(PE_str,2,PD);{ MID$(PE_str,2,PD) }
  97.  
  98. P_str := P_str + MID;
  99. {PRINT RIGHT$(P$,PD+1)}
  100. RIGHT := Copy(P_str,Length(P_str)-(PD+1)+1,PD+1);
  101.  
  102. GotoXY(WhereX+3,WhereY);
  103. write(RIGHT); { RIGHT$(P$,PD+1) Copy(Astr,Length(Astr)-N+1,N); Right }
  104. if PC = 0 then Exit;
  105. write('.');
  106.  
  107. PE:=int((PE-int(PE)) * EXP(PC*LN(10)));
  108. P_str:='000000000';
  109.  
  110. PE_str:=DelZero(PE);
  111. {PE_str := KillZero(PE_Str);}
  112.  
  113. {P_str:=P_str+Copy(KillZero(PE_str),2,PC);}
  114. MID := Copy(PE_str,2,PC);
  115.  
  116. P_str := P_str + MID;
  117.  
  118. RIGHT := Copy(P_str,Length(P_str)-PC+1,PC);{RIGHT(P$,PC) }
  119.  
  120. write(RIGHT,' ');
  121.  
  122. end;
  123. procedure Gosub3000;
  124. begin
  125. write('Bazis Znachenie ');
  126. for j:=1 to N+3 do write(' X',j,' ');
  127.  
  128. writeln;
  129. PB := 122;
  130. for i:=1 to ML do begin
  131. if i=M1 then write(' tselev func');
  132. if i=M2 then write(' iskust func');
  133.  
  134. if (i<>M1)and(i<>M2)then begin write(' ',i,' '); PA:=A[i,0]; Gosub9000 end;
  135.  
  136. for j:=0 to N0 do begin
  137. PA:=A[i,j];
  138. Gosub9000;
  139. end;
  140.  
  141. writeln(' ');
  142. end;
  143.  
  144. write(' ');
  145. end;
  146. procedure Gosub3500;
  147. begin
  148. If L=1 then writeln('ETAP 1 vsyo esho prodolzhaetsya');
  149. PB:=122;
  150. for j:=1 to N0 do write(' C',j,' ');
  151. writeln;
  152. for j:=1 to N0 do begin PA:=C[j]; Gosub9000 end;
  153. writeln;
  154. if SS<>1 then writeln('X',S,' Vhodit B,X',BS[R],' v uslovii ',R,' vyveden iz bazisa');
  155. writeln('Bazis Znachenie Obrashenie Bazisa');
  156. if SS=1 then write(' ');
  157. {write(' A'iS');}
  158. for i:=1 to ML do begin
  159. if i=M1 then write('Reshenie dlya tselevoy functii');
  160. if i=M2 then write('Reshenie dlya iskustven functii');
  161. if (i<>M1)and(i<>M2) then write(' ',BS[i]);
  162.  
  163. for j:=0 to M do begin
  164. PA:=B[i,j];
  165. Gosub9000;
  166. end;
  167. if SS<>1 then begin PA:=V[i]; Gosub9000 end;
  168. writeln(' ');
  169. end;
  170. writeln(' ');
  171.  
  172. end;
  173. begin
  174. clearkeybuf;
  175. Init;
  176. textbackground(0); textcolor(15);
  177. clrscr;{promezhut tablitsa pri zz = +1 vyvod, -1 net }
  178. writeln('Reshenie zadachi lin prog-ya simplex-metodom');
  179. {write('Vvedite zz '); readln(zz);} zz:=1;
  180. {Vvesti kol-vo vidov ogranicheniy i kolvo peremennyh}
  181. {write('Vvedite cherez probel GC, EC, LC, N ');
  182. Readln(GC, EC, LC, N); { 2, 0, 2, 2 }
  183. GC:=0; EC:=0; LC:=3; N:=2;
  184.  
  185. MM:=GC+EC; M:=MM+LC; MK:=GC+LC; N1:=MK+N;
  186. P:=N1+MM; M1:=M+1; M2:=M+2; N0:=N1;
  187. {Vvesti koeff-ty dlya ogranicheniy i tselevoy functii}
  188. {matriza: vvodit stroku matrizy cherez probel,v konze stroki press Enter}
  189.  
  190. {writeln('Input matrix ',M1, 'x', N);
  191. for i:=1 to M1 do begin
  192. for j:=1 to N do read(A[i,j]);
  193. readln;
  194. end; }
  195.  
  196. A[1,1]:=1; A[1,2]:=-2; A[2,1]:=2; A[2,2]:=-1; A[3,1]:=1; A[3,2]:=1;
  197. A[4,1]:=-3; A[4,2]:=1; {A[5,1]:=0; A[5,2]:=0; }
  198.  
  199. { vyvod matrix na ekran }
  200. writeln('Matrix ',M1,'x',N);
  201. for i:=1 to M1 do begin
  202. for j:=1 to N do write(A[i,j],' ');
  203. writeln;
  204. end;
  205. cc := 0;
  206. {Zadat oslablennye, iskustvenye peremennye, pometit bazis i vvesti
  207. peremennye v nulevoi stolbez}
  208. writeln('Zadaite oslablennye, iskustvennye peremennye'); { 10, 5, 20, 20 }
  209. if GC <> 0 then begin
  210. for i:=1 to GC do begin {1 2}
  211. A[i,N+1]:=-1; A[i,N1+i]:=1; B[M2,i]:=-1;
  212. B[i,i]:=1; A[M2,N1+i]:=1; BS[i] := N1+i;
  213. write(' ? ');read(A[i,0]); B[i,0]:=A[i,0]
  214. { if i=1 then A[i,0]:=10;
  215. if i=2 then A[i,0]:=5; }
  216. { inc(cc) }
  217. end
  218. end;
  219. if EC <> 0 then begin
  220. for i:=GC+1 to MM do begin
  221. A[i,N1+i]:=1; B[i,i]:=1; A[M2,N1+i]:=1;
  222. BS[i]:=N1+i; B[M2,i]:=-1; write(' ? ');read(A[i,0]);
  223. B[i,0]:=A[i,0]
  224. {inc(cc); }
  225. end;
  226. end;
  227. if LC <> 0 then begin
  228. for i:=MM+1 to M do begin {3 4}
  229. A[i,N+i-EC]:=1; B[i,i]:=1; BS[i]:=N+i-EC; write(' ? '); read(A[i,0]);
  230. B[i,0]:=A[i,0]
  231. { if i=3 then A[i,0]:=20;
  232. if i=4 then A[i,0]:=20; }
  233. {inc(cc);}
  234. end;
  235. end;
  236.  
  237. if MM = 0 then writeln('Otsutstvuet ETAP 1 resheniya zadachi ');
  238. {writeln(cc);}
  239.  
  240. {Zadat iskustvenuyu function for ETAP 1 }
  241. L := 1; N0 := P; { N0 yavlyaetsya nomerom nuzhnogo stolbza }
  242. for i:=1 to MM do B[M2,0] := B[M2,0] - B[i,0];
  243. ML:=M1+L; { ML=M+2 dlya ETAPA 1; ML=M+1 dlya ETAPA 2 }
  244. if zz >= 0 then writeln('Pervonachalnaya tabliza');
  245.  
  246. Gosub3000;
  247.  
  248. {Repeat until keypressed;}
  249. { Vyhod iz progi }
  250.  
  251. {Pometit nebazisnye peremennye, NB[j]=0, esli j-nebazisnaya peremennaya}
  252. for i:=1 to M do NB[BS[i]]:=1;
  253. Zero := 0.00000001; NILL := 1E-20;
  254. {Exit; { Halt(0) }
  255.  
  256. { Naiti naimenshiy koef-t v stroke zelevoy functii, t.e. stroku ML }
  257. 500: MIN := -Zero; S:=0; PV:=0; ML:=M1+L;
  258. for j:=1 to N0 do begin
  259. C[j]:=0;
  260. if NB[j] <> 1 then begin
  261. { Vychislit C[j] }
  262. for i:=1 to M do C[j]:=C[j]+B[ML,i]*A[i,j];
  263. C[j]:=C[j]+A[ML,j];
  264. if C[j]<MIN then begin MIN:=C[j]; S:=j end
  265. end
  266. end;
  267. { Esli S = 0, to vse koef-ty polozhitelny i minimum naiden }
  268. if S = 0 then goto 1900;
  269.  
  270. { Naiti stroku peremennyh, kotoruyu sleduet iskluchit iz bazisa
  271. po usloviyu minimuma BI/A'[iS] }
  272.  
  273. MIN := 1E20; R:=0;
  274. {Vychislit A'[iS] i pomestit v stolbez V }
  275. for i:=1 to M1 do begin
  276. V[i]:=0;
  277. for k:=1 to M1 do V[i]:=V[i]+B[i,k]*A[k,s]
  278. end;
  279. V[ML]:=C[S];
  280.  
  281. for i:=1 to M do begin
  282. if V[i]<=Zero then Continue;
  283. k:=0;
  284.  
  285. Zikl:
  286. RT:=B[i,k]/V[i];
  287. DF:=RT-MIN;
  288. if DF<0 then begin
  289. R:=i;
  290. MIN:=B[i,0]/V[i];
  291. Continue
  292. end;
  293. if DF<>0 then Continue;
  294. k:=k+1;
  295. MIN:=B[R,k]/V[R];
  296. goto Zikl
  297.  
  298. end; {NEXT i}
  299.  
  300. { Esli R = 0, to imeet mesto reshenie bez ogranicheniy }
  301. if R = 0 then goto 1800;
  302. if zz>=0 then Gosub3500;
  303. Repeat Until keypressed; {pervoe reshenie}
  304.  
  305. { Obnovit obratnyi i simplex- mnozhiteli }
  306.  
  307. PV := V[R];
  308.  
  309. for j:=0 to M1 do B[R,j]:=Round(B[R,j]/PV);
  310.  
  311. { Perenaznachit B povtorno pometit bazisnye i nebazisnye peremennye }
  312. NB[BS[R]]:=0; NB[S]:=1; BS[R]:=S; NI:=NI+1;
  313. Goto 500;
  314. 1800: writeln('Peremennaya "S" ne imeet ogranicheniy ');
  315. Gosub3500; readkey;
  316. Goto 2500;
  317. 1900:if L=0 then Goto 2000;
  318. { Dlya ETAPA 2 eta tochka yavl-sya minimumom. Esli my nahodimsya na ETAPE 1,
  319. to pereiti k ETAPU 2, proverit, chto W stalo ravno 0 }
  320. if abs(A[ML,0]) >= 1E-08 then Goto 1960;
  321. writeln('ETAP 1 uspeshno zavershon');
  322. L:=0; N0:=N1; { Zadat L i nomer stolbza dlya ETAPA 2 }
  323. Goto 500;
  324. 1960: writeln('Ogranicheniya ne imeyut dopustimogo resheniya');
  325. writeln('summa iskustvennyh peremennyh ravna ',-B[ML,0]);
  326. Gosub3500;
  327. 2000:writeln('Okonchatelnoe reshenie');
  328. writeln('Ogranichenie Bazis Znachenie');
  329. PB := 144;
  330. for i:=1 to M do begin
  331. SL[BS[i]]:=B[i,0];
  332. write(' ',i,' ',BS[i],' ');
  333. PA:=B[i,0];
  334. Gosub9000;
  335. writeln(' ');
  336. end;
  337. writeln('Minimum functii Z raven ',-B[M1,0]);
  338. writeln('Ogranichenie Sostoyanie Dopolnitelnye peremennye');
  339. for i:=1 to M do begin
  340. Dop:=False;
  341. write(' ',i,' ');
  342. if (i>GC)and(i<=MM) then begin write('Uravnenie ne resheno');Continue end;
  343. if NB[N+i]=1 then begin write(' dopoln.perem. '); Dop:=True end;
  344. PA:=SL[N+i];
  345. Gosub9000;
  346. write(' '); {Continue; }
  347. if not Dop then begin gotoXY(whereX-8,WhereY);writeln('Ogranichenie 0') end else writeln;
  348. end; writeln;
  349. SS:=1;
  350. Gosub3500;
  351. 2500:writeln('The End.');
  352. Clearkeybuf;
  353. Repeat until keypressed
  354. end.
  355.  


Самая Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Самая (статус: Посетитель)
Вопрос отправлен: 27 мая 2010, 21:51
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 29 мая 2010, 05:10; участников в обсуждении: 5.
IlluminatI

IlluminatI (статус: 2-ой класс), 27 мая 2010, 23:28 [#1]:

Как говорит min@y™, чтение приложенного кода ведет к раку мозгов. Сомнваюсь, что кто-то будет в ЭТОМ разбираться. Хотя бы выложите структурированный код - https://www.delphi-int.ru/code/paste/
Вадим К

Вадим К (статус: Академик), 27 мая 2010, 23:35 [#2]:

увидел в коде строку Gosub9000; Это что, код, который перевели с старого Basic'а? Тогда может и оригинал приложите. Чувствую где то просто неверно перевелось. Хотя восстанавливать код после бейсика - это ещё то удовольствие.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 28 мая 2010, 08:33 [#3]:

Цитата (Вадим К):

Хотя восстанавливать код после бейсика - это ещё то удовольствие.

Это геморрой!
Пролистал код - захотелось выпить водки...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 28 мая 2010, 08:41 [#4]:

Ради интереса попробовал скомпилить как консольное приложение. Не катит! Некоторые DOS-паскалевские конструкции не имеют смысла в Delphi. Например:
buf:array[1..36] of byte absolute 0:$41a;
inline($fa);
Дальше смотреть не стал, голова болеть начала.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 28 мая 2010, 10:11 [#5]:

конструкцию buf:array[1..36] of byte absolute 0:$41a; и судя по адресу - это буфер клавиатуры...
я знаю и понимаю. А вот с inline - ассемблерный код? вроде так. запрещения прерываний? в симплексном методе?

А ядерными боеголовками комаров разгонять не пробовали?
Галочка "подтверждения прочтения" - вселенское зло.
Самая

Самая (статус: Посетитель), 29 мая 2010, 01:27 [#6]:

Просто я тупица( и не щнаю уже как за 2 дня составить эту симплекс таблицу на делфи(
Егор

Егор (статус: 10-ый класс), 29 мая 2010, 05:08 [#7]:

Цитата (Вадим К):

Это что, код, который перевели с старого Basic'а?

а видимо так и есть, судя по комментариям

if PC=0 then write(' ') else write(Copy(P_str,1,PC)); { LEFT$(P$,PC) }
...
MID := Copy(PE_str,2,PD);{ MID$(PE_str,2,PD) }
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 29 мая 2010, 05:10 [#8]:

Цитата (Самая):

Просто я тупица( и не щнаю уже как за 2 дня составить эту симплекс таблицу на делфи(

Есть несколько путей:
а) адаптировать данную программу - ведёт к раку мозга :)
б) поискать в интернете уже готовые исходники - для тупых и/или ленивых
в) разобраться в симплекс-методе и написать свою программу с нуля
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:30
Выполнено за 0.03 сек.