我正在寻找一种合适的算法来解决时间调度问题.首先,我将概述问题本身,然后在第二部分,我将给出我正在考虑解决方案的方向.我正在尝试解决这个问题,因为我对这些问题感兴趣,并且因为同样的问题可以在以后用更多的变量和更大的设置来解决.
我想对电池进行一些测试,以了解它们在连接到负载时的响应方式.并在尽可能短的时间内完成所有测试.这里的两个重要变量是:
总组合:一个电池4 x 7 = 28
测试应该进行的顺序如下:充电到100%,放电到所需的SoC,放松,放电到新的SoC测量
示例:我们希望看到电池在放电达到2小时的同时从75%放电到50%时的反应
电池现在可以再次放松,并从50%到25%开始测量.它不必再次充电至100%.
现在我将概述一些可能发生的情况以及在这种情况下必须采取的措施.
可以使用已执行的测试来初始化问题(这很重要,因为我们可能希望在中途重新安排).如果电池具有已知状态(SoC /松弛),我们可以使用它.如果SoC未知,那么电池必须充电.如果放松未知但SoC已知,那么电池必须放松至少24小时.
将电池放入充电器必须手动完成.将电池留在充电器中不是问题.充电大约需要2.5小时.每个电池都有自己的专用充电器,但将来我们可能会有更多的电池充电器,因此算法需要能够采用不同数量的充电器.
放松可以简单地通过不将电池连接到任何东西来完成,因此它不需要任何特殊设备.在松弛时间段开始之前,必须对电池施加压力(=连接到放电器).我们不确定压力期将持续多长时间,但我们假设将电池放电1%所需的时间就足够了.99%将成为我们可以准确确定放松时间的第一个SoC.
目前只有一个放电器,但算法应该能够采用不同数量的放电器.将电池放入放电器必须手动完成(也取出).但是,如果将电池放入放电器,则无需立即将电池放电.可以将时间设置为在特定时间开始.当排出足够的能量时,放电器可以自动停止.可以从查找表估计放电时间的估计.这不是线性的,因此75%至50%不必花费相同的时间,从25%到0%.查找相当准确(2.5小时差异大约5分钟).
如果取出所有放电器,电池可以等待,但是等待放电器会增加放松时间.因此,如果弛豫时间高于必须执行的测量所需的弛豫时间,则它必须放电到较低的电荷水平并再次松弛,或者必须再次充电.
如果安全地取出所有充电器,电池可以等待,这里没有任何惩罚/劣势,除此之外没有时间等待.
必须手动完成的事情只能在办公时间(星期一至星期五8:30-17:00)完成.因此,例如将电池放入放电器必须手动完成.然后在夜晚的设定时间(电池放松后),可以在计时器上启动放电器,然后第二天早上到达办公室时,电池可以放入充电器.
我不确定我是否正在考虑正确的方向,因为我还没有工作解决方案.所以部件中的任何东西都可能是错误的..
任务序列很重要,因为不同的序列可能会引入比另一个序列更多或更少的等待时间.因此,对于只有一个28次测试的电池,这将是28的排列!这是一个相当大的数字.因此,对问题空间的详尽搜索是不可行的.我所知道的唯一可以在这些问题上给出相当好结果的算法是遗传算法.虽然有所有的限制和可能性,我不能只使用经典的遗传算法.我读过一些(研究)论文,最终对排列Flowshop调度问题(PFSP)的描述产生了最多的共鸣(各种来源).虽然提到扩展作业车间调度问题(EJSSP)在这里也非常有趣.
我看到的最大问题是办公时间限制.如果不是因为调度可能类似于仅将块拟合到时隙中(即使插槽具有动态大小).我不确定处理这种约束的最佳方法是什么.要么我可以将机器(放电器)建模为两个独立的机器,每个机器在不同时刻都是活动的,或者我可以引入假工作,以便机器不能被正常工作带走.
这只是在这一点上的猜测,因为我缺乏经验.我更像是一个务实的程序员,而不是一个学者,我真的很难弄清楚哪些算法适合哪些,以及注意事项是什么.我很高兴做到实施,但现在我仍然坚持:
我试图按照相关的文档,在这里:
http://jmsyst.com/libs/serializer/master/configuration
这里
http://jmsyst.com/libs/serializer/master/handlers
这里
http://jmsyst.com /捆绑/ JMSSerializerBundle /主/食谱/ custom_handlers
我试图在symfony2中获取构建器对象时遇到困难(请参阅此对象的第二个链接).该服务是一个已经构建的序列化程序.我应该在哪里实现自己的处理程序?
更新:
我正在调查一个可能的解决方案:
$builder = \JMS\Serializer\SerializerBuilder::create();
或者
$builder = new \JMS\Serializer\SerializerBuilder();
这可能会有效,但让已经实例化的序列化程序使用我的处理程序会很好.要在控制器中获取序列化程序服务:$serializer = $this->get('jms.serializer');
在使用neo4j之后,现在考虑让我自己的实体管理器(对象管理器)处理应用程序中提取的数据,我想知道neo4j的输出格式.
当我运行查询时,它总是作为表格数据返回.为什么是这样??确定的表在数据和处理方面占有很大的位置,但是图形数据库只能以这种格式输出似乎很奇怪.
现在,当我想在我的应用程序中创建一个对象图时,我将不得不对所有对象进行水合,这对性能并不是很好,并且不利用真正的图形性能.
考虑MATCH (A)-->(B) RETURN A, B当有一个A和三个B时,它会返回:
A B
1 1
1 2
1 3
Run Code Online (Sandbox Code Playgroud)
这是相同的A在数据库连接上传递了3次,而我只需要它一次,我在获取数据之前知道这一点.
像这样的东西看起来很棒http://nigelsmall.com/geoff 一个load2neo很不错,一个来自neo的加载也会很好!无论是geoff格式还是其他任何格式https://gephi.org/users/supported-graph-formats/
然后,每种语言都可以实现它自己的函数来直接创建对象.
澄清:
另一个考虑因素(可能值得拥有它自己的帖子),在对象图中建模关系的好方法是什么?作为对象?或者作为节点对象内的数据/方法?
@Kikohs
问:你的意思是"每种语言都可以实现它自己的功能来直接创建对象."?
答:使用由数据库提供的(部分)图形(作为查询的结果),PHP的语言可以提供工厂方法(优选地在C中)来构造对象图(这通常是昂贵的操作).但只有当对象图以标准格式很好地定义时(因为这个函数应该是简单和通用的).
问:您要导出完整图表还是仅导出查询结果?
答:查询的结果.但是,类似的查询MATCH (n) OPTIONAL MATCH (n)-[r]-() RETURN n, r应该返回完整的图形.
问:您想要将查询结果创建的子图转储到磁盘吗?
答:不,像REST这样的现有接口更喜欢获取查询结果.
问:你想创建一个来自内存查询的子图,然后用另一种语言请求吗?
答:不,我希望以另一种格式查询结果然后表格(提到的例子)
问:你创建的查询只返回一个节点的名称,在这种情况下,你想获得整个节点的关联还是只是名字?边缘相同.
答:节点没有名称.他们有财产,标签和关系.我想要足够的信息来检索A)节点ID,它的标签,它的属性和B)与同一结果中的其他节点的关系.
请注意,问题的第一部分不是具体的"操作方法"问题,而是"为什么这不可能?" (或者如果是的话,我希望在这个问题上被证明是错误的).第二个是真正的"操作方法"问题,即"如何建立关系模型".这两个问题的共同点是,他们都试图找到"如何在PHP中有效地获取图形数据"的答案.
@Michael Hunger
当你说并非所有结果数据都可以表示为对象图时,你有一个观点.可以合理地说,表的替代输出格式只是表格格式的补充而不是替换它.
我从你的回答中了解到,数据库中的自然(原始)输出格式是带有重复的结果格式("将数据流出来").在那种情况下,我理解它现在留给替代程序(dev堆栈)来进行映射.所以我对neo4j的结论实现了这样的事情:
Pro's - 不必在每个实现语言(应用程序)中执行此操作
Con - 1)没有特定于应用程序的映射,2)如果实现语言很快就没有性能提升
"即使你使用geoff,graphml或gephi格式,你也必须将所有数据保存在内存中,以便对结果进行重复数据删除."
我完全不明白这一点,你是说这些格式无法保存重复数据删除的结果(在某些情况下)?所以事实上没有可能的文本格式可以用来描述图形而不重复?
"还有关于你想要在输出中包含什么的问题?"
我假设cypher语言足够强大,可以在查询中指定它.因此输出格式将具有数据库可以提供的任何结果.
"你可以只返回你得到的路径,这些路径本身就是独特的路径".
有用的建议,我会玩这个想法:)
"neo4j-shell的dump命令使用将cypher结果拉入内存结构的方法,丰富了它".
富集过程是从数据库中获取其他数据还是已包含在初始结果中的数据?
在阅读了几个wiki和stackoverflow QA后,我留下了如何将GC分配的内存标记/传递区域传递给C库的问题.处理FFI的大多数库似乎首先分配内存,将值复制到其中并将其包装在Ptr类型中.问题是要保证在C库中花费时间时不会移动或取消分配内存.
假设我有一个类型为Text的myInput值,我想用C进行零拷贝FFI.我有什么选择?
到目前为止,我发现了以下内容:
https://wiki.haskell.org/Foreign_Function_Interface#Pointers_to_Haskell_data
在某些情况下,您可能希望为外部代码提供对稍后将检索的Haskell值的不透明引用.您需要确保在提供时间和检索时间之间不收集该值.为了做到这一点,已经创建了稳定的指针.您可以将值包装到StablePtr中并将其提供给外部代码(StablePtr是可编组的外部类型之一).
跟一些人交谈之后.他们告诉我StablePtr不应该被解除引用.并且主要用于传递void*.另一方面,wiki表示它适用于此目的,此答案也表示相同的/sf/answers/763048961/
有关StablePtr的更多信息:
https://www.well-typed.com/blog/2018/05/ghc-special-gc-objects/
在每个GC稳定指针更新后,指向它们在GC之前指向的Haskell对象的新位置
https://hackage.haskell.org/package/base-4.11.1.0/docs/Foreign-StablePtr.html#t:StablePtr
稳定指针是对Haskell表达式的引用,保证不受垃圾收集的影响,即,它既不会被释放,也不会在垃圾收集期间改变稳定指针本身的值(在垃圾收集期间可能会重新定位普通引用) ).因此,稳定的指针可以传递给外部代码,外部代码可以将其视为对Haskell值的不透明引用.
我想我可以用newStablePtr http://hackage.haskell.org/package/base-4.12.0.0/docs/Foreign-StablePtr.html#v:newStablePtr包装我的文本并完成它.我不明白StablePtr目前的情况.如果我可以将它用于此目的.如果不是它实际上用于什么.
然后有固定内存https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/GC/Pinned with ByteString
还有固定的ByteArray http://hackage.haskell.org/package/primitive-0.6.2.0/docs/Data-Primitive-ByteArray.html#g:2
只是ByteString和ByteArray的事情是,IO库通常提供自己的数据结构,并且必须先将数据复制到INTO ByteString/ByteArray中,这是我首先想要避免的.
也许有一些(不安全的)铸造功能?
这似乎是一个简单的问题,因为GC似乎已经能够将部分内存标记为"不移动"(固定).有没有一个函数我可以调用一个结构来切换这个标志?或者这个用例还有其他合适的功能吗?
我阅读了这篇关于scikit. 在OneHotEncoder服用串似乎是一个非常有用的功能。下面我尝试使用这个
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
cols = ['Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
train_df = pd.read_csv('../../data/train.csv', usecols=cols)
test_df = pd.read_csv('../../data/test.csv', usecols=[e for e in cols if e != 'Survived'])
train_df.dropna(inplace=True)
test_df.dropna(inplace=True)
X_train = train_df.drop("Survived", axis=1)
Y_train = train_df["Survived"]
X_test = test_df.copy()
ct = ColumnTransformer([("onehot", OneHotEncoder(sparse=False), ['Sex', 'Embarked'])], remainder='passthrough')
X_train_t = ct.fit_transform(train_df)
X_test_t = ct.fit_transform(test_df)
print(X_train_t[0])
print(X_test_t[0])
# [ 0. …Run Code Online (Sandbox Code Playgroud) 我正在尝试决定是否应该将Categories实现为节点或标签.
特别是获取属于某个类别的节点数的查询并不那么容易.
节点必须能够属于更多类别!
作为标签的类别,变体1
在某处保留类别列表,然后:
MATCH a:cat1, b:cat2, c:cat3, ...
Run Code Online (Sandbox Code Playgroud)
有很多类别我会得到很多专栏......所以这不是很好.还有很多关于查询的预处理.
甚至不确定我是否可以从中轻松获得一个数.
作为标签的类别,变体2
MATCH n:category <-- the category label is used to limit the amount of nodes
RETURN DISTINCT labels(n), count(*) as count
Run Code Online (Sandbox Code Playgroud)
将返回如下内容:
["category","the actual category label"], 2
Run Code Online (Sandbox Code Playgroud)
看起来很完美,但是当节点有多个类别时,这将不起作用
["category","cat1","cat2"], 2 <-- two nodes found with category "cat1" and "cat2"
["category","cat1"], 4 <-- four nodes found with category "cat1"
Run Code Online (Sandbox Code Playgroud)
现在我不知道如何获得每个类别的计数...
也许有extract(..labels()..)或者filter(..labels()..)能够做到这一点,但我不知道如何.
作为节点的类别是的,这是有效的...这是非常直接的转发.但是不是标签假设是分类节点的东西吗?加上我将要创造的所有额外关系......
也许我应该将它实现为标签和节点?
然后使用标签我可以快速获得每个节点的类别.通过节点,我可以获得类别计数.
我仍然在寻找关于这个问题的良好观点,所以我还不能给出具体的实施问题.