Vexed 是一款流行的益智游戏,有许多可用版本(其中一些是 GPL 免费软件)。非常适合小屏幕设备;有适用于 Android、iOS 等的版本。我在 PalmOS 平台上发现了它。
只是为了好玩,我想编写一个可以解决 Vexed 关卡的解算器。
Vexed 是一款方块滑动益智游戏。简而言之,规则如下:
0) 每个级别都是一个正方形网格,由不可逾越的边界界定。在任何关卡中都会有一些实心方块,这是无法通过的。有一些不同颜色的方块;这些可以放置在底部边框上、放置在实心方块上或放置在其他块(不同颜色)上。大多数关卡尺寸为 8x8 或更小。
1)您可以采取的唯一操作是将块向左或向右滑动。每经过一个方块的方格都算作一次移动。
2)有重力。如果在滑动一个块后,它不再停留在实心方块或另一个块上,它就会下落,直到它停留在另一个块、实心方块或底部边框上。请注意,您将无法再次举起它。
3)只要两个或多个相同颜色的块接触,它们就会消失。请注意,链条是可能的:如果支撑块消失,位于其上的块将会掉落,这可能导致更多相同颜色的块接触并因此消失。
4)目标是在最少的移动次数内使所有方块消失。每个级别都有一个“标准分数”,告诉您最少的移动次数。(在最初的 PalmOS 游戏中,“标准分数”不一定是最低的,但在我这些天玩的 Android 版本中,它是最低的。)
以下是 SourceForge 项目,其中包含该游戏 PalmOS 版本的源代码:
http://sourceforge.net/projects/vexed/
我是一名经验丰富的软件开发人员,但我还没有真正做过任何人工智能之类的工作(寻路、解决问题等),所以我正在寻求建议来指引我正确的方向。
目前,我可以看到两个基本策略可供我追求:
0) 只需编写一个强力求解器,可能用 C 语言来提高速度,它会遍历每个游戏的所有可能的解决方案,并返回所有解决方案的列表,首先是最好的解决方案。这是一个合理的方法,还是可能的移动总数会使这个过程太慢?我认为不存在大于 10x10 的关卡。
1)学习一些人工智能算法,并以巧妙的方式应用它们来解决问题,可能使用Python。
请注意,PalmOS Vexed 的源代码包含一个求解器。据作者介绍,“求解器使用 A* 和剪枝启发法来寻找解决方案。”
http://www.scottlu.com/Content/Vexed.html
因此,我可以采取的一种策略是研究 A* 算法,然后研究现有求解器的 C++ 代码,并尝试从中学习。
我将使用 Python 和 C 标签来标记它,但如果您认为我应该使用其他东西,请进行推销,我会考虑它!
这是“Variety 25 Pack”中某个关卡的 ASCII 艺术;48级,“黑暗领主”。我能够解决大多数关卡,但这一关让我很烦恼。这个关卡的标准分数是25步,但我还没有完全解决它!
__________
|## g####|
|## # b##|
|## # p##|
|#g ###|
|bp ###|
|p# p g |
==========
Run Code Online (Sandbox Code Playgroud)
在这张图中,边框是下划线、竖线和等号字符。填充的方块是“#”。开放空间是空格字符。彩色块是“g”(绿色)、“b”(蓝色)和“p”(紫色)。 …
请你帮助优化这个工作的 MiniZinc 代码:
任务:有一个有 6 个时隙的会议。有 3 位演讲者参加了会议,每个人都可以在特定的时段使用。每个扬声器将出现预定数量的插槽。
目标:生成发言者最早完成的时间表。
示例:演讲者 A、B 和 C。演讲时长 = [1, 2, 1]
扬声器可用性:
+---+------+------+------+
| | Sp.A | Sp.B | Sp.C |
+---+------+------+------+
| 1 | | Busy | |
| 2 | Busy | Busy | Busy |
| 3 | Busy | Busy | |
| 4 | | | |
| 5 | | | Busy |
| 6 | Busy | Busy | |
+---+------+------+------+
Run Code Online (Sandbox Code Playgroud)
链接到工作 …
optimization mathematical-optimization solver constraint-programming minizinc
这篇文章在Solve中更新我的问题找到错误的解决方案?
鉴于x中的"简单"功能:
f = (x + 3/10)^(1/2) - (9*(x + 3/10)^5)/5 - (x + 3/10)^6 + (x - 1)/(2*(x + 3/10)^(1/2));
Run Code Online (Sandbox Code Playgroud)
通过电话找到零
solve(f,x)
Run Code Online (Sandbox Code Playgroud)
这产生3个零:
ans =
0.42846617518653978966562924618638
0.15249587894102346284238111155954
0.12068186494007759990714181154349
Run Code Online (Sandbox Code Playgroud)
简单地看一下图表显示第三个根是无意义的:
我有一个严重的问题,因为我需要从上面的向量中检索最小的零.调用min(ans)返回错误的零.我该怎么做才能解决?
河内之塔有没有可能解决一半?我已经进行了广泛的研究,以寻找可以中途解决用户配置的代码,但我还没有找到。这是一个任务,我要求代码从用户停止解决的地方接管并继续为用户解决,而无需将谜题重置为正方形。
我知道有现成的递归算法,但这不是我正在寻找的。我正在寻找可以从用户已经解决的地方接管的算法,然后从那里继续解决。有任何想法吗?
到目前为止,我已经提出了一种算法,将优化的算法(通过递归完成)存储到数组中,然后检查用户的输入是否等于数组中找到的任何输入,然后从那里继续求解. 但是,问题出在优化算法数组中找不到用户的配置时。
到目前为止,以下是我的代码(我已经排除了 stack.py 代码):
def solveHalfway(n, start, end, middle, count):
gameInstance.stackA = [3,2]
gameInstance.stackB = []
gameInstance.stackC = [1]
loopCounter = 0 # initialise loopCounter as 0
moveCounter = 0 # initialise the move index the user is stuck at
indicator = 0 # to indicate whether the user's config equals the solution's config
while loopCounter < arrayOfStacks.size(): # while loopCounter size has not reached the end of arrayOfStacks
if loopCounter != 0 and loopCounter % 3 …
Run Code Online (Sandbox Code Playgroud) 我正在学习 Z3 求解器。我有一个关于数组和相关条件的问题。特别是,我必须创建 Z3py 代码来解决以下 if 条件:
totalAccounts = [ 1, 2, 3, 4, 5 ]
def (myAccounts):
cnt = len(myAccounts)
if (cnt > 10) doSomething()
Run Code Online (Sandbox Code Playgroud)
myAccounts
是一个整数列表,是列表的子集totalAccounts
。通过的条件cnt > 10
取决于列表的长度myAccounts
。
我想我需要表示为 Z3 的数组并使用函数myAccounts
复制其中的值。totalAccounts
Store
MYACCOUNTS = Array ('MYACCOUNTS', IntSort(), IntSort())
I = Int('I')
i = 0
for elem in totalAccounts:
MYACCOUNTS = Store(MYACCOUNTS, i, elem)
i = i + 1
Run Code Online (Sandbox Code Playgroud)
但我不知道如何在创建添加到求解器的条件时表示此类数组的长度:
solver = Solver()
solver.add( ??? > 10 )
Run Code Online (Sandbox Code Playgroud)
我做对了吗?
我是数据挖掘领域的博士候选人,我必须使用 ORtools 创建一个全局约束以用于数据挖掘目的。
问题是互联网上缺乏关于使用 CP-Sat 创建自己的全局约束的文档,我不知道如何开始。
我有一个五阶多项式:
y = ax 5 + bx 4 + cx 3 + dx 2 + ex + f
系数af是已知的,我需要计算给定y的x.我可以使用Newton-Raphson算法或类似算法,但如果可能的话,我更喜欢非迭代解决方案.
编辑:我想在发布我的问题之前我没有想到这一点.我的多项式系数是根据采样数据计算的,在这种特殊情况下只有一个根.当然,在一般情况下,当然可能有五个不同的根源.我想我也会将采样数据拟合为逆多项式,并用它来计算y中的x.
该站点解决了三次方程,并具有它使用的方程
我写了这个函数来获得相同的结果,但它不起作用
void cubicFormula(float a, float b, float c, float d, float *results)
{
float a2 = a*a;
float b2 = b*b;
float b3 = b2*b;
float q = (3*c- b2)/9;
float q2 = q*q;
float q3 = q2*q;
float r = -27*d + b*(9*c-2*b2);
float r2 = r*r;
float discriminant = q3 + r2;
float s = r + sqrtf(discriminant);
float t = r - sqrtf(discriminant);
float term1 = powf((-t + s)/2, 1/3.);
float r13= 2 * …
Run Code Online (Sandbox Code Playgroud) 您可以在以下位置找到Excel中的逻辑回归的手动实现:http://blog.excelmasterseries.com/2014/06/logistic-regression-performed-in-excel.html.
此实现使用下面的数据集并报告以下系数
b0 = 12.48285608
b1 = -0.117031374
b2 = -1.469140055
然而,当我分析相同的数据集glm()
在[R ,结果是不一样的,即:
b0 = 1.687445
b1 = -0.012525
b2 = -0.116473
d <- structure(list(Y = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), X1 = c(78L, 73L, 73L,
71L, 68L, 59L, 57L, 49L, 35L, 27L, 59L, 57L, 44L, 38L, 36L, 36L,
22L, 22L, 15L, 10L), X2 …
Run Code Online (Sandbox Code Playgroud) x <- matrix(rnorm(80, mean = 0, sd = 0.1), 8, 8)
c <- cov(x)
solve(c)
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:
solve.default(c) 中的错误:系统在计算上是奇异的:倒数条件数 = 6.57889e-18
我一直在试图找出问题背后的原因,Stack Overflow 上的其他线程表明该问题可能是由于奇异矩阵、高度相关的变量、线性组合等rnorm
造成的。但是,我认为这会避免提到的问题.
对于我正在使用的另一个矩阵 det() 给出了8.313969e-95
,但它仍然可以与solve()
.
假设我有一个方程,例如
10 * x ** 2 - 7 * x + 3 == 2 * y + y ** 2
我想求解y
,然后绘制从 0 到 1的y
对比图。我如何在 Python 中做到这一点?x
x
我知道如何在 Mathematica 中执行此操作,但我正在迁移到 Python。在 Mathematica 中只有一行
Plot[y /. Solve[10 x^2 - 7 x + 3 == 2 y + y^2, y], {x, 0, 1}]
Run Code Online (Sandbox Code Playgroud) 我想将文本字段添加a01, a02, ...
到数组中a
.我想显示值,val
以便我知道文本是从文本字段中获取的.此代码不显示任何错误,但是,它也不会给我输出.
int i, j;
JTextField[][] a = new JTextField[9][9];
int[][] val = new int[9][9];
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
val[i][j] = Integer.parseInt(a[i][j].getText());
System.out.println(val[i][j]);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在这里提出的问题.
这是我的第一篇文章,所以如果我做错了,我深表歉意。几个月前我开始使用 Python 编写代码,现在已经转向 C#。为了学习回溯,我尝试编写数独求解器。但是,在我的一生中,我无法理解为什么我的代码不起作用。当然,有很多解决方案。我觉得现在对我来说进步的最好方法是了解我的个人代码中缺少什么。所以,如果你有时间:
为什么我的代码不会返回已解决的数独板?我怀疑问题出在递归上。
主要程序:
using System;
namespace Sudoku
{
class Program
{
static void Main(string[] args)
{
var sudokuTemplate = new SudokuTemplate();
var sudoku = sudokuTemplate.CreateSudoku();
Print.print(sudoku);
Console.WriteLine();
Print.print(driver(sudoku));
}
static int[,] driver(int[,] board)
{
var check = new ErrorCheck();
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (board[i,j] == 0)
{
for (int n = 1; n <= 9; n++)
{
if (check.legal(board, i, …
Run Code Online (Sandbox Code Playgroud)