emil_seba
Dołączył: 22 Lis 2007 Posty: 109
Przeczytał: 0 tematów
Pomógł: 1 raz Ostrzeżeń: 0/5
|
Wysłany: Sob 12:46, 11 Cze 2011 Temat postu: |
|
|
jak wyzej tylko ze C#
Kod: |
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MonteCarloTurbo
{
class Program
{
static Random r = new Random();
public static double black_box(int n, double[] tab)
{
double odp = Math.Abs(Math.Sqrt(
Math.Pow((tab[1] - 5.0), 2) + Math.Pow((tab[2] - 5.0), 2) + Math.Pow((tab[3] - 5.0), 2)
) - 3.0)
+ Math.Abs(tab[3] - 8.0) - 0.0625;
return odp;
}
public static double[] fiat_monte_carlo(int n, int testy, double[] x1)
{
double[] x = new double[10];
double[] xM = new double[10];
//usyawiam jakieĹ› mini
xM = (double[])x1.Clone();
// Array.Copy(x1, xM, x1.Length);
//szukamy punktu o najmniejej wartości funkcji blax_box
for (int j = 1; j <= testy; j++)
{
//losujemy punkt
for (int i = 1; i <= n; i++)
{
x[i] = r.NextDouble() * 10.0;
//x[i]=5.0+Math.random()*3.0;
}
//sprawdzamy czy jest to minimum
if (black_box(n, x) < black_box(n, xM))
{
xM = (double[])x.Clone();
//Array.Copy(x, xM, x.Length);
//xM=x;
//System.out.print("mam mniejszy\n");
}
}
//obecnie mamy w tablicy xM najmniejsza wartosc
return xM;
}
public static double kroczek(double wartosc, double krok)
{
double k;
k = wartosc + krok;
if ((k) > 10.0)
{
k = 10.0;
}
if ((k) < 0.0)
{
k = 0.0;
}
return k;
}
public static double[] popraw(double[] x, int n, double krok)
{
double[] xM = new double[10];
double[] tmp1 = new double[10];
double[] tmp2 = new double[10];
//xM=x;
//Array.Copy(x,xM,x.Length);
xM = (double[])x.Clone();
// szukamy punktu o najmniejej wartości funkcji blax_box
for (int j = 1; j <= n; j++)
{
// poruszamy siÄ™ po osiach
//tmp1=xM;
tmp1 = (double[])xM.Clone();
// Array.Copy(xM, tmp1, xM.Length);
//tmp2=xM;
// Array.Copy(xM,tmp2,xM.Length);
tmp2 = (double[])xM.Clone();
tmp1[j] = kroczek(tmp1[j], krok);
tmp2[j] = kroczek(tmp2[j], -krok);
//sprawdzamy, która wartość jest najmniejsza oryginalna(ew. poprawiona na innej osi)
// lewa, czy prawa
if (black_box(n, tmp1) < black_box(n, xM))
{
//xM=tmp1;
//Array.Copy(tmp1, xM, tmp1.Length);
xM = (double[])tmp1.Clone();
}
if (black_box(n, tmp2) < black_box(n, xM))
{
// xM=tmp2;
//Array.Copy(tmp2, xM, tmp2.Length);
xM = (double[])tmp2.Clone();
}
}
//obecnie mamy w tablicy xM najmniejsza wartosc
return xM;
}
static void Main(string[] args)
{////dane parametryzujace
int wymiar = 3;
int proby = 1000;
double[] x = new double[4];
int ilosc_poprawek = 20000;
double epsilon = 0.0000002;
for (int i = 1; i <= wymiar; i++)
{
x[i] = r.NextDouble() * 10.0;
}
// x[1]=5.0;
//x[2]=5.0;
// x[3]=8.0;
for (int j = 1; j < 200; j++)
{
// x=fiat_monte_carlo(wymiar,proby,x);
//Array.Copy(fiat_monte_carlo(wymiar, proby, x), x, fiat_monte_carlo(wymiar, proby, x).Length);
x = (double[])fiat_monte_carlo(wymiar, proby, x).Clone();
for (int i = 1; i <= ilosc_poprawek; i++)
{
//Array.Copy(popraw(x, wymiar, epsilon), x, popraw(x, wymiar, epsilon).Length);
x = (double[])popraw(x, wymiar, epsilon).Clone();
//x = popraw(x, wymiar, epsilon);
}
}
String odp;
odp = "Punkt minumum black_box:\nx =(\n";
for (int j = 1; j <= wymiar; j++)
{
odp = odp + x[j] + "\n";
}
odp = odp + ");\n";
odp = odp + "f=" + black_box(wymiar, x);
Console.WriteLine(odp);
Console.ReadKey();
}
}
}
|
Post został pochwalony 0 razy
|
|