Guest User

Untitled

a guest
Apr 23rd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.08 KB | None | 0 0
  1. private List<string> autorzy = new List<string>();
  2. private string opis;
  3. private List<ParameterDesc> potrzebne;
  4. public Class1()
  5. {
  6. autorzy.Add("Paweł Budzyna");
  7. autorzy.Add("Łukasz Starostka");
  8. autorzy.Add("Szymon Okruta");
  9. opis = "Jest to metoda najszybszego spadku wielu zmiennych gradientowa";
  10. ro = 0.0001;
  11. zatrzymanaIteracja = 0;
  12.  
  13. // private int liczbaIteracji;
  14. //private string obrazfunkcji;
  15. //private List<string> tabzmiennych;
  16. //private List<double> tabwartosci;
  17.  
  18. potrzebne = new List<ParameterDesc>();
  19.  
  20. ParameterDesc cos = new ParameterDesc();
  21. cos.Name = "IterationLimit";
  22. cos.DescriptiveName = "Enter the number of iterations";
  23. cos.Type = InputType.Integer;
  24. potrzebne.Add(cos);
  25.  
  26. cos = new ParameterDesc();
  27. cos.Name = "Formula";
  28. cos.DescriptiveName = "Enter the function";
  29. cos.Type = InputType.Text;
  30. potrzebne.Add(cos);
  31.  
  32.  
  33. cos = new ParameterDesc();
  34. cos.Name = "VariableNames";
  35. cos.DescriptiveName = "Give the names of variables, eg x";
  36. cos.Type = InputType.Text;
  37. potrzebne.Add(cos);
  38.  
  39. cos = new ParameterDesc();
  40. cos.Name = "PointStart";
  41. cos.DescriptiveName = "Enter a starting point";
  42. cos.Type = InputType.Text;
  43. potrzebne.Add(cos);
  44.  
  45.  
  46. }
  47.  
  48. #region IPlugin Members
  49.  
  50. public List<string> Authors
  51. {
  52. get
  53. {
  54. return autorzy;
  55. }
  56. set
  57. {
  58.  
  59. }
  60. }
  61.  
  62. public PluginCategory Category
  63. {
  64. get
  65. {
  66. return PluginCategory.Deterministic;
  67. }
  68. set
  69. {
  70.  
  71. }
  72. }
  73.  
  74. public string Description
  75. {
  76. get
  77. {
  78. return opis;
  79. }
  80. set
  81. {
  82.  
  83. }
  84. }
  85.  
  86. public bool IfReportProgress
  87. {
  88. get
  89. {
  90. return false;
  91. }
  92. set
  93. {
  94.  
  95. }
  96. }
  97.  
  98. public string Name
  99. {
  100. get
  101. {
  102. return "Najszybszego spadku";
  103. }
  104. set
  105. {
  106.  
  107. }
  108. }
  109.  
  110. public List<ParameterDesc> Parameters
  111. {
  112. get
  113. {
  114. return potrzebne;
  115. }
  116. set
  117. {
  118.  
  119. }
  120. }
  121.  
  122.  
  123.  
  124. public int ReportProgress()
  125. {
  126. throw new NotImplementedException();
  127. }
  128.  
  129.  
  130.  
  131. public List<OutputItem> Run(List<ParameterItem> parameter)
  132. {
  133. Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-en");
  134.  
  135.  
  136.  
  137.  
  138.  
  139. List<OutputItem> wynik = new List<OutputItem>();
  140.  
  141.  
  142. // private int liczbaIteracji;
  143. //private string obrazfunkcji;
  144. //private List<string> tabzmiennych;
  145. //private List<double> tabwartosci;
  146.  
  147. foreach (ParameterItem x in parameter)
  148. {
  149. switch (x.Name)
  150. {
  151. case "IterationLimit":
  152. liczbaIteracji = (int)x.Value;
  153. break;
  154.  
  155. case "Formula":
  156. obrazfunkcji = (string)x.Value;
  157. break;
  158.  
  159. case "VariableNames":
  160. tabzmiennych = (List<string>)x.Value;
  161. break;
  162.  
  163. case "PointStart":
  164. string pomoc = (string)x.Value;
  165. string[] pomoc1 = pomoc.Split(',');
  166. for (int i = 0; i < pomoc1.Length; i++)
  167. {
  168. tabwartosci.Add(Convert.ToDouble(pomoc1[i]));
  169. }
  170. break;
  171.  
  172. default:
  173. break;
  174. }
  175. }
  176.  
  177. metodaspadku();
  178.  
  179.  
  180. foreach (double x in tabwartosci)
  181. {
  182. OutputItem pojedynczeWyniki = new OutputItem();
  183. pojedynczeWyniki.TypeOfOutput = OutputType.Text;
  184. pojedynczeWyniki.Data = x;
  185. wynik.Add(pojedynczeWyniki);
  186. }
  187.  
  188. return wynik;
  189. }
  190.  
  191. public OptimalizationType Type
  192. {
  193. get
  194. {
  195. return OptimalizationType.Multi;
  196. }
  197. set
  198. {
  199.  
  200. }
  201. }
  202.  
  203. public WorkState State
  204. {
  205. get
  206. {
  207. return work;
  208.  
  209. }
  210. set
  211. {
  212. value = work;
  213. }
  214. }
  215.  
  216. public ErrorType Stop()
  217. {
  218. work = WorkState.Stopped;
  219. return ErrorType.StoppedByUser;
  220. }
  221. private WorkState work;
  222. public void Pause()
  223. {
  224. if (WorkState.Run == work)
  225. {
  226. work = WorkState.Paused;
  227. }
  228.  
  229. }
  230.  
  231. #endregion
  232.  
  233. //moja metoda do liczenia
  234.  
  235. //to co potrzebuje
  236. private int liczbaIteracji;
  237. private string obrazfunkcji;
  238. private List<string> tabzmiennych;
  239. private List<double> tabwartosci;
  240.  
  241.  
  242.  
  243.  
  244. //reszta jest stała i liczy automatycznie
  245. private double ro;
  246. private List<double> gradient;
  247. private int zatrzymanaIteracja;
  248. private void metodaspadku()
  249. {
  250.  
  251. for (int i = zatrzymanaIteracja; i < liczbaIteracji; i++)
  252. {
  253. gradient = new List<double>();
  254.  
  255. //znajdowanie gradieny funkcji
  256. for (int j = 0; j < tabwartosci.Count; j++)
  257. {
  258. tabwartosci[j] -= 2 * ro;
  259. double odejmowanie2 = wartoscfunkcji();
  260. tabwartosci[j] += ro;
  261. double odejmowanie1 = wartoscfunkcji();
  262. tabwartosci[j] += ro;
  263. double dodawanie1 = wartoscfunkcji();
  264. tabwartosci[j] += ro;
  265. double dodawanie2 = wartoscfunkcji();
  266. tabwartosci[j] -= ro;
  267. gradient.Add(pierwszapochodna(odejmowanie1, odejmowanie2, dodawanie1, dodawanie2));
  268.  
  269. }
  270. //kierunek spadku
  271. for (int j = 0; j < gradient.Count; j++)
  272. {
  273. gradient[j] = (0 - gradient[j]);
  274.  
  275. }
  276.  
  277. //szukanie lambdy czyli zmiennej w kierunku poszukiwań
  278. //pierwsze znalezienie funkji dodatkowej
  279. string nowyobrazfunkcji = obrazfunkcji;
  280. int licznik = 0;
  281. foreach (string x in tabzmiennych)
  282. {
  283. string pomoc = " ( " + tabwartosci[licznik].ToString() + " + " + "x * " + gradient[licznik].ToString() + " ) ";
  284. nowyobrazfunkcji = nowyobrazfunkcji.Replace(x, pomoc);
  285. licznik++;
  286. }
  287.  
  288. //obraz funkcji do znalezienia minumum
  289. //znalezienie lambda
  290.  
  291. string obrazdodawanie = nowyobrazfunkcji.Replace("x", " ( x + " + ro.ToString() + " ) ");
  292. string obrazodejmowanie = nowyobrazfunkcji.Replace("x", " ( x - " + ro.ToString() + " ) ");
  293.  
  294. string obrazdominimalizacji = "(( " + obrazdodawanie + " )-( " + obrazodejmowanie + ") ) / (2 * " + ro + " )";
  295.  
  296.  
  297. Regex liczbaprzecinek = new Regex(@"-?[0-9]*,[0-9]*E?[+||-]?[0-9]?[0-9]?");
  298. MatchCollection liczby = liczbaprzecinek.Matches(obrazdominimalizacji);
  299. HashSet<string> liczbypoprzecinku = new HashSet<string>();
  300. foreach (Match x in liczby)
  301. {
  302. liczbypoprzecinku.Add(x.ToString());
  303. }
  304.  
  305. Hashtable h = new Hashtable();
  306. StringBuilder zmienne = new StringBuilder();
  307. foreach (string x in liczbypoprzecinku)
  308. {
  309. zmienne.Append("a");
  310. obrazdominimalizacji = obrazdominimalizacji.Replace(" " + x + " ", zmienne.ToString());
  311. h.Add(zmienne.ToString(), x);
  312.  
  313. }
  314. h.Add("x", "0");
  315.  
  316. double lambda = metodasiecznych(obrazdominimalizacji, h, true);
  317.  
  318. //obliczam zmienną minimalną i mam zrobioną pierwszą pętle
  319. //czyli obliczamy nowy optymalny punkt
  320. licznik = 0;
  321. foreach (string x in tabzmiennych)
  322. {
  323. tabwartosci[licznik] = (tabwartosci[licznik] + lambda * gradient[licznik]);
  324. licznik++;
  325.  
  326.  
  327. }
  328.  
  329. zatrzymanaIteracja++;
  330. //sprawdzić czy jest stop albo pause
  331. if (work == WorkState.Stopped || work == WorkState.Paused)
  332. {
  333. //zapamiętać parametry
  334.  
  335. while (true)
  336. {
  337.  
  338. }
  339. }
  340. }
  341.  
  342.  
  343. }
  344.  
  345.  
  346.  
  347. private double pierwszapochodna(double odejmowanie2, double odejmowanie1, double dodawanie1, double dodawanie2)
  348. {
  349. double wynik = (odejmowanie2 - 8 * odejmowanie1 + 8 * dodawanie1 - dodawanie2) / (12 * ro);
  350. return wynik;
  351. }
  352. private double wartoscfunkcji()
  353. {
  354. double wynik = 0;
  355.  
  356. ExpressionParser parser = new ExpressionParser();
  357. Hashtable h = new Hashtable();
  358. h.Add("pi", "3.14");
  359. h.Add("Pi", "3.14");
  360. int licznik = 0;
  361. foreach (string x in tabzmiennych)
  362. {
  363. h.Add(x, tabwartosci[licznik].ToString());
  364. licznik++;
  365. }
  366.  
  367.  
  368. // Parse and write the result
  369. wynik = parser.Parse(obrazfunkcji, h);
  370.  
  371. return wynik;
  372.  
  373.  
  374. }
  375.  
  376.  
  377. private double metodasiecznych(string wygladfunkcji, Hashtable h, bool druga)
  378. {
  379. double wynik = 0;
  380. //dla własnej wiedzy nie potrzebne w algorytmie
  381. int iteracje = 0;
  382.  
  383. double dokladnosc = 0.01;
  384. //przedział
  385. double x1 = -10000000;
  386. double x2 = 10000000;
  387. double pochodnax1 = pierwszapochodnadlasiecznych(wygladfunkcji, h, x1);
  388. double pochodnax2 = pierwszapochodnadlasiecznych(wygladfunkcji, h, x2);
  389.  
  390.  
  391. double xnowe = ((pochodnax1 * x2) - (pochodnax2 * x1)) / (pochodnax1 - pochodnax2);
  392.  
  393. double pochodnanowe = pierwszapochodnadlasiecznych(wygladfunkcji, h, xnowe);
  394. bool zmienna = false;
  395. while (Math.Abs(pochodnanowe) > dokladnosc)
  396. {
  397.  
  398. if ((pochodnanowe * pochodnax2) < 0)
  399. {
  400. x1 = xnowe;
  401. pochodnax1 = pochodnanowe;
  402. }
  403. else
  404. {
  405. x2 = xnowe;
  406. pochodnax2 = pochodnanowe;
  407. }
  408.  
  409. iteracje++;
  410.  
  411. pochodnax1 = pierwszapochodnadlasiecznych(wygladfunkcji, h, x1);
  412. pochodnax2 = pierwszapochodnadlasiecznych(wygladfunkcji, h, x2);
  413.  
  414. xnowe = ((pochodnax1 * x2) - (pochodnax2 * x1)) / (pochodnax1 - pochodnax2);
  415. pochodnanowe = pierwszapochodnadlasiecznych(wygladfunkcji, h, xnowe);
  416.  
  417. if (iteracje > 200)
  418. {
  419. break;
  420. }
  421.  
  422.  
  423. }
  424.  
  425.  
  426. //xnowe wynik
  427. wynik = xnowe;
  428. return wynik;
  429. }
  430. private double wartoscfunkcjidlasiecznych(string obraz, Hashtable h, double x)
  431. {
  432. double wynik = 0;
  433.  
  434. ExpressionParser parser = new ExpressionParser();
  435. h["x"] = x.ToString();
  436.  
  437.  
  438. // Parse and write the result
  439. wynik = parser.Parse(obraz, h);
  440.  
  441. return wynik;
  442.  
  443.  
  444. }
  445. private double pierwszapochodnadlasiecznych(string obraz, Hashtable h, double x)
  446. {
  447. double wynik = (wartoscfunkcjidlasiecznych(obraz, h, x - 2 * ro) - 8 * wartoscfunkcjidlasiecznych(obraz, h, x - ro) + 2 * wartoscfunkcjidlasiecznych(obraz, h, x + ro) - wartoscfunkcjidlasiecznych(obraz, h, x + 2 * ro)) / (12 * ro);
  448. return wynik;
  449. }
Add Comment
Please, Sign In to add comment