道德引擎——灾难来临,你够资格登上诺亚方舟?墨尔本大学《java面向对象》结辩作业
Posted 爱做梦的鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了道德引擎——灾难来临,你够资格登上诺亚方舟?墨尔本大学《java面向对象》结辩作业相关的知识,希望对你有一定的参考价值。
目录
写在前面
做完这个作业,我有点心态崩了,本题目大意世界末日来了,谁能上亚诺方舟,是医生这种高级职业?还是小孩妇女?
我在做的时候使劲告诉自己要冷静冷静再冷静,但是做选择的时候,我还是会首先救自己,其次救人类,然后医生、科学家,然后孕妇。我很难过,因为我考虑了好久,但最后的统计结果还是这样的,只救人类,动物不可怜吗?只救医生、科学家,难道平凡而又平凡的打工人就不值得救么?为什么?不是大家经常说平凡而伟大么?
最后我还是无法接受,但好像可以理解,简单来说不就是优胜略汰嘛,生活中有好多类似的场景,就比如职场上,老板选择辞退一部分人的话,肯定会选择那批不好的,可怜吗?可怜!有所谓吗?没所谓。好好提升自己吧。
代码我会放到本专栏的其他文章中给大家参考,本文太长了,再写代码就要爆了。
介绍
道德引擎的想法基于电车困境,这是一个虚构的场景,向决策者呈现道德困境:选择“两害相权取其轻”。 该场景需要一辆自动驾驶汽车,它在人行横道时刹车失灵。 由于现在放弃对汽车乘客的控制为时已晚,汽车需要根据有关情况的现有事实做出决定。 下图显示了一个示例场景。
在这个项目中,您将创建一个道德引擎,一个旨在探索不同场景的程序,构建一个算法来在汽车乘客的生活与行人的生活之间做出决定,通过模拟审核您的决策算法,并允许 程序的用户自己判断结果。
上面的场景示例:一辆自动驾驶汽车接近人行横道,但它的刹车失败了。 您的算法需要在两种情况之间做出决定。 左:汽车将继续向前行驶并驶过十字路口,导致一名老人、一名孕妇、一名男孩和一只狗丧生。 右图:汽车会突然转向并撞上混凝土障碍物,导致乘客死亡:一名妇女、一名男子和一名婴儿。 请注意,行人在穿越绿色信号灯时遵守法律(图片来源:http://moralmachine.mit.edu/)。
前言:面向对象设计
在这个最终项目中,您将需要遵循整个学期教授和讨论的面向对象编程的最佳实践。
创建包和类时,请仔细考虑哪些成员(类、实例变量或方法)应该放在何处,并确保在代码中正确使用多态、继承和封装。
入门代码 (EthicalEngine) 中为您提供了一个类,必须将其用作您的程序的入口点。 您将需要添加额外的类,可能还需要添加一个包,以使您的代码更加模块化。
该项目需要大量时间,因此请确保您做出相应的计划! 在开发软件时,时间管理至关重要。 尽早开始,不要把它留到最后一周来启动您的 IDE!
准备好!多加小心! 祝一切顺利!
项目设置
带有标志的程序启动
我们将使用命令行选项或所谓的标志来初始化 EthicalEngines 的执行。 因此,您需要添加更多选项作为可能的命令行参数。
因此,您的程序运行如下:
$ java EthicalEngine [arguments]
Print Help
Make sure your program provides a help documentation to tell users how to correctly call and execute your program. The help is a printout on the console telling users about each option that your program supports.
The following program calls should invoke the help:
$ java EthicalEngine --help
or
$ java EthicalEngine -h
调用帮助后的命令行输出应如下所示:
EthicalEngine - COMP90041 - Final Project
Usage: java EthicalEngine [arguments]
Arguments:
-c or --config Optional: path to config file
-h or --help Optional: print Help (this message) and exit
-l or --log Optional: path to data log file
当 --help 或 -h 标志被设置,或者 --config 或 --log 标志被设置而没有参数(即没有提供路径)时,应该显示帮助。 标志 --config 或 -c 告诉您的程序有关包含预定义方案的配置文件的路径和文件名。 标志–log 或-l 表示场景和用户判断应保存到的路径和文件名。 稍后再谈。
可以使用多个标志并且它们的顺序可以互换,例如:
$ java EthicalEngine -c config.csv -l logfile.log
相当于
$ java EthicalEngine -l logfile.log -c config.csv
EthicalEngine.java 类
代码框架中提供的这个类包含 main 方法并管理您的程序执行。它需要处理如上所述的程序参数。
这个类还包含 decide 方法,它实现了决策算法。
决策算法
您的任务是实现 public static method decide(Scenario scenario)
,该方法返回枚举类型 Decision 的值,该值可以是 PEDESTRIANS 或 PASSENGERS。 您的代码必须为任何场景选择要拯救的对象。
为了做出决定,您的算法需要考虑所涉及角色的属性以及情况。 在做出决定时,您可以考虑任何角色的特征(年龄、体型、职业、宠物等),但您必须根据至少 5 个特征做出决定——来自场景本身(例如,它是否是 合法的交叉点)或来自角色的属性。 请注意,设计算法的方式没有对错之分。 执行在这里很重要,因此请确保您的代码符合技术规范。 但是您可能需要考虑算法设计选择的后果。
主菜单
程序启动后,主菜单会显示一个欢迎屏幕:您的程序应该读入并显示welcome.ascii
的内容给用户,而无需对其进行修改。 该消息提供了有关道德引擎的背景信息,并引导用户完成程序流程。
主菜单将构成系统的核心,并将控制程序的整体流程。
当您的程序运行时,它应该显示以下输出:
$ javac *.java
$ java EthicalEngine -c config.csv
__-------__
/ _---------_ \\
/ / \\ \\
| | | |
|_|___________|_|
/-\\| |/-\\
| _ |\\ 0 /| _ |
|(_)| \\ ! / |(_)|
|___|__\\_____!_____/__|___|
[_______|COMP90041|_______]
|||| ~~~~~~~~~ ||||
`--' `--'
$$$$$$$$\\ $$\\ $$\\ $$\\ $$\\
$$ _____|$$ | $$ | \\__| $$ |
$$ | $$$$$$\\ $$$$$$$\\ $$\\ $$$$$$$\\ $$$$$$\\ $$ |
$$$$$\\ \\_$$ _| $$ __$$\\ $$ |$$ _____|\\____$$\\ $$ |
$$ __| $$ | $$ | $$ |$$ |$$ / $$$$$$$ |$$ |
$$ | $$ |$$\\ $$ | $$ |$$ |$$ | $$ __$$ |$$ |
$$$$$$$$\\ \\$$$$ |$$ | $$ |$$ |\\$$$$$$$\\\\$$$$$$$ |$$ |
\\________| \\____/ \\__| \\__|\\__| \\_______|\\_______|\\__|
$$$$$$$$\\ $$\\
$$ _____| \\__|
$$ | $$$$$$$\\ $$$$$$\\ $$\\ $$$$$$$\\ $$$$$$\\ $$$$$$$\\
$$$$$\\ $$ __$$\\ $$ __$$\\ $$ |$$ __$$\\ $$ __$$\\ $$ _____|
$$ __| $$ | $$ |$$ / $$ |$$ |$$ | $$ |$$$$$$$$ |\\$$$$$$\\
$$ | $$ | $$ |$$ | $$ |$$ |$$ | $$ |$$ ____| \\____$$\\
$$$$$$$$\\ $$ | $$ |\\$$$$$$$ |$$ |$$ | $$ |\\$$$$$$$\\ $$$$$$$ |
\\________|\\__| \\__| \\____$$ |\\__|\\__| \\__| \\_______|\\_______/
$$\\ $$ |
\\$$$$$$ |
\\______/
Welcome to Ethical Engines!
The idea of Ethical Engines is based on the Trolley Dilemma, a fictional scenario presenting a decision-maker with a moral dilemma: choosing 'the lesser of two evils'. The scenario entails an autonomous car whose brakes fail at a pedestrian crossing. As it is too late to relinquish control to the car's passengers, the car needs to make a decision. Now.
The answers are not straightforward. There are a number of variables at play, which influence how people may feel about the decision: the number of pedestrians or passengers, whether the pedestrians are crossing the street legally, and personal characteristics that our autonomous car can somehow infer (people's bodytype, profession, gender, age, etc.). This program is a thought experiment, which explores how decisions should be made by auditing algorithms and collecting user feedback. You, the user of this program, will be put into (im)possible situations, left to decide about life and death.
N Scenarios imported.
Please enter one of the following commands to continue:
- judge scenarios: [judge] or [j]
- run simulations with the in-built decision algorithm: [run] or [r]
- show audit from history: [audit] or [a]
- quit the program: [quit] or [q]
>
这个初始输出由两部分组成:
-
欢迎文本,您需要从启动代码中提供给您的文件中获取
-
从
config
文件导入的场景数。N
表示数字。 如果程序启动时未提供config
文件,则应删除此行。 -
解释用户应该如何使用终端的初始消息,然后是命令提示符“>”,等待用户输入命令并按回车键继续。
读取配置文件
您的程序需要支持从config
文件导入场景。 运行程序时,可以选择将config
文件的路径作为命令行参数提供:
$ java EthicalEngine --config path/to/config.csv
or
$ java EthicalEngine -c path/to/config.csv
上面的这些程序调用是等效的,您的程序都应该支持它们。
标志 --config
或 -c
后面的命令行参数分别指定配置文件(在本例中为 config.csv)所在的文件路径。 您的程序应检查文件是否位于指定位置,并在文件不存在的情况下处理 FileNotFoundException。 在这种情况下,您的程序应终止并显示以下错误消息:
ERROR: could not find config file.
如果没有提供配置参数,您的程序需要随机创建自己的场景。
解析配置文件
接下来,您的程序需要读入配置文件。 下表列出了所提供的 config.csv
的内容,即所谓的逗号分隔值 (CSV) 文件。 该文件包含一个值列表,每个值用逗号分隔。
从表中可以看出,第一行包含标题,即每个数据字段的名称(和描述),因此可以被您的程序忽略。每一行都代表一个角色或场景的实例。场景前面有一行,以场景开头:并指示场景描述的是合法(绿色)还是非法(红色)过境点。在这种情况下,第一个场景描述了一个合法的交叉路口(场景:绿色),有 3 名乘客和 4 名行人(其中一个是狗)。事实上,第一个数据集描述了引言中图中描绘的场景。第二个场景描述了一个有 4 名行人(2 只动物)和 2 名汽车乘客的非法穿越。
您的 EthicalEngine
类需要能够解析配置文件并为用户判断或模拟创建场景。 请注意,配置文件可以包含任意数量的场景以及任意数量的乘客和行人。 您可以假设所有配置文件都遵循表中所示的相同列顺序。
处理无效数据行
在逐行读取配置文件时,您的程序可能会遇到三种类型的异常,您的程序应该能够处理这些异常:
1. 无效的数据格式
你需要处理每行数据字段数无效的异常情况:如果一行中的值数小于或超过 10 个值,则应抛出 InvalidDataFormatException
。 您的程序应该通过向命令行发出以下警告语句来处理此类异常,跳过相应的行,并继续阅读下一行。
WARNING: invalid data format in config file in line X
2. 数字格式无效
这是指单元格中的无效数据类型:如果该值无法转换为现有数据类型(例如,int 应为年龄的字符),则应抛出 NumberFormatException
。 您的程序应该通过向命令行发出以下警告语句来处理此类异常,改为分配默认值,然后继续该行中的下一个值。
WARNING: invalid number format in config file in line X
3. 无效的字段值
如果您的程序不包含特定值 (e.g., skinny as a bodyType)应抛出 InvalidCharacteristicException
。 您的程序应该通过向命令行发出以下警告语句来处理此类异常,改为分配默认值,然后继续该行中的下一个值。
WARNING: invalid characteristic in config file in line X
请注意,X 描述了配置文件中发现错误的行号。
判断场景
当用户从主菜单中选择 [judge] 或 [j] 时,应执行以下程序序列:
- 收集用户同意保存数据
- 从配置或随机生成的当前场景
- 显示统计
- 保存判断的场景和决定(如果允许)
- 重复或返回:显示更多场景或返回主菜单
1. 收集用户同意
首先,您的程序应该在保存任何结果之前征得用户的同意。 明确同意对于确保用户了解任何类型的数据收集至关重要。 因此,您的程序应该在记录任何用户对文件的响应之前征求明确的用户同意。 因此,在显示第一个场景之前,您的程序应该在命令行上提示用户以下问题:
Do you consent to have your decisions saved to a file? (yes/no)
只有当用户确认(是)时,你的程序才应该将用户场景和用户的判断都保存到日志文件中(如果命令行标志(–log)没有明确设置文件名,将结果保存到默认文件夹中的ethicsengines.log。)如果用户选择否,您的程序应该正常运行,但不会将用户的任何决定写入文件(尽管它仍应在命令行上显示统计信息)。如果用户输入 除了 yes 或 no 之外,应该抛出 InvalidInputException
并且应该通过显示以下内容再次提示用户:
Invalid response. Do you consent to have your decisions saved to a file? (yes/no)
2. 当前场景
一旦用户同意(或不同意),场景判断就开始了。 因此,场景要么从配置文件中导入,要么(如果未指定配置文件)随机生成。
场景包含有关汽车乘客、街道上的行人以及行人是否合法过马路的所有相关信息。 下面是一个合法过马路的例子:
======================================
# Scenario
======================================
Legal Crossing: yes
Passengers (4)
- cat is pet
- overweight child male
- average senior female
- athletic adult ceo female pregnant
Pedestrians (3)
- average baby male
- average adult doctor male
- overweight adult homeless female
这是另一个例子,你在车里,一个(非怀孕的)女人和行人在红灯过马路(非法过马路):
======================================
# Scenario
======================================
Legal Crossing: no
Passengers (2)
- you average baby male
- average adult criminal female
Pedestrians (2)
- average senior male
- average senior female
请注意,字符的属性以小写形式书写并以单个空格分隔。 您的输出必须符合如下所述的输出规格:
角色属性
场景中的角色是场景的参与者。 他们要么是行人,要么是乘客。 对于这个项目,您只需要考虑人类和动物。 他们有一些共同点,但在其他方面有所不同。 以下是您需要考虑的一些共享属性:
每个角色都有一个age,应将其视为类不变量,以下语句始终为真:年龄 >= 0。
gender:必须至少包括值 FEMALE
和 MALE
以及默认选项 UNKNOWN
,但如果您愿意,也可以涵盖更多不同的选项。
bodyType:必须包括值 AVERAGE
、ATHLETIC
和 OVERWEIGHT
以及默认选项 UNSPECIFIED
。
人类
更具体地说,场景中居住着具有以下特征的人类:
ageCategory: depending on the age, each human should be categorized into one of the following:
- BABY: a human with an age between 0 and 4.
- CHILD: a human with an age between 5 and 16.
- ADULT: a human with an age between 17 and 68.
- SENIOR: a human with an age above 68.
humans tend to have a profession. In these scenarios, you should include the following values:
- DOCTOR
- CEO
- CRIMINAL(罪犯)
- HOMELESS
- UNEMPLOYED(失业)
- NONE as default
请注意,只有成人才有职业,其他年龄类别应归类为NONE
。 此外,您的任务是提出至少两个您认为可行的职业类别。
此外,女性人类可以pregnant(怀孕)。 将其视为另一个类不变量,其中男性不能怀孕,只有成年女性才能怀孕。
现在,您也可以成为场景的一部分。 您只能是人类并且代表您的程序的用户。 在每种情况下,您只能出现一次,但不必参与其中。
当打印到命令行时,人类有特定的输出格式。 无论您是否添加任何自定义特征,在给定场景中,必须对人类进行如下描述:
[you] <bodyType> <age category> [profession] <gender> [pregnant]
请注意,方括号 [] 中的属性应仅在适用时显示,例如婴儿没有职业,因此,不显示职业。
下面是一个例子:
athletic adult doctor female
或者
average adult doctor female pregnant
同样,这里有一个如果人类是你的例子:
you average baby male
请注意,单词是小写的,并用单个空格分隔。 输出中将忽略年龄,而不忽略年龄类别。
动物
最后,动物是我们生活环境的一部分。人们遛宠物,因此请确保您的计划考虑到这些。 动物不具有人类特有的特征,但具有以下特定属性:
species(物种):这表明动物代表什么类型的物种,例如,猫或狗。
pet(宠物):动物可以是宠物。 如果是这样,则需要在场景中提及。
当打印到命令行时,动物也有特定的输出格式,应遵循以下规范:
<species> [is pet]
下面是一个具体的例子:
cat is pet
这是动物不是宠物的另一个例子:
bird
请注意,单词是小写的,由单个空格分隔,并且在动物的输出中忽略了 age, gender, 和 bodyType
场景属性
场景中有乘客和行人。 此外,场景应表明过马路是否合法,即行人穿越绿灯。 当打印到命令行时,场景应遵循以下格式:
======================================
# Scenario
======================================
Legal Crossing: <yes/no>
Passengers (# of passengers)
- <character as described above>
.
.
Pedestrians (# of pedestrians)
- <character as described above>
.
.
以下是合法过马路(绿灯)的示例:
======================================
# Scenario
======================================
Legal Crossing: yes
Passengers (4)
- cat is pet
- overweight child male
- average senior female
- athletic adult ceo female pregnant
Pedestrians (3)
- average baby male
- average adult doctor male
- overweight adult homeless female
您的输出必须符合这些输出规格。
为用户判断,如所述在命令行中一一呈现场景。 每个场景后面都应该有以下提示:
Who should be saved? (passenger(s) [1] or pedestrian(s) [2])
应考虑以下任何用户输入来拯救乘客:
- passenger
- passengers
- 1
应考虑以下任何用户输入来拯救行人:
- pedestrian
- pedestrians
- 2
用户做出决定后,会显示下一个场景,然后是另一个判断场景的提示。 此过程应重复,直到显示和判断 3 个场景为止。 在第三个场景决策之后,呈现结果统计。
随机场景生成
如果你的程序执行时没有提供配置文件,则需要随机生成。 为了保证一组平衡的场景,将尽可能多的元素随机化是至关重要的,包括每个场景中涉及的人类和动物的数量和特征以及场景本身(例如,它是否是合法的穿越), 以及you是否在其中。
行人和乘客的最少数量应分别为 1。 最大数量可以是 60(例如,想想半自动公交车)。
3. 显示统计
该统计量是累积性的,即它考虑了迄今为止已判断的所有场景(不仅仅是前 3 个场景)。 它应该列出许多因素,包括:
- age category
- gender
- body type
- profession
- pregnancy
- whether it’s humans or animals
- species
- pets
- legality (red or green light)
- pedestrian or passenger
您的统计数据应该考虑给定场景中存在的每个特征的每个值。例如,如果您有超重体型的场景,则必须在统计中列出超重。如果您的任何场景都不包含此特定身体类型,则不得在此处列出。另外,如果测试场景中有猫,请确保只更新猫的统计信息。如果给定场景中没有猫,则您不能更改统计中幸存的猫的数量。以下是如何计算猫的统计数据的示例:
其中 C 是猫幸存者的数量,
N
c
N_c
Nc 是场景中猫的总数。 这是身体类型的另一个示例:
其中 B 代表体型 b 的人数,
N
b
N_b
Nb 代表所有场景中出现的体型 b 的总数。 您需要自己为其余特征构建相应的公式。 下面的示例输出将为您提供一些进一步的提示。
The default values unknown (gender), unspecified (body type), and none (profession) should not be listed in the statistic. 此外,以下特征只有在与人类有关时才应纳入统计数据:
- age category
- gender
- body type
- profession
- pregnancy
这些特征的统计数据中没有表示动物。 动物只应在以下情况下计数:
- class type (human or animal)
- species
- pets
- legality (red or green light)
- pedestrian or passenger
这是统计的输出格式(带伪代码):
======================================
# Statistic
======================================
- % SAVED AFTER <# of runs> RUNS
<for each characterstic:>
<characterstic>: <survival ratio>
--
average age: <average>
以下是运行提供的 config.csv 的示例输出(请注意,在运行您的程序时,用户可能会做出不同的决定,从而导致不同的统计数据):
======================================
# Statistic
======================================
- % SAVED AFTER 2 RUNS
animal: 1.00
bird: 1.00
cat: 1.00
ceo: 1.00
child: 1.00
dog: 1.00
pedestrians: 1.00
pet: 1.00
senior: 1.00
athletic: 0.67
red: 0.67
male: 0.60
green: 0.58
average: 0.50
baby: 0.50
doctor: 0.50
human: 0.50
pregnant: 0.50
female: 0.40
adult: 0.34
criminal: 0.00
overweight: 0.00
passengers: 0.00
unemployed: 0.00
you: 0.00
--
average age: 30.40
特征列表必须按存活率的降序排序。 所有比率都显示为小数点后两位数(四舍五入到第二位小数)。 如果有平局,请确保继续按字母顺序排序。 请注意,最后两行不是排序统计的一部分,而是在输出中的固定位置。 平均年龄是根据所有human幸存者计算的,并以相同的方式四舍五入。
如果用户运行多个场景块(每个 3 个),请确保更新您的统计数据而不是覆盖它。
4. 保存判断的场景
如果用户之前同意收集数据,您应该将每个场景和用户的决定保存到日志文件中。 如果在执行程序时明确提供了文件路径和名称(–log),则应附加(而不是覆盖)数据。 如果未指定路径,您的程序应写入默认文件夹中的ethicsengine.log。 如何设计日志文件的格式取决于您,但它必须以 ASCII 代码保存,即人类可读的。 如果该文件不存在,您的程序应该创建它。 如果文件路径变量指定的目录不存在,您的程序应该在命令行打印以下错误消息并终止:
ERROR: could not print results. Target directory does not exist.
日志文件将保留所有场景和做出的判断的历史记录。 它将构成审计的基础。
5. 重复或返回
根据统计信息,应提示用户继续一组新场景或返回主菜单:
Would you like to continue? (yes/no)
如果用户选择否,程序将返回主菜单。 判断的场景应该被重置,这意味着,如果用户返回判断场景,将创建一个新的统计数据。 但是,保存的文件历史记录(如果同意)将继续。
如果用户决定继续(是),则应显示接下来的三个场景(或者如果剩下的少于三个,则显示剩余的)。 如果在任何时候,配置文件不包含更多场景,则应显示最终统计信息,然后是退出提示,如下所示:
======================================
# Statistic
======================================
- % SAVED AFTER 3 RUNS
cat: 1.00
pregnant: 1.00
you: 1.00
senior: 0.67
passengers: 0.60
female: 0.50
pet: 0.50
average: 0.37
animal: 0.34
adult: 0.29
green: 0.28
human: 0.27
male: 0.24
pedestrians: 0.16
athletic: 0.00
ceo: 0.00
child: 0.00
criminal: 0.00
dog: 0.00
homeless: 0.00
overweight: 0.00
unemployed: 0.00
--
average age: 67.25
That's all. Press Enter to return to main menu.
运行模拟
模拟基本上通过您的决策算法运行场景。 如果提供了配置文件,则应评估其中包含的每个场景,并应显示一项综合统计数据。 统计数据遵循与前面描述的相同的结构,随后会提示用户返回主菜单,例如:
======================================
# Statistic
======================================
- % SAVED AFTER 3 RUNS
cat: 1.00
pregnant: 1.00
you: 1.00
senior: 0.67
passengers: 0.60
female: 0.50
pet: 0.50
average: 0.37
animal: 0.34
adult: 0.29
green: 0.28
human: 0.27
male: 0.24
pedestrians: 0.16
athletic: 0.00
ceo: 0.00
child: 0.00
criminal: 0.00
dog: 0.00
homeless: 0.00
overweight: 0.00
unemployed: 0.00
--
average age: 67.25
That's all. Press Enter to return to main menu.
如果未提供配置文件,则应显示以下提示以请求应为模拟创建的场景数量:
<以上是关于道德引擎——灾难来临,你够资格登上诺亚方舟?墨尔本大学《java面向对象》结辩作业的主要内容,如果未能解决你的问题,请参考以下文章
道德引擎——灾难来临,你够资格登上诺亚方舟?墨尔本大学《java面向对象》结辩作业
道德引擎——灾难来临,你够资格登上诺亚方舟?墨尔本大学《java面向对象》结辩作业
摩根大通银行被黑客攻克, ATM机/网银危在旦夕,winxp退市灾难来临了