-
Notifications
You must be signed in to change notification settings - Fork 222
Ch 2 - Add Performance measure visualisation #133
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
base: master
Are you sure you want to change the base?
Changes from 1 commit
b75caaf
70ec10e
183709f
d9f8434
3d426d2
88cef71
a2b435e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
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,217 @@ 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 makePerformanceControlledDaigramAgent1(){ | ||
let diagram = makeDiagram('#performance-controlled-diagram-agent1 svg'); | ||
var dirt_freq = getRulesFromPage()[0]; | ||
var score_agent1 = 0; | ||
var performance = []; | ||
|
||
function update() { | ||
let location = diagram.world.location; | ||
let percept = diagram.world.floors[location].dirty; | ||
let table = getRulesFromPage(); | ||
dirt_freq = table[0]; | ||
let action = reflexVacuumAgent(diagram.world, table); | ||
setTimeout(function(){ if(action=='SUCK'){ score_agent1 = score_agent1+50; } | ||
else{ score_agent1 = score_agent1-10; } | ||
if(diagram.world.floors[0].dirty || diagram.world.floors[1].dirty) | ||
{ score_agent1 = score_agent1-5; } | ||
performance.push(score_agent1); | ||
diagram.world.simulate(action); | ||
renderWorld(diagram); | ||
renderAgentPercept(diagram, percept); | ||
renderAgentAction(diagram, action);},table[1]*1000); | ||
plotPerformance1(performance); | ||
} | ||
|
||
function makefloordirty() { | ||
floorNumber = Math.floor(Math.random() * 2); | ||
diagram.world.markFloorDirty(floorNumber); | ||
diagram.floors[floorNumber].attr('class', 'dirty floor'); | ||
} | ||
|
||
|
||
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; | ||
return [dirt_freq, speed_agent1] | ||
} | ||
|
||
update(); | ||
setInterval(makefloordirty,dirt_freq[0]*1000); | ||
setInterval(update, STEP_TIME_MS); | ||
|
||
} | ||
|
||
|
||
function makePerformanceControlledDaigramAgent2(){ | ||
let diagram = makeDiagram('#performance-controlled-diagram-agent2 svg'); | ||
var stats_agent2 = getRulesFromPage(); | ||
var score_agent2 = 0; | ||
var performance = []; | ||
|
||
function update() { | ||
let location = diagram.world.location; | ||
let percept = diagram.world.floors[location].dirty; | ||
let table = getRulesFromPage(); | ||
stats_agent2 = table; | ||
let action = reflexVacuumAgent(diagram.world, table); | ||
setTimeout(function(){ if(action=='SUCK'){ score_agent2 = score_agent2+50; } | ||
else{ score_agent2 = score_agent2-10; } | ||
if(diagram.world.floors[0].dirty || diagram.world.floors[1].dirty) | ||
{ score_agent2 = score_agent2-5-2*parseInt(stats_agent2[0]); } | ||
// extra score reduction due to agent2 working for a shorter duration | ||
performance.push(score_agent2); | ||
diagram.world.simulate(action); | ||
renderWorld(diagram); | ||
renderAgentPercept(diagram, percept); | ||
renderAgentAction(diagram, action);},table[1]*1000); | ||
plotPerformance2(performance); | ||
} | ||
|
||
function getRulesFromPage() { | ||
let table = d3.select("#performance-controlled-diagram table"); | ||
let dirt_freq = table.select("[data-action=dirt-freq] 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_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.world.markFloorDirty(floorNumber); | ||
diagram.floors[floorNumber].attr('class', 'dirty floor'); | ||
} | ||
|
||
var agent2_interval; | ||
|
||
function run(){ | ||
agent2_interval = setInterval(update,1000); | ||
} | ||
|
||
//stats_agent2[2] is the inteval in which the agent works which can be set up by the reader. | ||
function executeAgent2(){ | ||
clearInterval(agent2_interval); | ||
setTimeout(run,5000); | ||
|
||
} | ||
executeAgent2(); | ||
setInterval(makefloordirty,stats_agent2[0]*1000); | ||
setInterval(executeAgent2,5000+stats_agent2[2]*1000) | ||
} | ||
|
||
|
||
//Plotting the performance of the agents on a dynamic line chart | ||
//--TODO-- DRY code may be prevented by declaring the variables with proper scope. | ||
function plotPerformance1(performance){ | ||
var performance = performance; | ||
|
||
var dps = []; // dataPoints | ||
var chart = new CanvasJS.Chart("chartContainer", { | ||
title :{ | ||
text: "Performance of Agent1" | ||
}, | ||
axisY: { | ||
includeZero: false | ||
}, | ||
data: [{ | ||
type: "line", | ||
dataPoints: dps | ||
}] | ||
}); | ||
|
||
var xVal = 0; | ||
var yVal = 0; | ||
var updateInterval = STEP_TIME_MS; | ||
var dataLength = performance.length; // number of dataPoints visible at any point | ||
|
||
var updateChart = function (count) { | ||
|
||
count = count || 1; | ||
|
||
for (var j = 0; j < count; j++) { | ||
yVal = performance[j]; | ||
dps.push({ | ||
x: xVal, | ||
y: yVal | ||
}); | ||
xVal++; | ||
} | ||
|
||
if (dps.length > dataLength) { | ||
dps.shift(); | ||
} | ||
|
||
chart.render(); | ||
dps = []; | ||
}; | ||
|
||
updateChart(dataLength); | ||
setInterval(function(){updateChart()}, updateInterval); | ||
|
||
|
||
} | ||
|
||
|
||
function plotPerformance2(performance){ | ||
var performance = performance; | ||
|
||
var dps = []; // dataPoints | ||
var chart = new CanvasJS.Chart("chartContainer2", { | ||
title :{ | ||
text: "Performance of Agent2" | ||
}, | ||
axisY: { | ||
includeZero: false | ||
}, | ||
data: [{ | ||
type: "line", | ||
dataPoints: dps | ||
}] | ||
}); | ||
|
||
var xVal = 0; | ||
var yVal = 0; | ||
var updateInterval = STEP_TIME_MS; | ||
var dataLength = performance.length; // number of dataPoints visible at any point | ||
|
||
var updateChart = function (count) { | ||
|
||
count = count || 1; | ||
|
||
for (var j = 0; j < count; j++) { | ||
yVal = performance[j]; | ||
dps.push({ | ||
x: xVal, | ||
y: yVal | ||
}); | ||
xVal++; | ||
} | ||
|
||
if (dps.length > dataLength) { | ||
dps.shift(); | ||
} | ||
|
||
chart.render(); | ||
dps= []; | ||
}; | ||
|
||
updateChart(dataLength); | ||
setInterval(function(){updateChart()}, updateInterval); | ||
|
||
|
||
} | ||
|
||
makeAgentControlledDiagram(); | ||
makeReaderControlledDiagram(); | ||
makeTableControlledDiagram(); | ||
makePerformanceControlledDaigramAgent1(); | ||
makePerformanceControlledDaigramAgent2(); |
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.