-
Notifications
You must be signed in to change notification settings - Fork 219
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Ch 2 - Add Performance measure visualisation #133
base: master
Are you sure you want to change the base?
Changes from 6 commits
b75caaf
70ec10e
183709f
d9f8434
3d426d2
88cef71
a2b435e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -68,6 +68,7 @@ function makeDiagram(selector) { | |
function renderWorld(diagram) { | ||
for (let floorNumber = 0; floorNumber < diagram.world.floors.length; floorNumber++) { | ||
diagram.floors[floorNumber].attr('class', diagram.world.floors[floorNumber].dirty? 'dirty floor' : 'clean floor'); | ||
|
||
} | ||
diagram.robot.style('transform', `translate(${diagram.xPosition(diagram.world.location)}px,100px)`); | ||
} | ||
|
@@ -233,7 +234,144 @@ function makeTableControlledDiagram() { | |
} | ||
} | ||
|
||
/*Control the daigram based on the performance parameters set | ||
by the reader that the AI is supposed to follow.The animation flow | ||
is similar to the first agent controlled diagram but there is an | ||
additional table UI that lets the reader view the percepts and actions | ||
being followed as well as change the rules followed by the agent. | ||
*/ | ||
function makePerformanceControlledDaigram(){ | ||
//variable declarations for the agents | ||
let diagram_agent1 = makeDiagram('#performance-controlled-diagram-agent1 svg'); | ||
let diagram_agent2 = makeDiagram('#performance-controlled-diagram-agent2 svg'); | ||
var parameters = getRulesFromPage(); //reader defined agent parameters | ||
var score_agent1 = 0; | ||
var score_agent2 = 0; | ||
var performance_agent1 = []; | ||
var performance_agent2 = []; | ||
var agent2_interval; | ||
|
||
//update agent1's environment | ||
function update_agent1() { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The code for updating agent1 and the code for updating agent2 are almost the same. These two should use shared code. |
||
let location = diagram_agent1.world.location; | ||
let percept = diagram_agent1.world.floors[location].dirty; | ||
let table = getRulesFromPage(); | ||
let action = reflexVacuumAgent(diagram_agent1.world, table); | ||
setTimeout(function(){ if(action=='SUCK'){ score_agent1 = score_agent1+50; } | ||
else{ score_agent1 = score_agent1-10; } | ||
if(diagram_agent1.world.floors[0].dirty || diagram_agent1.world.floors[1].dirty) | ||
{ score_agent1 = score_agent1-5; } | ||
performance_agent1.push(score_agent1); | ||
diagram_agent1.world.simulate(action); | ||
renderWorld(diagram_agent1); | ||
renderAgentPercept(diagram_agent1, percept); | ||
renderAgentAction(diagram_agent1, action);},table[1]*1000); | ||
} | ||
|
||
//update agent2's environment | ||
function update_agent2() { | ||
let location = diagram_agent2.world.location; | ||
let percept = diagram_agent2.world.floors[location].dirty; | ||
let table = getRulesFromPage(); | ||
let action = reflexVacuumAgent(diagram_agent2.world, table); | ||
setTimeout(function(){ if(action=='SUCK'){ score_agent2 = score_agent2+50; } | ||
else{ score_agent2 = score_agent2-10; } | ||
if(diagram_agent2.world.floors[0].dirty || diagram_agent2.world.floors[1].dirty) | ||
{ score_agent2 = score_agent2-5-parseInt(parameters[0]); } | ||
// extra score reduction due to agent2 working for a shorter duration | ||
performance_agent2.push(score_agent2); | ||
diagram_agent2.world.simulate(action); | ||
renderWorld(diagram_agent2); | ||
renderAgentPercept(diagram_agent2, percept); | ||
renderAgentAction(diagram_agent2, action);},table[1]*1000); | ||
} | ||
|
||
//print performace scores | ||
//setInterval(plotPerformance(performance_agent1, performance_agent2),STEP_TIME_MS); | ||
setInterval(function(){ plotPerformance(performance_agent1, performance_agent2); },STEP_TIME_MS); | ||
|
||
//get reader defined parameters | ||
function getRulesFromPage() { | ||
let table = d3.select("#performance-controlled-diagram table"); | ||
let dirt_freq = table.select("[data-action=dirt-freq] select").node().value; | ||
let speed_agent1 = table.select("[data-action=speed-agent1] select").node().value; | ||
let speed_agent2 = table.select("[data-action=speed-agent2] select").node().value; | ||
let interval_agent2 = table.select("[data-action=interval-agent2] select").node().value; | ||
return [dirt_freq, speed_agent1, speed_agent2, interval_agent2] | ||
} | ||
|
||
function makefloordirty() { | ||
floorNumber = Math.floor(Math.random() * 2); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this a local or a global? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I made some mistakes while setting the scopes of the variable. I will correct it with other changes and be more careful in the future. |
||
diagram_agent1.world.markFloorDirty(floorNumber); | ||
diagram_agent1.floors[floorNumber].attr('class', 'dirty floor'); | ||
diagram_agent2.world.markFloorDirty(floorNumber); | ||
diagram_agent2.floors[floorNumber].attr('class', 'dirty floor'); | ||
} | ||
setInterval(makefloordirty,parameters[0]*1000); | ||
|
||
//control agent1's state | ||
update_agent1(); | ||
setInterval(update_agent1, STEP_TIME_MS); | ||
|
||
//control agent2's state | ||
function controlAgent2(){ | ||
clearInterval(agent2_interval); | ||
setTimeout(function(){ agent2_interval = setInterval(update_agent2,1000); },5000); | ||
|
||
} | ||
controlAgent2(); | ||
setInterval(controlAgent2,5000+parameters[3]*1000) //parameter[3] defines the working interval of agent2 | ||
|
||
} | ||
|
||
//Plotting the performance of the agents on a dynamic line chart | ||
var label = [0,1,2,3]; | ||
var index = 3; | ||
function plotPerformance(performanceAgent1, performanceAgent2){ | ||
var performance_agent1 = performanceAgent1; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What is the purpose of this? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I decided to put this array to make the y-axis of the chart more readable. |
||
var performance_agent2 = performanceAgent2; | ||
var ctx = document.getElementById('chartContainer').getContext('2d'); | ||
if(performance_agent1.length != 0 || performance_agent2.length != 0){ | ||
var chart = new Chart(ctx, { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is there no way to reuse the Chart object? The animations are very distracting! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I tried to work on it as it was previously mentioned by you, but was unable to do so. I don't know if it is possible to do so. |
||
type: 'line', | ||
|
||
data: { | ||
labels: label, | ||
datasets: [{ | ||
label: "Performance Agent1", | ||
backgroundColor: 'rgb(255, 99, 132)', | ||
borderColor: 'rgb(255, 99, 132)', | ||
data: performance_agent1, | ||
fill: false, | ||
}, | ||
{ | ||
label: "Performance Agent2", | ||
backgroundColor: 'rgb(0, 99, 132)', | ||
borderColor: 'rgb(0, 99, 132)', | ||
data: performance_agent2, | ||
fill: false, | ||
} | ||
] | ||
}, | ||
|
||
|
||
options: { | ||
scales: { | ||
yAxes: [{ | ||
ticks: { | ||
beginAtZero:true | ||
} | ||
}] | ||
} | ||
} | ||
}); | ||
index++; | ||
label.push(index); | ||
} | ||
|
||
} | ||
|
||
makeAgentControlledDiagram(); | ||
makeReaderControlledDiagram(); | ||
makeTableControlledDiagram(); | ||
makePerformanceControlledDaigram(); |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -33,9 +33,10 @@ class World { | |
|
||
// Rules are defined in code | ||
function reflexVacuumAgent(world) { | ||
if (world.floors[world.location].dirty) { return 'SUCK'; } | ||
if (world.floors[world.location].dirty) { return 'SUCK'; } | ||
else if (world.location == 0) { return 'RIGHT'; } | ||
else if (world.location == 1) { return 'LEFT'; } | ||
else if (world.location == 1) { return'LEFT'; } | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't understand what you're trying to do with the change to this function There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It was a mistake I might have committed when I was working to implement the visualization. |
||
return action; | ||
} | ||
|
||
// Rules are defined in data, in a table indexed by [location][dirty] | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please check spelling, punctuation, spacing everywhere.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, I will surely correct them.