Example #1
0
    void Update()
    {
        PSORender psoRender = FindObjectOfType <PSORender>();

        if (psoRender)
        {
            var pso = psoRender.pso;
            if (pso != null)
            {
                bestFitText.text = "Best Fit = " + pso.BestSoFar.fitness;
                avgFitText.text  = "Avg Fit = " + pso.AvgFitCurr;
            }
        }
    }
    void Start()
    {
        float      speed          = 1.0f;
        bool       connectivity   = false;
        GameObject activeObject   = null;
        float      scale          = 1.0f;
        bool       isCustom       = false;
        int        materialPreset = 0;
        bool       fof            = false;
        float      limitX         = 100.0f;
        int        seed           = 12345;
        bool       seedParam      = false;

        customPreset.perlinOffset.x = UnityEngine.Random.Range(-1000.0f, 1000.0f);
        customPreset.perlinOffset.y = UnityEngine.Random.Range(-1000.0f, 1000.0f);

        //string cmdLine = "-imagevalue -image\"d:\\temp\\test folder\\download.jpg\" -material3";
        //string cmdLine = "-weierstrass -material2";
        //string cmdLine = "-rastrigin -material2";
        //string cmdLine = "-experiment7";
        //string cmdLine = "-ackley -material3";
        string cmdLine = string.Join(" ", Environment.GetCommandLineArgs());

        var args = ParseText(cmdLine, ' ', '"');

        for (int i = 0; i < args.Count; i++)
        {
            if (args[i].StartsWith("-preset"))
            {
                if (int.TryParse(args[i].Substring(7), out int presetIndex))
                {
                    activeObject = presets[presetIndex];
                }
            }
            else if (args[i].StartsWith("-experiment"))
            {
                if (int.TryParse(args[i].Substring(11), out int experimentIndex))
                {
                    activeObject = experiments[experimentIndex - 1];
                }
            }
            else if (args[i].StartsWith("-speed"))
            {
                if (float.TryParse(args[i].Substring(6), out speed))
                {
                }
            }
            else if (args[i] == "-random")
            {
            }
            else if (args[i] == "-connectivity")
            {
                connectivity = true;
            }
            else if (args[i] == "-landscape")
            {
                customPreset.problem = PSOConfig.Problem.PerlinLandscape; isCustom = true;
            }
            else if (args[i] == "-imagevalue")
            {
                customPreset.problem = PSOConfig.Problem.ImageValue; isCustom = true;
            }
            else if (args[i] == "-imagesaturation")
            {
                customPreset.problem = PSOConfig.Problem.ImageSaturation; isCustom = true;
            }
            else if (args[i] == "-sphere")
            {
                customPreset.problem = PSOConfig.Problem.Sphere; scale = 0.01f; isCustom = true;
            }
            else if (args[i] == "-quadric")
            {
                customPreset.problem = PSOConfig.Problem.Quadric; scale = 0.01f;  isCustom = true;
            }
            else if (args[i] == "-hyperellipsoid")
            {
                customPreset.problem = PSOConfig.Problem.Hyper; scale = 0.01f;  isCustom = true;
            }
            else if (args[i] == "-rastrigin")
            {
                customPreset.problem = PSOConfig.Problem.Rastrigin; scale = 0.1f; limitX = 10.0f; customPreset.vMax = 0.25f; isCustom = true;
            }
            else if (args[i] == "-griewank")
            {
                customPreset.problem = PSOConfig.Problem.Griewank; isCustom = true;
            }
            else if (args[i] == "-schaffer")
            {
                customPreset.problem = PSOConfig.Problem.Schaffer; limitX = 10.0f; customPreset.vMax = 0.25f; isCustom = true;
            }
            else if (args[i] == "-ackley")
            {
                customPreset.problem = PSOConfig.Problem.Ackley; scale = 0.25f;  limitX = 10.0f; customPreset.vMax = 0.25f; isCustom = true;
            }
            else if (args[i] == "-weierstrass")
            {
                customPreset.problem = PSOConfig.Problem.Weierstrass; scale = 0.25f;  limitX = 10.0f; customPreset.vMax = 0.25f; isCustom = true;
            }
            else if (args[i] == "-ralphmean")
            {
                customPreset.problem = PSOConfig.Problem.RalphBellCurveMean; scale = 20.0f; isCustom = true;
            }
            else if (args[i] == "-ralphvar")
            {
                customPreset.problem = PSOConfig.Problem.RalphBellCurveVariance; scale = 20.0f; isCustom = true;
            }
            else if (args[i] == "-fof")
            {
                fof = true; isCustom = true;
            }
            else if (args[i] == "-usestimulus")
            {
                customPreset.useStimulus = true; isCustom = true;
            }
            else if (args[i] == "-useresponse")
            {
                customPreset.useStimulus = false; isCustom = true;
            }
            else if (args[i].StartsWith("-sampleradius"))
            {
                int.TryParse(args[i].Substring(13), out customPreset.sampleRadius);
                isCustom = true;
            }
            else if (args[i].StartsWith("-image"))
            {
                if (int.TryParse(args[i].Substring(6), out int imageSelection))
                {
                    customPreset.image       = images[imageSelection];
                    customPreset.invertImage = true;
                }
                else
                {
                    // Check if this is a path
                    var filename = args[i].Substring(6);
                    if (filename[0] == '"')
                    {
                        filename = filename.Substring(1);
                    }
                    if (filename[filename.Length - 1] == '"')
                    {
                        filename = filename.Substring(0, filename.Length - 1);
                    }

                    if (System.IO.File.Exists(filename))
                    {
                        // Load this file
                        var data = System.IO.File.ReadAllBytes(filename);
                        if (data.Length > 0)
                        {
                            Texture2D tex = new Texture2D(2, 2, TextureFormat.RGBA32, false);
                            if (tex.LoadImage(data))
                            {
                                customPreset.image       = tex;
                                customPreset.invertImage = true;
                            }
                        }
                    }
                }
            }
            else if (args[i].StartsWith("-material"))
            {
                int.TryParse(args[i].Substring(9), out materialPreset);
            }
            else if (args[i].StartsWith("-octaves"))
            {
                int.TryParse(args[i].Substring(8), out customPreset.perlinOctaves);
            }
            else if (args[i].StartsWith("-amplitude"))
            {
                float.TryParse(args[i].Substring(10), out customPreset.perlinAmplitude);
            }
            else if (args[i].StartsWith("-frequency"))
            {
                float.TryParse(args[i].Substring(10), out customPreset.perlinFrequency.x);
                customPreset.perlinFrequency.y = customPreset.perlinFrequency.x;
            }
            else if (args[i].StartsWith("-scale"))
            {
                float.TryParse(args[i].Substring(6), out scale);
            }
            else if (args[i].StartsWith("-chi"))
            {
                float.TryParse(args[i].Substring(4), out customPreset.chi);
            }
            else if (args[i].StartsWith("-w"))
            {
                float.TryParse(args[i].Substring(2), out customPreset.omega);
            }
            else if (args[i].StartsWith("-c"))
            {
                float.TryParse(args[i].Substring(2), out customPreset.c1);
                float.TryParse(args[i].Substring(2), out customPreset.c2);
            }
            else if (args[i].StartsWith("-c1"))
            {
                float.TryParse(args[i].Substring(2), out customPreset.c1);
            }
            else if (args[i].StartsWith("-c2"))
            {
                float.TryParse(args[i].Substring(2), out customPreset.c2);
            }
            else if (args[i].StartsWith("-vmax"))
            {
                float.TryParse(args[i].Substring(5), out customPreset.vMax);
            }
            else if (args[i].StartsWith("-rngseed"))
            {
                if (int.TryParse(args[i].Substring(8), out seed))
                {
                    seedParam = true;
                }
            }
            else
            {
                Console.WriteLine($"Unknown argument ${args[i]}");
            }
        }

        if (isCustom)
        {
            customPreset.initialX = new Vector2(-limitX, limitX);
            customPreset.xMax     = limitX;

            var cameraController = FindObjectOfType <PSOCameraController>();
            cameraController.SetScale(limitX / 100.0f);

            activeObject = customPreset.gameObject;
        }
        else if (activeObject == null)
        {
            activeObject = randomPreset.gameObject;
            MakeRandom((seedParam)?(seed):((int)DateTime.UtcNow.Ticks));
        }

        activeObject.SetActive(true);

        PSOConfig config = activeObject.GetComponent <PSOConfig>();

        if (seedParam)
        {
            config.seed = seed;

            PSOCameraController controller = FindObjectOfType <PSOCameraController>();
            if (controller)
            {
                controller.SetSeed(seed);
            }
        }

        PSORender psoRender = activeObject.GetComponent <PSORender>();

        psoRender.playSpeed = speed;

        if (isCustom)
        {
            psoRender.displayConnectivity = connectivity;

            if ((customPreset.problem == PSOConfig.Problem.ImageSaturation) || (customPreset.problem == PSOConfig.Problem.ImageValue))
            {
                psoRender.materialOverride = materialsImage[materialPreset];
                psoRender.yScale           = -20.0f * scale;
            }
            else
            {
                psoRender.materialOverride = materialsLandscape[materialPreset];
                psoRender.yScale           = scale;
            }
            psoRender.fogOfFunction = fof;
        }
    }
Example #3
0
    override public bool Restart(int seed, float estimatedTime)
    {
        int tries    = 0;
        int maxTries = 25;

        rndGen = new System.Random(seed);

        while (tries < maxTries)
        {
            elapsedTime = 0;

            PSORender psoRender = FindObjectOfType <PSORender>();

            startLookPos = new Vector3(rndGen.Range(-1, 1), rndGen.Range(0.5f, 1.5f), rndGen.Range(-1, 1)).normalized *outerRadius *scale;

            startLookPos.y = Mathf.Max(startLookPos.y, psoRender.extentsY.y);

            PSOParticle particle = null;

            switch (targetParticle)
            {
            case TargetParticle.None:
                targetPos = rndGen.onUnitSphere() * innerRadius * scale;
                if (targetPos.y < 0)
                {
                    targetPos.y = Mathf.Abs(targetPos.y);
                }
                break;

            case TargetParticle.Best:
                particle = psoRender.GetBestParticle();
                break;

            case TargetParticle.Worst:
                particle = psoRender.GetBestParticle();
                break;

            case TargetParticle.Random:
                int index = rndGen.Range(0, psoRender.GetParticleCount());
                particle = psoRender.GetParticle(index);
                break;

            default:
                break;
            }

            transform.position = startLookPos;

            if (particle)
            {
                if (usePrediction)
                {
                    targetPos = particle.Predict(estimatedTime);
                }
                else
                {
                    particleTransform = particle.transform;
                    targetPos         = particleTransform.position;
                }

                Vector3 toTarget = targetPos - startLookPos;
                Vector3 dir      = toTarget.normalized;
                float   maxDist  = toTarget.magnitude;

                if (dir.y < -0.1f)
                {
                    // Check raycast
                    if (!Physics.Raycast(startLookPos, dir, maxDist))
                    {
                        break;
                    }
                }

                tries++;
            }
            else
            {
                Vector3 toTarget = targetPos - startLookPos;
                Vector3 dir      = toTarget.normalized;
                float   maxDist  = toTarget.magnitude;

                if (dir.y < -0.1f)
                {
                    break;
                }
            }
        }

        if (tries == maxTries)
        {
            return(false);
        }

        FixedUpdate();

        return(true);
    }