Changeset 1326 for js/standard_expdef_demo/js
- Timestamp:
- 08/25/24 01:56:48 (4 weeks ago)
- Location:
- js/standard_expdef_demo/js
- Files:
-
- 13 added
- 2 deleted
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
js/standard_expdef_demo/js/app.js
r880 r1326 12 12 constructor() { 13 13 this.scene = this.Scene(); 14 this.camera = this.Camera(); 15 this.controls = this.Controls(); 14 this.camera = this.Camera(); 16 15 this.webGLRenderer = this.WebGLRenderer(); 16 this.cameraControls = this.CameraControls(); 17 17 this.css3DRenderer = this.CSS3DRenderer(); 18 18 19 this.simulation = new Simulation(new World(this.camera, this.scene)); 19 this.args = this.parseArguments(); 20 Config.Simulation.GENOTYPE = this.args["genotype_format"]?this.args["genotype_format"]:Config.Simulation.GENOTYPE; 21 this.simulation = new Simulation(new World(this.camera, this.scene),this.args); 20 22 21 23 document.body.appendChild(this.webGLRenderer.domElement); 22 24 document.body.appendChild(this.css3DRenderer.domElement); 23 25 window.addEventListener("resize", this.onWindowResize.bind(this), false); 24 return this; 26 27 this.Controls(); 28 this.Options(); 29 this.NeuroView(); 30 this.FitnessRater(); 31 } 32 33 NeuroView(){ 34 var thisApp = this; 35 window.addEventListener('DOMContentLoaded',()=>{ 36 var neuroViewer = NeuroViewerView( Config.NeuroViewer ); 37 thisApp.simulation.neuroViewer = neuroViewer; 38 neuroViewer.make3D(); 39 }) 40 } 41 42 Controls(){ 43 var thisApp = this; 44 window.addEventListener('DOMContentLoaded', () => { 45 const controls = document.getElementsByClassName('controls')[0]; 46 thisApp.mutation_slider = new Slider( 47 controls, 48 "Mutation", 49 function(prob){ 50 thisApp.simulation.setMutationProb(parseFloat(prob)); 51 }); 52 thisApp.crossover_slider = new Slider( 53 controls, 54 "Crossover", 55 function(prob){ 56 thisApp.simulation.setCrossoverProb(parseFloat(prob)); 57 }); 58 thisApp.simulation.mutationListeners.push(thisApp.mutation_slider); 59 thisApp.simulation.crossoverListeners.push(thisApp.crossover_slider); 60 thisApp.simulation.reupdateListeners(); 61 return this; 62 }); 63 } 64 65 Options(){ 66 const encodings = this.findEncodings(); 67 68 var thisApp = this; 69 window.addEventListener('DOMContentLoaded', () => { 70 const selector = document.getElementById("genotype-selector"); 71 for(let i=0;i<encodings.length;i++){ 72 new Option(selector,encodings[i]); 73 } 74 selector.onchange = function(){ 75 thisApp.simulation.setProposedGenotype(`/*${this.value}*/`); 76 // let url = new URL(window.location.href); 77 // let params = new URLSearchParams(url.search); 78 // let paramName = "genotype_format"; 79 // let paramValue = `/*${this.value}*/`; 80 81 // if(params.has(paramName)){ 82 // params.set(paramName,paramValue); 83 // }else{ 84 // params.append(paramName,paramValue); 85 // } 86 // window.location.href = window.location.origin+'/?'+params.toString(); 87 } 88 }); 89 } 90 91 FitnessRater(){ 92 var sim = this.simulation; 93 window.addEventListener('DOMContentLoaded', ()=>{ 94 const rater = document.getElementById("fitness-rater"); 95 const thumbUp = new Button(rater,"👍",()=>{ 96 sim.updateFitness(5); 97 }); 98 const thumbDown = new Button(rater,"👎",()=>{ 99 sim.updateFitness(-5); 100 }) 101 102 sim.buttons.push(thumbUp); 103 sim.buttons.push(thumbDown); 104 }); 105 } 106 107 findEncodings(){ 108 const functionName = "GenoConv_f"; 109 return Object 110 .keys(Module) //framsticks module 111 .filter((k)=>{return k.startsWith(functionName);}) 112 .map((k)=>{return k.replace(functionName,"")[0]}); 25 113 } 26 114 … … 44 132 } 45 133 46 C ontrols() {134 CameraControls() { 47 135 /** 48 136 * Creates a new Control object alowing to steer the camera. 49 137 */ 50 let controls = new THREE.OrbitControls(this.camera);138 let controls = new OrbitControls(this.camera,this.webGLRenderer.domElement ); 51 139 controls.autoRotate = Config.Controls.AUTO_ROTATE; 52 140 controls.autoRotateSpeed = Config.Controls.AUTO_ROTATE_SPEED; … … 54 142 controls.maxDistance = Config.Controls.MAX_DISTANCE; 55 143 controls.maxPolarAngle = Config.Controls.MAX_POLAR_ANGLE; 144 controls.enableKeys = false; 56 145 controls.update(); 57 146 return controls … … 77 166 * Creates a CSS3D Renderer object used to visualize HTML+CSS components in 3D scene. 78 167 */ 79 let renderer = new THREE.CSS3DRenderer();168 let renderer = new CSS3DRenderer(); 80 169 renderer.setSize(Config.CSS3DRenderer.WIDTH, Config.CSS3DRenderer.HEIGHT); 81 170 renderer.domElement.style.position = Config.CSS3DRenderer.POSITION; 82 171 renderer.domElement.style.top = Config.CSS3DRenderer.TOP; 172 renderer.domElement.style.setProperty('pointer-events','none',''); 83 173 return renderer 84 174 } … … 98 188 requestAnimationFrame(this.render.bind(this)); 99 189 TWEEN.update(); 100 this.c ontrols.update();190 this.cameraControls.update(); 101 191 this.webGLRenderer.render(this.scene, this.camera); 102 192 this.css3DRenderer.render(this.scene, this.camera); … … 112 202 this.css3DRenderer.setSize(window.innerWidth, window.innerHeight); 113 203 } 204 205 parseArguments() { 206 /** 207 * Parses URL arguemnts 208 */ 209 210 const queryString = window.location.search; 211 const urlParams = new URLSearchParams(queryString); 212 return { 213 "mutation_prob" : parseFloat(urlParams.get("mutation_prob")), 214 "crossover_prob" : parseFloat(urlParams.get("crossover_prob")), 215 "genotype_format": urlParams.get("genotype_format") 216 }; 217 } 114 218 } 115 219 -
js/standard_expdef_demo/js/config.js
r880 r1326 11 11 CROSSOVER_PROBABILITY: 0.3, 12 12 EVOLUTION_MAX_REPETITIONS: 100, 13 GENOTYPES: [ 14 "/*4*/ #5,<<X><<X>X>X>>LLX", 15 "/*4*/ <X>l<X>l<<X>X>LLLX", 16 "/*4*/ <,<,,<,X,,>X>X>X", 17 "/*4*/ <X><X><<X>X><X>X", 18 "/*4*/ <<X>RR<<X>X>X>X", 19 "/*4*/ <<X><<X>X>X>X", 20 ], 13 NUMBER_OF_GENOTYPES: 6, 14 INITIAL_MUTATIONS: 10, 15 GENOTYPE: "/*4*/", 21 16 22 17 Timing: { … … 38 33 FITNESS_TEXT: {x: 400, y: 300, z: 485}, 39 34 EVOLVED_GENOTYPE_PLANK: {x: 400, y: 240, z: 0}, 35 NEURAL_NETWORK: {x: 400, y: 100, z: 300}, 40 36 EVOLVED_FITNESS_PLANK: {x: 400, y: 240, z: 380}, 41 37 MUTATION_GENOTYPE_PLANK: {x: 400, y: 400, z: 0}, … … 83 79 Light: { 84 80 Ambient: { 85 COLOR: 0x 8a8a8a81 COLOR: 0xffffff 86 82 }, 87 83 88 84 Directional: { 89 COLOR: 0x dfebff,90 INTENSITY: 1,85 COLOR: 0xffffff, 86 INTENSITY: 2, 91 87 X_POS: 50, 92 88 Y_POS: 200, … … 167 163 }, 168 164 165 NeuroViewer: { 166 layoutType: 2, 167 emptyLabel: "No neural network", 168 canvas: { 169 id: "neuro-viewer-canvas", 170 drawMarginInPx: 20, 171 font: "14px Lucida Grande, sans-serif", 172 strokeStyle: '#DEDEDE' 173 }, 174 }, 175 169 176 Framstick: { 170 177 COLOR: 0xcacaca, … … 174 181 CAST_SHADOW: true, 175 182 183 184 176 185 Tween: { 177 186 Scale: { … … 196 205 PART: { 197 206 defaultShape: { 198 radius: 0.213,207 radius: Module.Part.prototype.BALL_AND_STICK_RADIUS, 199 208 segments: 16 200 209 }, … … 206 215 JOINT: { 207 216 cylinderShape: { 208 radius: 0.1, 217 thickness: 0.8, 218 radius: undefined, // if undefined -> depends on Part radius 209 219 radiusSegments: 10, 210 220 isTransparent: false, … … 239 249 HEIGHT: 65, 240 250 THICKNESS: 10, 241 TEXTURE: " https://raw.githubusercontent.com/mrdoob/three.js/dev/examples/textures/hardwood2_diffuse.jpg",251 TEXTURE: "js/hardwood2_diffuse_brighter.jpg", 242 252 REPEAT: 3, 243 253 ANISOTROPY: 8, … … 264 274 HEIGHT: 65, 265 275 THICKNESS: 10, 266 TEXTURE: " https://raw.githubusercontent.com/mrdoob/three.js/dev/examples/textures/hardwood2_diffuse.jpg",276 TEXTURE: "js/hardwood2_diffuse_brighter.jpg", 267 277 REPEAT: 1, 268 278 ANISOTROPY: 8, … … 288 298 LENGTH: 100, 289 299 FACES: 32, 290 TEXTURE: "https://raw.githubusercontent.com/mrdoob/three.js/dev/examples/textures/hardwood2_diffuse.jpg",300 TEXTURE: "js/hardwood2_diffuse_brighter.jpg", 291 301 REPEAT: 1, 292 302 ANISOTROPY: 8, … … 323 333 } 324 334 }; 335 336 337 if (!Config.Framstick.Geometry.JOINT.cylinderShape.radius) { 338 Config.Framstick.Geometry.JOINT.cylinderShape.radius = Config.Framstick.Geometry.PART.defaultShape.radius * Config.Framstick.Geometry.JOINT.cylinderShape.thickness; 339 } -
js/standard_expdef_demo/js/external/framsjs/visualization/jointmeshfactory.js
r880 r1326 102 102 let shape = joint.get_shape(); 103 103 104 if (this.jointShapes['SHAPE_ FIXED'].value == shape) {105 result = this.getNewJointMesh(joint, this.config. linkShape);104 if (this.jointShapes['SHAPE_STICK'].value == shape) { 105 result = this.getNewJointMesh(joint, this.config.cylinderShape); 106 106 } else { 107 result = this.getNewJointMesh(joint, this.config.cylinderShape);107 result = this.getNewJointMesh(joint, this.config.linkShape); 108 108 } 109 109 -
js/standard_expdef_demo/js/external/framsjs/visualization/transformations.js
r880 r1326 17 17 getPartShapes() { 18 18 let shapes = []; 19 shapes["SHAPE_BALL _AND_STICK"] = { name: "Ball & Stick", value: Module.Part["SHAPE_BALL_AND_STICK"] };19 shapes["SHAPE_BALL"] = { name: "Ball", value: Module.Part["SHAPE_BALL"] }; 20 20 shapes["SHAPE_ELLIPSOID"] = { name: "Elipsoid", value: Module.Part["SHAPE_ELLIPSOID"] }; 21 21 shapes["SHAPE_CUBOID"] = { name: "Cuboid", value: Module.Part["SHAPE_CUBOID"] }; … … 30 30 getJointShapes() { 31 31 let shapes = []; 32 shapes["SHAPE_ BALL_AND_STICK"] = { name: "Ball & Stick", value: Module.Joint["SHAPE_BALL_AND_STICK"] };32 shapes["SHAPE_STICK"] = { name: "Stick", value: Module.Joint["SHAPE_STICK"] }; 33 33 shapes["SHAPE_FIXED"] = { name: "Fixed", value: Module.Joint["SHAPE_FIXED"] }; 34 shapes["SHAPE_HINGE_X"] = { name: "Fixed", value: Module.Joint["SHAPE_HINGE_X"] }; 35 shapes["SHAPE_HINGE_XY"] = { name: "Fixed", value: Module.Joint["SHAPE_HINGE_XY"] }; 34 36 return shapes; 35 37 } … … 100 102 */ 101 103 calcColorComponent(value) { 102 return THREE.Math .clamp(value, 0, 1);104 return THREE.MathUtils.clamp(value, 0, 1); 103 105 } 104 106 … … 151 153 152 154 let m = new THREE.Matrix4(); 153 m.makeRotationZ(THREE.Math .degToRad(90));155 m.makeRotationZ(THREE.MathUtils.degToRad(90)); 154 156 155 157 let m2 = new THREE.Matrix4(); … … 242 244 part.get_scale().get_x(), 243 245 part.get_scale().get_z()); 244 } else if (this.partShapes['SHAPE_BALL _AND_STICK'].value != shape) {246 } else if (this.partShapes['SHAPE_BALL'].value != shape) { 245 247 bodyElement.mesh.scale.set( 246 248 part.get_scale().get_x(), -
js/standard_expdef_demo/js/simulation/core.js
r880 r1326 10 10 */ 11 11 12 constructor(world ) {12 constructor(world, args) { 13 13 this.world = world; 14 this.buttons = []; 14 15 15 16 this.genPoolText = this.getText("Genotype Pool", EVOLUTION_METHOD_TEXT_POSITION); … … 22 23 this.fitnessText = this.getText("Fitness", Config.Simulation.Element.Position.FITNESS_TEXT); 23 24 25 this.genotypeEncoding = Config.Simulation.GENOTYPE; 26 this.proposedGenotypeEncoding = undefined; 27 24 28 this.world.scene.add(this.genPoolText); 25 29 this.world.scene.add(this.mutationText); … … 31 35 this.world.scene.add(this.fitnessText); 32 36 37 this.world.createTable(this.createGenotypes(Config.Simulation.NUMBER_OF_GENOTYPES,Config.Simulation.INITIAL_MUTATIONS),this.genotypeEncoding); 38 33 39 this.state = State.INITIAL; 34 40 this.timing = Config.Simulation.Timing.INITIAL; 41 42 this.mutationProb = 0; 43 this.mutationListeners = []; 44 this.setMutationProb(args.mutation_prob?args.mutation_prob:Config.Simulation.MUTATION_PROBABILITY); 45 46 this.crossoverProb = 0; 47 this.crossoverListeners = []; 48 this.setCrossoverProb(args.crossover_prob?args.crossover_prob:Config.Simulation.CROSSOVER_PROBABILITY); 49 50 this.neuroLayoutModel = undefined; 51 this.neuroLayoutFunctionHelper = new Module.NNLayoutFunctionHelper(); 52 this.neuroViewer = undefined; 53 54 this.evolvedFitness = 0; 55 56 this.lastTimeout = undefined; 57 } 58 59 activateButtons(){ 60 for(let i=0;i<this.buttons.length;i++){ 61 this.buttons[i].activate(); 62 } 63 } 64 65 deactivateButtons(){ 66 for(let i=0;i<this.buttons.length;i++){ 67 this.buttons[i].deactivate(); 68 } 69 } 70 71 updateListeners(list,value){ 72 for(let i=0;i<list.length;i++){ 73 list[i].update(value); 74 } 75 } 76 77 reupdateListeners(){ 78 this.updateListeners(this.mutationListeners,this.mutationProb); 79 this.updateListeners(this.crossoverListeners,this.crossoverProb); 80 } 81 82 getMutationProb(){ 83 return this.mutationProb; 84 } 85 setMutationProb(prob){ 86 this.mutationProb = Math.min(Math.max(prob,0),1); 87 if(this.crossoverProb + this.mutationProb > 1){ 88 this.setCrossoverProb(1 - this.mutationProb); 89 } 90 this.updateListeners(this.mutationListeners,this.mutationProb); 91 } 92 93 getCrossoverProb(){ 94 return this.crossoverProb; 95 } 96 setCrossoverProb(prob){ 97 this.crossoverProb = Math.min(Math.max(prob,0),1); 98 if(this.crossoverProb + this.mutationProb > 1){ 99 this.setMutationProb(1 - this.crossoverProb); 100 } 101 this.updateListeners(this.crossoverListeners,this.crossoverProb); 102 } 103 104 updateNeuroLayoutModel(model) { 105 if( this.neuroLayoutModel ) { 106 Module.destroy( this.neuroLayoutModel ); 107 } 108 this.neuroLayoutModel = new Module.NNLayoutState_Model_Fred( model ); 109 this.neuroLayoutFunctionHelper.doLayout( Config.NeuroViewer.layoutType , this.neuroLayoutModel ); 110 } 111 112 getBrainData (model) { 113 var thisSim = this; 114 return { 115 getElements: function () { 116 return thisSim.neuroLayoutModel.GetElements(); 117 }, 118 getValueXYWH: function ( i ) { 119 return thisSim.neuroLayoutModel.GetValueXYWH( i ); 120 }, 121 getNeuro: function ( i ) { 122 return model.getNeuro( i ); 123 } 124 }; 125 } 126 127 updateFitness(value){ 128 // if (this.state !== State.SHOW_FRAMSTICK && this.state !== State.DESTROY_FRAMSTICK){ 129 // return; 130 // } 131 this.evolvedFitness += value; 132 this.evolvedFitness = Math.max(this.evolvedFitness,0); 133 if(this.evolvedFitnessPlank){ 134 this.evolvedFitnessPlank.updateFitness(this.evolvedFitness); 135 } 136 } 137 138 isGenotypeChanging(){ 139 return this.proposedGenotypeEncoding && this.proposedGenotypeEncoding !== this.genotypeEncoding; 35 140 } 36 141 … … 43 148 this.state = State.EVOLUTION_METHOD_SELECTION; 44 149 this.timing = Config.Simulation.Timing.INITIAL; 150 151 if(this.isGenotypeChanging()){ 152 this.state = State.CHANGE_GENOTYPE; 153 } 154 45 155 break; 46 156 … … 50 160 this.timing = Config.Simulation.Timing.EVOLUTION_METHOD_SELECTION; 51 161 let randomVal = Math.random() 52 if (randomVal < Config.Simulation.MUTATION_PROBABILITY) {162 if (randomVal < this.mutationProb) { 53 163 this.state = State.MUTATION_GENOTYPE_SELECTION; 54 } else if (randomVal < Config.Simulation.MUTATION_PROBABILITY+55 Config.Simulation.CROSSOVER_PROBABILITY){164 } else if (randomVal < this.mutationProb + 165 this.crossoverProb){ 56 166 this.state = State.CROSSOVER_GENOTYPE_SELECTION; 57 167 } else { … … 65 175 this.hideText(this.genPoolText); 66 176 67 this.mutationIdx = parseInt(Math.random() * Config.Simulation.GENOTYPES.length);177 this.mutationIdx = this.chooseIdx(); 68 178 this.mutationArrow = this.getArrow(this.mutationIdx).mesh; 69 179 this.world.scene.add(this.mutationArrow); … … 100 210 this.hideText(this.genPoolText); 101 211 102 this.cloningIdx = parseInt(Math.random() * Config.Simulation.GENOTYPES.length);212 this.cloningIdx = this.chooseIdx(); 103 213 this.cloningArrow = this.getArrow(this.cloningIdx).mesh; 104 214 this.world.scene.add(this.cloningArrow); … … 135 245 this.hideText(this.genPoolText); 136 246 137 this.crossoverIdx1 = parseInt(Math.random() * Config.Simulation.GENOTYPES.length);247 this.crossoverIdx1 = this.chooseIdx(); 138 248 do { 139 this.crossoverIdx2 = parseInt(Math.random() * Config.Simulation.GENOTYPES.length);249 this.crossoverIdx2 = this.chooseIdx(); 140 250 } while (this.crossoverIdx1 == this.crossoverIdx2); 141 251 … … 175 285 176 286 case State.SHOW_FRAMSTICK: 287 this.activateButtons(); 177 288 this.moveCamera(Config.Simulation.Camera.Position.FRAMSTICK); 178 289 179 290 this.evolvedFramstick = new Framstick(this.evolvedGenotype); 291 const model = this.evolvedFramstick.getModelFromGenotype(this.evolvedGenotype); 180 292 this.world.scene.add(this.evolvedFramstick.mesh); 181 293 294 this.updateNeuroLayoutModel(model); 295 this.neuroViewer.updateBrain(this.getBrainData(model)); 296 Module.destroy(model); 182 297 this.timing = Config.Simulation.Timing.SHOW_FRAMSTICK; 183 298 this.state = State.DESTROY_FRAMSTICK; … … 187 302 this.evolvedFramstick.scaleUpSize = 0.01; 188 303 this.evolvedFramstick.scaleDownSize = 0.01; 304 this.neuroViewer.clear(); 305 this.world.scene.remove(this.neuroViewer.get3DContainer()); 189 306 190 307 this.showText(this.fitnessText); … … 195 312 this.evolvedFitnessPlank.move(Config.Simulation.Element.Position.EVOLVED_FITNESS_PLANK); 196 313 this.evolvedFitnessPlank.rotate(Config.Simulation.Element.Angle.SIDE_VIEW); 197 this.world.scene.add(this.evolvedFitnessPlank.mesh) 198 this.world.scene.add(this.evolvedFitnessPlank.textMesh) 314 this.world.scene.add(this.evolvedFitnessPlank.mesh); 315 this.world.scene.add(this.evolvedFitnessPlank.textMesh); 316 199 317 200 318 this.timing = Config.Simulation.Timing.DESTROY_FRAMSTICK; … … 207 325 } 208 326 break; 327 case State.CHANGE_GENOTYPE: 328 this.genotypeEncoding = this.proposedGenotypeEncoding; 329 this.world.setGenotypes(this.createGenotypes(Config.Simulation.NUMBER_OF_GENOTYPES,Config.Simulation.INITIAL_MUTATIONS),this.genotypeEncoding); 330 this.proposedGenotypeEncoding = undefined; 331 332 this.state = State.INITIAL; 333 break; 209 334 } 210 211 setTimeout(this.run.bind(this), this.timing); 212 } 213 214 getMutatedGenotype(genotype) { 215 let genoF4 = new Module.Geno_f4(); 216 let genoOperatorsHelper = new Module.GenoOperatorsHelper(genoF4); 335 if(this.isGenotypeChanging()){ 336 this.timing = 0; 337 } 338 this.lastTimeout = setTimeout(this.run.bind(this), this.timing); 339 } 340 341 setProposedGenotype(proposed){ 342 this.proposedGenotypeEncoding = proposed; 343 if (this.lastTimeout){ 344 clearTimeout(this.lastTimeout); 345 this.run(); 346 } 347 } 348 349 chooseIdx(){ 350 return this.weightedChoice(); 351 } 352 353 randomChoice(){ 354 return parseInt(Math.random() * Config.Simulation.NUMBER_OF_GENOTYPES); 355 } 356 357 weightedChoice(){ 358 const fitness = this.world.table.fitnessPlanks 359 .map((k)=>{ 360 return parseFloat(k.fitness)+0.0001; 361 }); 362 const fitness_sum = fitness.reduce((partialSum, a) => partialSum + a, 0); 363 const probs = fitness 364 .map((k)=>{ 365 return k/fitness_sum; 366 }); 367 368 var prob = Math.random(); 369 for(let i=0;i<probs.length;i++){ 370 if(prob < probs[i]){ 371 return i; 372 } 373 prob -= probs[i]; 374 } 375 return -1; 376 } 377 378 createGenotypes(n,mutation_count){ 379 var func = this.getOperator(this.genotypeEncoding); 380 let genoOper = new func(); 381 let genoOperatorsHelper = new Module.GenoOperatorsHelper(genoOper); 382 var genotypes = []; 383 384 for(let i=0;i<n;i++){ 385 var genotype = genoOperatorsHelper.getSimplest(); 386 genotypes.push(this.mutate(genotype,genoOperatorsHelper,mutation_count)); 387 } 388 389 return genotypes; 390 } 391 392 getOperator(genoName){ 393 const genoType = genoName.replace("/*","").replace("*/",""); 394 var func = Module[`Geno_f${genoType}`]; 395 func = func?func:Module[`GenoOper_f${genoType}`]; 396 return func; 397 } 398 399 getMutatedGenotype(genotype){ 400 var func = this.getOperator(this.genotypeEncoding); 401 let genoOper = new func(); 402 let genoOperatorsHelper = new Module.GenoOperatorsHelper(genoOper); 403 genotype = this.mutate(genotype,genoOperatorsHelper,1); 404 Module.destroy(genoOper); 405 Module.destroy(genoOperatorsHelper); 406 return genotype; 407 } 408 409 mutate(genotype,genoOperatorsHelper,times) { 410 for(let i = 0;i<times;i++){ 411 genotype = this.tryMutation(genotype,genoOperatorsHelper); 412 } 413 return genotype; 414 } 415 416 tryMutation(genotype,genoOperatorsHelper){ 417 let genetics = new Module.PreconfiguredGenetics(); 418 let iteration = 0; 419 do { 420 if (genoOperatorsHelper.mutate(genotype.replace(this.genotypeEncoding, "")) == 0) { 421 let mutated = genoOperatorsHelper.getLastMutateGeno().c_str(); 422 let newGenotype = `${this.genotypeEncoding}` + mutated; 423 424 let stringObj = new Module.SString(); 425 stringObj.set(newGenotype); 426 let genoObj = new Module.Geno(stringObj); 427 428 if (genoObj.isValid()) { 429 genotype = newGenotype; 430 iteration = Config.Simulation.EVOLUTION_MAX_REPETITIONS; 431 } 432 433 Module.destroy(stringObj); 434 Module.destroy(genoObj); 435 } else { 436 iteration = Config.Simulation.EVOLUTION_MAX_REPETITIONS; 437 } 438 iteration += 1; 439 } while(iteration < Config.Simulation.EVOLUTION_MAX_REPETITIONS); 440 441 return genotype; 442 } 443 444 getCrossoveredGenotype(genotype1, genotype2) { 445 var func = this.getOperator(this.genotypeEncoding); 446 let genoOper = new func(); 447 let genoOperatorsHelper = new Module.GenoOperatorsHelper(genoOper); 217 448 let genetics = new Module.PreconfiguredGenetics(); 218 449 let iteration = 0; 219 450 220 451 do { 221 if (genoOperatorsHelper.mutate(genotype.replace("/*4*/", "")) == 0) { 222 let mutated = genoOperatorsHelper.getLastMutateGeno(); 223 let newGenotype = "/*4*/ " + mutated; 452 if (genoOperatorsHelper.crossOver(genotype1.replace(this.genotypeEncoding, ""), 453 genotype2.replace(this.genotypeEncoding, "")) == 0) { 454 let crossovered = genoOperatorsHelper.getLastCrossGeno1().c_str(); 455 let newGenotype = `${this.genotypeEncoding}` + crossovered; 456 224 457 225 458 let stringObj = new Module.SString(); … … 228 461 229 462 if (genoObj.isValid()) { 230 genotype = newGenotype;463 genotype1 = newGenotype; 231 464 iteration = Config.Simulation.EVOLUTION_MAX_REPETITIONS; 232 465 } … … 240 473 } while(iteration < Config.Simulation.EVOLUTION_MAX_REPETITIONS); 241 474 242 Module.destroy(genoF4); 243 Module.destroy(genoOperatorsHelper); 244 return genotype; 245 } 246 247 getCrossoveredGenotype(genotype1, genotype2) { 248 let genoF4 = new Module.Geno_f4(); 249 let genoOperatorsHelper = new Module.GenoOperatorsHelper(genoF4); 250 let genetics = new Module.PreconfiguredGenetics(); 251 let iteration = 0; 252 253 do { 254 if (genoOperatorsHelper.crossOver(genotype1.replace("/*4*/", ""), 255 genotype2.replace("/*4*/", "")) == 0) { 256 let crossovered = genoOperatorsHelper.getLastCrossGeno1(); 257 let newGenotype = "/*4*/ " + crossovered; 258 259 let stringObj = new Module.SString(); 260 stringObj.set(newGenotype); 261 let genoObj = new Module.Geno(stringObj); 262 263 if (genoObj.isValid()) { 264 genotype1 = newGenotype; 265 iteration = Config.Simulation.EVOLUTION_MAX_REPETITIONS; 266 } 267 268 Module.destroy(stringObj); 269 Module.destroy(genoObj); 270 } else { 271 iteration = Config.Simulation.EVOLUTION_MAX_REPETITIONS; 272 } 273 iteration += 1; 274 } while(iteration < Config.Simulation.EVOLUTION_MAX_REPETITIONS); 275 276 Module.destroy(genoF4); 475 Module.destroy(genoOper); 277 476 Module.destroy(genoOperatorsHelper); 278 477 return genotype1; … … 280 479 281 480 showEvolutionResult() { 282 this.evolvedGenotypePlank = new GenotypePlank(this.evolvedGenotype, 10);481 this.evolvedGenotypePlank = new GenotypePlank(this.evolvedGenotype, this.genotypeEncoding, 10); 283 482 this.evolvedGenotypePlank.move(Config.Simulation.Element.Position.EVOLVED_GENOTYPE_PLANK); 284 483 this.evolvedGenotypePlank.rotate(Config.Simulation.Element.Angle.SIDE_VIEW); 484 485 this.neuroViewer.move(Config.Simulation.Element.Position.NEURAL_NETWORK); 486 this.neuroViewer.rotate(Config.Simulation.Element.Angle.SIDE_VIEW); 285 487 this.world.scene.add(this.evolvedGenotypePlank.mesh); 286 488 this.world.scene.add(this.evolvedGenotypePlank.textMesh); 489 this.world.scene.add(this.neuroViewer.get3DContainer()); 287 490 288 491 if (this.evolutionMethod == State.MUTATION_GENOTYPE_SELECTION) { … … 302 505 303 506 evolutionReturn() { 304 let replaceIdx = parseInt(Math.random() * Config.Simulation. GENOTYPES.length);507 let replaceIdx = parseInt(Math.random() * Config.Simulation.NUMBER_OF_GENOTYPES); 305 508 let genotypePlank = this.world.table.genotypePlanks[replaceIdx]; 306 509 let fitnessPlank = this.world.table.fitnessPlanks[replaceIdx]; … … 322 525 this.world.table.genotypePlanks[replaceIdx] = this.evolvedGenotypePlank; 323 526 this.world.table.fitnessPlanks[replaceIdx] = this.evolvedFitnessPlank; 527 this.evolvedFitnessPlank = undefined; 324 528 this.hideText(this.fitnessText); 529 this.deactivateButtons(); 325 530 } 326 531 … … 378 583 "CROSSOVER_SIDE_VIEW": 9, "CROSSOVER_RESULT": 10, "CROSSOVER_RETURN": 11, 379 584 "DESTROY_FRAMSTICK": 12, "CLONING_GENOTYPE_SELECTION": 13, 380 "CLONING_SIDE_VIEW": 14, "CLONING_RESULT": 15, "CLONING_RETURN": 16 585 "CLONING_SIDE_VIEW": 14, "CLONING_RESULT": 15, "CLONING_RETURN": 16, 586 "CHANGE_GENOTYPE": 17 381 587 }; 382 588 383 589 var EVOLUTION_METHOD_TEXT_POSITION = { 384 590 x: -210, 385 y: 80 + (Config.Table.FitnessPlank.HEIGHT + Config.Table.Board.SPACING) * (Config.Simulation. GENOTYPES.length+ 1),591 y: 80 + (Config.Table.FitnessPlank.HEIGHT + Config.Table.Board.SPACING) * (Config.Simulation.NUMBER_OF_GENOTYPES + 1), 386 592 z: -500 387 593 }; -
js/standard_expdef_demo/js/world/core.js
r880 r1326 17 17 this.sky = this.Sky(); 18 18 this.sun = this.Sun(); 19 this.table = this.Table();20 19 } 21 20 … … 25 24 texture.repeat.set(Config.Ground.REPEAT, Config.Ground.REPEAT); 26 25 texture.anisotropy = Config.Ground.ANISOTROPY; 26 texture.colorSpace = THREE.SRGBColorSpace; 27 27 28 let geometry = new THREE.Plane BufferGeometry(Config.Ground.WIDTH, Config.Ground.WIDTH);28 let geometry = new THREE.PlaneGeometry(Config.Ground.WIDTH, Config.Ground.WIDTH); 29 29 let material = new THREE.MeshLambertMaterial({map: texture}); 30 30 let ground = new THREE.Mesh(geometry, material); … … 36 36 } 37 37 38 Table() { 39 let table = new Table(Config.Simulation.GENOTYPES); 38 createTable(genotypes,genotypeEncoding){ 39 this.table = this.Table(genotypes,genotypeEncoding); 40 } 41 42 setGenotypes(genotypes, genotypeEncoding){ 43 this.table.genotypes = genotypes; 44 for (let i = 0; i < this.table.genotypes.length; i++) { 45 this.scene.remove(this.table.genotypePlanks[i].textMesh); 46 // this.table.genotypePlanks[i] = new GenotypePlank(genotypes[i],genotypeEncoding,i); 47 this.table.genotypePlanks[i].updateGenotype(genotypes[i],genotypeEncoding); 48 this.scene.add(this.table.genotypePlanks[i].textMesh); 49 this.table.fitnessPlanks[i].updateFitness((Math.random() * 100).toFixed(2)); 50 } 51 } 52 53 Table(genotypes,genotypeEncoding) { 54 let table = new Table(genotypes,genotypeEncoding); 40 55 this.scene.add(table.board); 41 56 this.scene.add(table.genotypeHeader.mesh); … … 76 91 77 92 Sky() { 78 let sky = new THREE.Sky()93 let sky = new Sky() 79 94 sky.scale.setScalar(Config.Sky.SCALE); 80 95 sky.material.uniforms.turbidity.value = Config.Sky.TURBIDITY; 81 96 sky.material.uniforms.rayleigh.value = Config.Sky.RAYLEIGH; 82 97 // sky.material.uniforms.luminance.value = Config.Sky.LUMINANCE; 83 98 sky.material.uniforms.mieCoefficient.value = Config.Sky.MIE_COEFFICIENT; 84 99 sky.material.uniforms.mieDirectionalG.value = Config.Sky.MIE_DIRECTIONAL_G; … … 89 104 Sun() { 90 105 let sun = new THREE.Mesh( 91 new THREE.Sphere BufferGeometry(Config.Sun.RADIUS, Config.Sun.WIDTH_SEGMENTS, Config.Sun.HEIGHT_SEGMENTS),106 new THREE.SphereGeometry(Config.Sun.RADIUS, Config.Sun.WIDTH_SEGMENTS, Config.Sun.HEIGHT_SEGMENTS), 92 107 new THREE.MeshBasicMaterial({color: Config.Sun.COLOR}) 93 108 ); -
js/standard_expdef_demo/js/world/object/arrow.js
r880 r1326 22 22 let material = new THREE.MeshLambertMaterial({map: texture}); 23 23 material.opacity = 0; 24 material.blending = THREE.NoBlending;24 // material.blending = THREE.NoBlending; 25 25 26 26 this.mesh = new THREE.Mesh(geometry, material); -
js/standard_expdef_demo/js/world/object/framstick.js
r880 r1326 112 112 } 113 113 114 let model = new Module.Model(genoObj, true); 114 let model = new Module.Model(genoObj, Module.Model["SHAPETYPE_UNKNOWN"], true); 115 model.open(); 116 model.close(); 115 117 Module.destroy(stringObj); 116 118 Module.destroy(genoObj); -
js/standard_expdef_demo/js/world/object/table.js
r880 r1326 10 10 */ 11 11 12 constructor(genotypes) { 13 this.genotypes = genotypes 12 constructor(genotypes,genotypeType) { 13 this.genotypes = genotypes; 14 this.genotypeType = genotypeType; 14 15 15 16 this.board = this.Board(); … … 25 26 texture.repeat.set(Config.Table.Board.REPEAT, Config.Table.Board.REPEAT); 26 27 texture.anisotropy = Config.Table.Board.ANISOTROPY; 28 texture.colorSpace = THREE.SRGBColorSpace; 27 29 28 30 let geometry = new THREE.BoxGeometry(Config.Table.Board.WIDTH, … … 32 34 let material = new THREE.MeshLambertMaterial({map: texture}); 33 35 material.opacity = 0; 34 material.blending = THREE.NoBlending;36 // material.blending = THREE.NoBlending; 35 37 36 38 let board = new THREE.Mesh(geometry, material); … … 46 48 let planks = [] 47 49 for (let i = 0; i < this.genotypes.length; i++) { 48 planks.push(new GenotypePlank(this.genotypes[i], i));50 planks.push(new GenotypePlank(this.genotypes[i],this.genotypeType, i)); 49 51 } 50 52 return planks … … 60 62 61 63 GenotypeHeader() { 62 return new GenotypePlank("Genotype", this.genotypes.length, true)64 return new GenotypePlank("Genotype",this.genotypeType, this.genotypes.length, true) 63 65 } 64 66 … … 71 73 class GenotypePlank { 72 74 73 constructor(genotype, position, bold) {75 constructor(genotype, genotypeEncoding, position, bold) { 74 76 this.genotype = genotype; 75 77 this.position = { … … 83 85 texture.repeat.set(Config.Table.GenotypePlank.REPEAT, Config.Table.GenotypePlank.REPEAT); 84 86 texture.anisotropy = Config.Table.GenotypePlank.ANISOTROPY; 87 texture.colorSpace = THREE.SRGBColorSpace; 85 88 86 89 let geometry = new THREE.BoxGeometry(Config.Table.GenotypePlank.WIDTH, … … 94 97 this.mesh.receiveShadow = Config.Table.GenotypePlank.RECEIVE_SHADOW; 95 98 96 this.textMesh = Text.getGenotypeMesh(this.genotype.replace("/*4*/ ", "")); 99 this.genotypeType = genotypeEncoding; 100 this.textMesh = Text.getGenotypeMesh(this.genotype,this.genotypeType); 97 101 if (bold == true) { 98 this.textMesh = Text.getFitnessMesh(this.genotype.replace( "/*4*/ ", ""));102 this.textMesh = Text.getFitnessMesh(this.genotype.replace(`${this.genotypeType} `, "")); 99 103 } 100 104 this.textMesh.position.set(this.position.x, this.position.y, this.position.z + 1); 105 } 106 107 updateGenotype(genotype,genotypeType){ 108 this.genotype = genotype; 109 this.genotypeType = genotypeType; 110 this.textMesh = Text.getGenotypeMesh(this.genotype,this.genotypeType); 111 this.textMesh.position.set(this.position.x, this.position.y, this.position.z + 1); 101 112 } 102 113 … … 137 148 texture.repeat.set(Config.Table.FitnessPlank.REPEAT, Config.Table.FitnessPlank.REPEAT); 138 149 texture.anisotropy = Config.Table.FitnessPlank.ANISOTROPY; 150 texture.colorSpace = THREE.SRGBColorSpace; 139 151 140 152 let geometry = new THREE.BoxGeometry(Config.Table.FitnessPlank.WIDTH, … … 150 162 this.textMesh = Text.getFitnessMesh(this.fitness); 151 163 this.textMesh.position.set(this.position.x, this.position.y, this.position.z + 1); 164 } 165 166 updateFitness(value){ 167 this.fitness = value; 168 this.textMesh.element.innerHTML = roundNumber(this.fitness,2); 152 169 } 153 170 -
js/standard_expdef_demo/js/world/object/text.js
r880 r1326 6 6 7 7 var Text = { 8 getGenotypeMesh: function(genotype) { 8 styleRegex: /<style>.*<\/style>/, 9 numberRegex : /-?\d+(\.\d+)?/g, 10 roundMatch: function(match) { 11 return roundNumber(match,2).toString(); 12 }, 13 14 getGenotypeMesh: function(genotype,genotypeType) { 15 const genman = new Module.GenMan(); 16 genotype = genotype.replace(this.numberRegex, this.roundMatch); 17 genotype = genotype.replaceAll("\n","⤶"); 9 18 if (genotype.length > 20) { 10 genotype = genotype.slice(0, 20) + "..."19 genotype = genotype.slice(0,30) + "..." 11 20 } 12 21 var element = document.createElement("div"); 13 element.className = "genotype"; 14 element.textContent = genotype; 15 return new THREE.CSS3DObject(element); 22 element.innerHTML = genman.HTMLize(genotype).c_str(); 23 element.innerHTML = element.innerHTML.replace(this.styleRegex,"").replace(genotypeType,""); 24 Module.destroy(genman); 25 return new CSS3DObject(element); 16 26 }, 17 27 … … 20 30 element.className = "fitness"; 21 31 element.textContent = fitness; 22 return new THREE.CSS3DObject(element);32 return new CSS3DObject(element); 23 33 }, 24 34 … … 27 37 element.className = "info"; 28 38 element.textContent = info; 29 return new THREE.CSS3DObject(element);39 return new CSS3DObject(element); 30 40 } 31 41 }
Note: See TracChangeset
for help on using the changeset viewer.