标签: solver

用于解决具有重叠卡的游戏的结构/算法

考虑一下沿着Tower Solitaire,Tripeaks或Fairway Solitaire线路的纸牌游戏:桌子上有一些可立即使用的牌,每张牌都可以覆盖下面的其他牌(阻止他们玩牌).你有一张"基础"牌,你可以从桌子上取出一张牌,如果它只是你的基础牌之上或之下的一个等级,那么它就成了你的新基础牌.当您无法从牌桌上打牌时,您可以使用有限数量的替换牌进行抽牌,因此您通常希望尽可能打出最长的牌.

首先,您如何代表董事会以便寻找解决方案?其次,你会用什么算法来找到最长的可玩序列?

例:

  -4a- -5-
-3-  -2- -4b-

底部卡片卡在顶部被移除:你不能删除4a,直到3和2都消失.假设您的起始牌是王牌,这里的最佳游戏将是2,3,4b,5,4a.(你可以玩2,3,4a,但那不太好.)

我想这应该表示为某种有向图.你有从3和2到4a以及从2到4b到5的边缘,但你是否还有3到2之间以及4a和5之间的边缘,因为一个可以在另一个之后播放?如果是这样,它们是否可以按任意顺序播放(3然后2,或2然后3)这样的事实会在图形中形成一个循环,阻止您使用有效的"最长路径"算法?(我相信如果图形包含循环,在图形中找到最长的路径是NP完全的.)

algorithm graph solver

7
推荐指数
1
解决办法
3733
查看次数

DFID(Dept-First Iterative Deeping)与IDA*(Iterative-Deeping A*)

我想知道这两种算法的优点和缺点是什么.我想写AddEmUp C++解决了,但我不确定应该使用哪种(IDA或DFID)算法.

我找到的最好的文章就是这篇文章,但看起来太旧了 - '93.有没有新的?

我认为IDA*会更好,但是......?还有其他想法吗?

任何想法和信息都会有所帮助.

谢谢 !(:

编辑:关于IDA*的一些好文章和算法的良好解释?

EDIT2:或者那个游戏有一些很好的启发式功能?我不知道如何想到一些:/

c++ algorithm artificial-intelligence solver

7
推荐指数
1
解决办法
2276
查看次数

数独解决方法

我的数独求解方法存在问题.该计划的工作方式如下; 当电路板启动时,它是空的,用户在电路板上添加了几个数字,然后点击一个Solve按钮,程序试图解决它.如果我将相同的数字放在同一行中,一切正常.因此,如果用户添加1,1,0,0 ... 0.在拼图中它无法解决它,因为它的两个1彼此相邻并且将继续尝试找到一个沉闷,即使它是无法解决的难题.但是,如果它们都是0(空),它将立即解决它,就像Id在左上角放置1和2一样.如果我只是在其中放入一些随机数将检测到它无法解决(或者如果它是一个有效的谜题将解决它)

我正在考虑说什么theNumber == (row, col) equals thenNumber == (row+1, col),它应该return false是因为它是一个重复的数字.

这是我试图在solve方法中添加的代码,显然没有成功.

if ((puzzle.getNum(row, col) == a) == (puzzle.getNum(row + 1, col) == a)) {
   return false;
}
Run Code Online (Sandbox Code Playgroud)

非常感谢帮助

java recursion solver sudoku backtracking

7
推荐指数
1
解决办法
1093
查看次数

Lights Out - 寻找最坏的初始状态

我有一个围绕一个名为Lights Out的小游戏的任务。


游戏

游戏由一个尺寸为 3x3 的棋盘组成,其中每个单元格可以是 1 或 0,例如:

0 1 0
1 1 0
0 0 0
Run Code Online (Sandbox Code Playgroud)

当所有单元格都为 1 时,游戏就被解决了,所以:

1 1 1
1 1 1
1 1 1
Run Code Online (Sandbox Code Playgroud)

并且在每一轮中,用户都可以单击任何单元格,这将翻转其状态以及向左、向右、向上和向下(如果存在)的邻居的状态。因此,单击第一个示例板中间的单元格将产生:

0 0 0
0 0 1
0 1 0
Run Code Online (Sandbox Code Playgroud)

任务

现在我必须为游戏找到最糟糕的初始棋盘,并计算出如果玩得最佳,它需要多少回合才能达到已解决状态。


试图

我试图编写一个递归求解器,在给定初始棋盘的情况下,它会找到解决游戏的最佳回合顺序。在那之后,我想用所有可能的初始板来喂养它。

但是,递归遇到堆栈溢出。所以我可能不得不以迭代的方式重写它。我怎样才能做到这一点?

这是代码,作为最小的完整示例:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.StringJoiner;
import java.util.stream.Collectors;
 
public class GameTest {
    public static void main(String[] args) {
        boolean[][] board = {
            {false, false, false},
            {false, true, false}, …
Run Code Online (Sandbox Code Playgroud)

java algorithm solver

7
推荐指数
1
解决办法
286
查看次数

Java的QP求解器

我正在寻找一个易于使用的基于Java的二次规划(QP)求解器.

谷歌搜索我遇到了ojAlgo(http://ojalgo.org).

但是,我想知道是否还有其他/更好的选择.

java numerical mathematical-optimization quadratic solver

6
推荐指数
1
解决办法
6419
查看次数

Python:替代 python 中的 brentq 和 fsolve,查找给定函数的所有零

是否有一个模块可以找到函数的所有零,而不是它在指定起点之外遇到的第一个零?

使用brentq,我们将指定函数更改符号的位置,并且仅选取该位置,除非使用了这次n。类似地,对于fsolve,我们选择一个起点,然后它找到该点之后的第一个零,并且我们必须再次这样做n。当然,我怎样才能n在一个呼叫中找到所有位置。n < infinity

我想到的函数是 3 个零,如下所示:

import numpy as np
import pylab
from scipy.optimize import brentq

mm = 7.3477e22  #  mass moon                                                        
me = 5.9736e24  #  mass Earth                                                       
r12 = 384400.0  #  distance between the Earth and the moon                          
pi2 = mm / (me + mm)


def f(xi):
    return ((1.0 - pi2) / np.absolute(xi - pi2) ** 3.0 * (xi + pi2) +
            pi2 / np.absolute(xi + pi2 …
Run Code Online (Sandbox Code Playgroud)

python optimization solver

6
推荐指数
0
解决办法
887
查看次数

熄灯游戏版本的可解性

我正在尝试为游戏算法创建可解函数。基本上是一个函数,如果给定的游戏可解或不可解,则返回 true 或 false。

该游戏是一种熄灯游戏。基本上你有一个 M*N 的按钮网格。当游戏开始时,这些灯的随机数字或存储模式被打开。按下任何一个灯都会切换一个由四个按钮组成的正方形,包括按下的按钮。

所以我正在寻找一种算法,如果我们可以关闭所有灯,则返回 true;如果我们不能这样做,则返回 false。

algorithm solver

6
推荐指数
1
解决办法
4310
查看次数

Modelica事件和混合建模

我想从数字的角度理解混合建模(特别是状态事件)背后的一般思路(虽然我不是数学家:)).鉴于以下Modelica模型:

model BouncingBall
    constant Real g=9.81 
    Real h(start=1);
    Real v(start=0);
equation
    der(h)=v;
    der(v)=-g;
algorithm
    when h < 0 then
         reinit(v,-pre(v));
    end when;

end BouncingBall;
Run Code Online (Sandbox Code Playgroud)

我理解的概念whenreinit.

  1. when声明中的等式仅在条件成立时才有效吗?
  2. 让我们假设球会完全击中地板2sec.由于我使用多步求解器,这意味着求解器"超过2秒",识别出h<0(假设在模拟time = 2.5sech = -0.7).这是什么意思"使用交叉函数搜索事件的时间?是否有简单的解释(示例)?
  3. 解算器现在要回去了吗?采取较小的步长?
  4. pre()在这种情况下,操作意味着什么?
  5. noEvent():"表达式是字面意义而不是生成交叉函数.由于没有交叉函数,因此没有要求表达式可以在事件限制之外进行评估":这是什么意思?给出与弹跳球相同的例子:求解器在时间2.5检测到h = 0.7.有没有区别noEvent()

solver numerical-integration ode modelica openmodelica

6
推荐指数
1
解决办法
170
查看次数

CVXPY 中的初始猜测/热启动:给出解决方案的提示

在这段代码中:

import cvxpy as cvx

# Examples: linear programming
# Create two scalar optimization variables.
x = cvx.Variable()
y = cvx.Variable()

# Create 4 constraints.
constraints = [x >= 0,
               y >= 0,
               x + y >= 1,
              2*x + y >= 1]

# Form objective.
obj = cvx.Minimize(x+y)

# Form and solve problem.
prob = cvx.Problem(obj, constraints)
prob.solve(warm_start= True)  # Returns the optimal value.
print ("status:", prob.status)
print ("optimal value", prob.value)
print ("optimal var", x.value, y.value)
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方式来选择温暖的起始值自己(例如:X …

python optimization solver cvxpy

6
推荐指数
2
解决办法
2971
查看次数

使用 Sympy 用总和和索引求解方程

在尝试了很多事情之后,我认为询问 SO 会很好。我的问题很简单:如何使用 Sympy 求解以下方程?

方程

我想为 lambda_0 解决这个问题,它q是一个大小数组,J包含 0 和 1 之间的元素,这些元素的总和为 1(离散概率分布)。我尝试了以下方法:

from sympy.solvers import solve
from sympy import symbols, summation

p = [0.2, 0.3, 0.3, 0.1, 0.1]
l = symbols('l')
j = symbols('j')
eq= summation(j*q[j]/(l-j), (j, 0, 4))

s= solve(eq, l)
Run Code Online (Sandbox Code Playgroud)

但这给了我一个错误,q[j]因为这里j是一个Symbol对象而不是整数。如果我不j作为符号,我将无法评估eq表达式。有谁知道如何做到这一点?

编辑: p = 1-q在上面,因此q[j]应该被替换为(1-p[j]).

python equation solver sympy

6
推荐指数
1
解决办法
160
查看次数